Previous 15994 Revisions Next

r9930 Wednesday 5th January, 2011 at 16:38:16 UTC by Curt Coder
[ACE] Renamed jupiter to ace to avoid naming conflict with Wave Mate. Added support for BoldField Joystick interface AC5 and EME Soundbox AC4. Cleaned up and modernized driver.
[docs]messnew.txt
[src/emu/drivers]xtal.h
[src/mess]mess.mak messdriv.c
[src/mess/drivers]ace.c* jupiter.c
[src/mess/formats]ace_tap.c* ace_tap.h* jupi_tap.c jupi_tap.h
[src/mess/includes]ace.h* jupiter.h
[src/mess/machine]ace.c*

src/emu/drivers/xtal.h
r9929r9930
6767   XTAL_5_7143MHz      = 5714300,      /* Cidelsa Destroyer */
6868   XTAL_5_9904MHz      = 5990400,      /* Luxor ABC 800 keyboard */
6969   XTAL_6MHz         = 6000000,      /* American Poker II */
70   XTAL_6_5MHz         = 6500000,      /* Jupiter Ace */
7071   XTAL_6_144MHz      = 6144000,      /* Used on Alpha Denshi early 80's games sound board */
7172   XTAL_7MHz         = 7000000,      /* Jaleco Mega System PCBs */
7273   XTAL_7_15909MHz    = 7159090,      /* Blood Bros */
src/mess/machine/ace.c
r0r9930
1/***************************************************************************
2
3  machine.c
4
5  Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
6  I/O ports)
7
8***************************************************************************/
9
10#include "emu.h"
11#include "cpu/z80/z80.h"
12#include "machine/ram.h"
13#include "imagedev/snapquik.h"
14#include "includes/ace.h"
15
16
17
18/* Load in .ace files. These are memory images of 0x2000 to 0x7fff
19   and compressed as follows:
20
21   ED 00        : End marker
22   ED <cnt> <byt>   : repeat <byt> count <cnt:1-240> times
23   <byt>        : <byt>
24*/
25
26
27/******************************************************************************
28 Snapshot Handling
29******************************************************************************/
30
31SNAPSHOT_LOAD(ace)
32{
33   UINT8 *RAM = image.device().machine->region(Z80_TAG)->base();
34   device_t *cpu = image.device().machine->device(Z80_TAG);
35   address_space *space = cputag_get_address_space(image.device().machine, Z80_TAG, ADDRESS_SPACE_PROGRAM);
36   unsigned char ace_repeat, ace_byte, loop;
37   int done=0, ace_index=0x2000;
38
39   if (ram_get_size(image.device().machine->device("messram")) < 16*1024)
40   {
41      image.seterror(IMAGE_ERROR_INVALIDIMAGE, "At least 16KB RAM expansion required");
42      image.message("At least 16KB RAM expansion required");
43      return IMAGE_INIT_FAIL;
44   }
45
46   logerror("Loading file %s.\r\n", image.filename());
47   while (!done && (ace_index < 0x8001))
48   {
49      image.fread( &ace_byte, 1);
50      if (ace_byte == 0xed)
51      {
52         image.fread(&ace_byte, 1);
53         switch (ace_byte)
54         {
55         case 0x00:
56               logerror("File loaded!\r\n");
57               done = 1;
58               break;
59         case 0x01:
60               image.fread(&ace_byte, 1);
61               RAM[ace_index++] = ace_byte;
62               break;
63         default:
64               image.fread(&ace_repeat, 1);
65               for (loop = 0; loop < ace_byte; loop++)
66                  RAM[ace_index++] = ace_repeat;
67               break;
68         }
69      }
70      else
71         RAM[ace_index++] = ace_byte;
72   }
73
74   logerror("Decoded %X bytes.\r\n", ace_index-0x2000);
75
76   if (!done)
77   {
78      image.seterror(IMAGE_ERROR_INVALIDIMAGE, "EOF marker not found");
79      image.message("EOF marker not found");
80      return IMAGE_INIT_FAIL;
81   }
82
83        // patch CPU registers
84        // Some games do not follow the standard, and have rubbish in the CPU area. So,
85        // we check that some other bytes are correct.
86        // 2080 = memory size of original machine, should be 0000 or 8000 or C000.
87        // 2118 = new stack pointer, do not use if between 8000 and FF00.
88
89   ace_index = RAM[0x2080] | (RAM[0x2081] << 8);
90
91   if ((ace_index & 0x3FFF)==0)
92   {
93      cpu_set_reg(cpu, Z80_AF, RAM[0x2100] | (RAM[0x2101] << 8));
94      cpu_set_reg(cpu, Z80_BC, RAM[0x2104] | (RAM[0x2105] << 8));
95      cpu_set_reg(cpu, Z80_DE, RAM[0x2108] | (RAM[0x2109] << 8));
96      cpu_set_reg(cpu, Z80_HL, RAM[0x210c] | (RAM[0x210d] << 8));
97      cpu_set_reg(cpu, Z80_IX, RAM[0x2110] | (RAM[0x2111] << 8));
98      cpu_set_reg(cpu, Z80_IY, RAM[0x2114] | (RAM[0x2115] << 8));
99      cpu_set_reg(cpu, STATE_GENPC, RAM[0x211c] | (RAM[0x211d] << 8));
100      cpu_set_reg(cpu, Z80_AF2, RAM[0x2120] | (RAM[0x2121] << 8));
101      cpu_set_reg(cpu, Z80_BC2, RAM[0x2124] | (RAM[0x2125] << 8));
102      cpu_set_reg(cpu, Z80_DE2, RAM[0x2128] | (RAM[0x2129] << 8));
103      cpu_set_reg(cpu, Z80_HL2, RAM[0x212c] | (RAM[0x212d] << 8));
104      cpu_set_reg(cpu, Z80_IM, RAM[0x2130]);
105      cpu_set_reg(cpu, Z80_IFF1, RAM[0x2134]);
106      cpu_set_reg(cpu, Z80_IFF2, RAM[0x2138]);
107      cpu_set_reg(cpu, Z80_I, RAM[0x213c]);
108      cpu_set_reg(cpu, Z80_R, RAM[0x2140]);
109
110      if ((RAM[0x2119] < 0x80) || !ace_index)
111         cpu_set_reg(cpu, STATE_GENSP, RAM[0x2118] | (RAM[0x2119] << 8));
112   }
113
114   /* Copy data to the address space */
115   for (ace_index = 0x2000; ace_index < 0x8000; ace_index++)
116      space->write_byte(ace_index, RAM[ace_index]);
117
118   return IMAGE_INIT_PASS;
119}
src/mess/includes/ace.h
r0r9930
1/*****************************************************************************
2 *
3 * includes/ace.h
4 *
5 ****************************************************************************/
6
7#ifndef ACE_H_
8#define ACE_H_
9
10#define Z80_TAG         "z0"
11#define AY8910_TAG      "ay8910"
12#define SPEAKER_TAG      "speaker"
13#define CASSETTE_TAG   "cassette"
14#define SCREEN_TAG      "screen"
15
16class ace_state : public driver_device
17{
18public:
19   ace_state(running_machine &machine, const driver_device_config_base &config)
20      : driver_device(machine, config),
21        m_maincpu(*this, Z80_TAG),
22        m_speaker(*this, SPEAKER_TAG),
23        m_cassette(*this, CASSETTE_TAG),
24        m_ram(*this, "messram")
25    { }
26
27   required_device<cpu_device> m_maincpu;
28   required_device<device_t> m_speaker;
29   required_device<device_t> m_cassette;
30   required_device<device_t> m_ram;
31
32   virtual void machine_start();
33
34   bool video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect);
35
36   DECLARE_READ8_MEMBER( io_r );
37   DECLARE_WRITE8_MEMBER( io_w );
38
39   UINT8 *m_video_ram;
40   UINT8 *m_char_ram;
41};
42
43
44/*----------- defined in machine/ace.c -----------*/
45
46
47SNAPSHOT_LOAD(ace);
48
49
50/*----------- defined in video/ace.c -----------*/
51
52#endif /* ACE_H_ */
src/mess/includes/jupiter.h
r9929r9930
1/*****************************************************************************
2 *
3 * includes/jupiter.h
4 *
5 ****************************************************************************/
1#pragma once
62
7#ifndef JUPITER_H_
8#define JUPITER_H_
3#ifndef __JUPITER__
4#define __JUPITER__
95
10typedef struct
11{
12   UINT8 hdr_type;
13   UINT8 hdr_name[10];
14   UINT16 hdr_len;
15   UINT16 hdr_addr;
16   UINT8 hdr_vars[8];
17   UINT8 hdr_3c4c;
18   UINT8 hdr_3c4d;
19   UINT16 dat_len;
20} jupiter_tape_t;
6#define MCM6571AP_TAG   "vid125_6c"
7#define S6820_TAG      "vid125_4a"
8#define Z80_TAG         "cpu126_4c"
9#define INS1771N1_TAG   "fdi027_4c"
10#define MC6820P_TAG      "fdi027_4b"
11#define MC6850P_TAG      "rsi068_6a"
12#define MC6821P_TAG      "sdm058_4b"
13#define TERMINAL_TAG   "terminal"
2114
22
23class jupiter_state : public driver_device
15class jupiter2_state : public driver_device
2416{
2517public:
26   jupiter_state(running_machine &machine, const driver_device_config_base &config)
27      : driver_device(machine, config) { }
18   jupiter2_state(running_machine &machine, const driver_device_config_base &config)
19      : driver_device(machine, config),
20        m_maincpu(*this, MCM6571AP_TAG)
21   { }
2822
29   UINT8 *videoram;
30   emu_timer *set_irq_timer;
31   emu_timer *clear_irq_timer;
32   UINT8 *charram;
33   UINT8 *expram;
34   jupiter_tape_t tape;
23   required_device<cpu_device> m_maincpu;
24
25   virtual void machine_start();
3526};
3627
28class jupiter3_state : public driver_device
29{
30public:
31   jupiter3_state(running_machine &machine, const driver_device_config_base &config)
32      : driver_device(machine, config),
33        m_maincpu(*this, Z80_TAG)
34   { }
3735
38/*----------- defined in machine/jupiter.c -----------*/
36   required_device<cpu_device> m_maincpu;
3937
38   virtual void machine_start();
39};
4040
41SNAPSHOT_LOAD(jupiter);
42
43
44/*----------- defined in video/jupiter.c -----------*/
45
46#endif /* JUPITER_H_ */
41#endif
src/mess/formats/jupi_tap.c
r9929r9930
1/********************************************************************
2
3Support for Jupiter Ace .tap cassette images
4
5For more information see:
6- http://www.jupiter-ace.co.uk/faq_ace_tap_format.html
7- http://www.jupiter-ace.co.uk/doc_AceTapeFormat.html
8
9********************************************************************/
10#include "jupi_tap.h"
11
12
13#define SMPLO   -32768
14#define SILENCE   0
15#define SMPHI   32767
16
17
18static int cas_size;
19
20
21/*******************************************************************
22   Generate one high-low cycle of sample data
23********************************************************************/
24INLINE int jupiter_tap_cycle(INT16 *buffer, int sample_pos, int high, int low)
25{
26   int i = 0;
27
28   if ( buffer )
29   {
30      while( i < high)
31      {
32         buffer[ sample_pos + i ] = SMPHI;
33         i++;
34      }
35
36      while( i < high + low )
37      {
38         buffer[ sample_pos + i ] = SMPLO;
39         i++;
40      }
41   }
42   return high + low;
43}
44
45
46INLINE int jupiter_tap_silence(INT16 *buffer, int sample_pos, int samples)
47{
48   int i = 0;
49
50   if ( buffer )
51   {
52      while( i < samples )
53      {
54         buffer[ sample_pos + i ] = SILENCE;
55         i++;
56      }
57   }
58   return samples;
59}
60
61
62INLINE int jupiter_tap_byte(INT16 *buffer, int sample_pos, UINT8 data)
63{
64   int i, samples;
65
66   samples = 0;
67   for ( i = 0; i < 8; i++ )
68   {
69      if ( data & 0x80 )
70         samples += jupiter_tap_cycle( buffer, sample_pos + samples, 21, 22 );
71      else
72         samples += jupiter_tap_cycle( buffer, sample_pos + samples, 10, 11 );
73
74      data <<= 1;
75   }
76   return samples;
77}
78
79
80static int jupiter_handle_tap(INT16 *buffer, const UINT8 *casdata)
81{
82   int   data_pos, sample_count;
83
84   /* Make sure the file starts with a valid header */
85   if ( cas_size < 0x1C )
86      return -1;
87   if ( casdata[0] != 0x1A || casdata[1] != 0x00 )
88      return -1;
89
90   data_pos = 0;
91   sample_count = 0;
92
93   while( data_pos < cas_size )
94   {
95      UINT16   block_size;
96      int      i;
97
98      /* Handle a block of tape data */
99      block_size = casdata[data_pos] + ( casdata[data_pos + 1] << 8 );
100      data_pos += 2;
101
102      /* Make sure there are enough bytes left */
103      if ( data_pos > cas_size )
104         return -1;
105
106      /* 2 seconds silence */
107      sample_count += jupiter_tap_silence( buffer, sample_count, 2 * 44100 );
108
109      /* Add pilot tone samples: 4096 for header, 512 for data */
110      for( i = ( block_size == 0x001A ) ? 4096 : 512; i; i-- )
111         sample_count += jupiter_tap_cycle( buffer, sample_count, 27, 27 );
112
113      /* Sync samples */
114      sample_count += jupiter_tap_cycle( buffer, sample_count, 8, 11 );
115
116      /* Output block type identification byte */
117      sample_count += jupiter_tap_byte( buffer, sample_count, ( block_size != 0x001A ) ? 0xFF : 0x00 );
118
119      /* Data samples */
120      for ( ; block_size ; data_pos++, block_size-- )
121         sample_count += jupiter_tap_byte( buffer, sample_count, casdata[data_pos] );
122
123      /* End mark samples */
124      sample_count += jupiter_tap_cycle( buffer, sample_count, 12, 57 );
125
126      /* 3 seconds silence */
127      sample_count += jupiter_tap_silence( buffer, sample_count, 3 * 44100 );
128   }
129   return sample_count;
130}
131
132
133/*******************************************************************
134   Generate samples for the tape image
135********************************************************************/
136static int jupiter_tap_fill_wave(INT16 *buffer, int sample_count, UINT8 *bytes)
137{
138   return jupiter_handle_tap( buffer, bytes );
139}
140
141
142/*******************************************************************
143   Calculate the number of samples needed for this tape image
144********************************************************************/
145static int jupiter_tap_to_wav_size(const UINT8 *casdata, int caslen)
146{
147   cas_size = caslen;
148
149   return jupiter_handle_tap( NULL, casdata );
150}
151
152
153static const struct CassetteLegacyWaveFiller jupiter_legacy_fill_wave =
154{
155   jupiter_tap_fill_wave,               /* fill_wave */
156   -1,                              /* chunk_size */
157   0,                              /* chunk_samples */
158   jupiter_tap_to_wav_size,            /* chunk_sample_calc */
159   44100,                           /* sample_frequency */
160   0,                              /* header_samples */
161   0                              /* trailer_samples */
162};
163
164
165static casserr_t jupiter_tap_identify(cassette_image *cassette, struct CassetteOptions *opts)
166{
167   return cassette_legacy_identify(cassette, opts, &jupiter_legacy_fill_wave);
168}
169
170
171static casserr_t jupiter_tap_load(cassette_image *cassette)
172{
173   return cassette_legacy_construct(cassette, &jupiter_legacy_fill_wave);
174}
175
176
177static const struct CassetteFormat jupiter_tap_format =
178{
179   "tap",
180   jupiter_tap_identify,
181   jupiter_tap_load,
182   NULL
183};
184
185
186CASSETTE_FORMATLIST_START(jupiter_cassette_formats)
187   CASSETTE_FORMAT(jupiter_tap_format)
188CASSETTE_FORMATLIST_END
src/mess/formats/jupi_tap.h
r9929r9930
1/*********************************************************************
2
3    jupi_tap.h
4
5    Format code for Jupiter Ace casette files
6
7*********************************************************************/
8
9#ifndef JUPI_TAP_H
10#define JUPI_TAP_H
11
12#include "imagedev/cassimg.h"
13
14CASSETTE_FORMATLIST_EXTERN(jupiter_cassette_formats);
15
16#endif /* JUPI_TAP_H */
17
src/mess/formats/ace_tap.c
r0r9930
1/********************************************************************
2
3Support for Jupiter Ace .tap cassette images
4
5For more information see:
6- http://www.jupiter-ace.co.uk/faq_ace_tap_format.html
7- http://www.jupiter-ace.co.uk/doc_AceTapeFormat.html
8
9********************************************************************/
10#include "ace_tap.h"
11
12
13#define SMPLO   -32768
14#define SILENCE   0
15#define SMPHI   32767
16
17
18static int cas_size;
19
20
21/*******************************************************************
22   Generate one high-low cycle of sample data
23********************************************************************/
24INLINE int ace_tap_cycle(INT16 *buffer, int sample_pos, int high, int low)
25{
26   int i = 0;
27
28   if ( buffer )
29   {
30      while( i < high)
31      {
32         buffer[ sample_pos + i ] = SMPHI;
33         i++;
34      }
35
36      while( i < high + low )
37      {
38         buffer[ sample_pos + i ] = SMPLO;
39         i++;
40      }
41   }
42   return high + low;
43}
44
45
46INLINE int ace_tap_silence(INT16 *buffer, int sample_pos, int samples)
47{
48   int i = 0;
49
50   if ( buffer )
51   {
52      while( i < samples )
53      {
54         buffer[ sample_pos + i ] = SILENCE;
55         i++;
56      }
57   }
58   return samples;
59}
60
61
62INLINE int ace_tap_byte(INT16 *buffer, int sample_pos, UINT8 data)
63{
64   int i, samples;
65
66   samples = 0;
67   for ( i = 0; i < 8; i++ )
68   {
69      if ( data & 0x80 )
70         samples += ace_tap_cycle( buffer, sample_pos + samples, 21, 22 );
71      else
72         samples += ace_tap_cycle( buffer, sample_pos + samples, 10, 11 );
73
74      data <<= 1;
75   }
76   return samples;
77}
78
79
80static int ace_handle_tap(INT16 *buffer, const UINT8 *casdata)
81{
82   int   data_pos, sample_count;
83
84   /* Make sure the file starts with a valid header */
85   if ( cas_size < 0x1C )
86      return -1;
87   if ( casdata[0] != 0x1A || casdata[1] != 0x00 )
88      return -1;
89
90   data_pos = 0;
91   sample_count = 0;
92
93   while( data_pos < cas_size )
94   {
95      UINT16   block_size;
96      int      i;
97
98      /* Handle a block of tape data */
99      block_size = casdata[data_pos] + ( casdata[data_pos + 1] << 8 );
100      data_pos += 2;
101
102      /* Make sure there are enough bytes left */
103      if ( data_pos > cas_size )
104         return -1;
105
106      /* 2 seconds silence */
107      sample_count += ace_tap_silence( buffer, sample_count, 2 * 44100 );
108
109      /* Add pilot tone samples: 4096 for header, 512 for data */
110      for( i = ( block_size == 0x001A ) ? 4096 : 512; i; i-- )
111         sample_count += ace_tap_cycle( buffer, sample_count, 27, 27 );
112
113      /* Sync samples */
114      sample_count += ace_tap_cycle( buffer, sample_count, 8, 11 );
115
116      /* Output block type identification byte */
117      sample_count += ace_tap_byte( buffer, sample_count, ( block_size != 0x001A ) ? 0xFF : 0x00 );
118
119      /* Data samples */
120      for ( ; block_size ; data_pos++, block_size-- )
121         sample_count += ace_tap_byte( buffer, sample_count, casdata[data_pos] );
122
123      /* End mark samples */
124      sample_count += ace_tap_cycle( buffer, sample_count, 12, 57 );
125
126      /* 3 seconds silence */
127      sample_count += ace_tap_silence( buffer, sample_count, 3 * 44100 );
128   }
129   return sample_count;
130}
131
132
133/*******************************************************************
134   Generate samples for the tape image
135********************************************************************/
136static int ace_tap_fill_wave(INT16 *buffer, int sample_count, UINT8 *bytes)
137{
138   return ace_handle_tap( buffer, bytes );
139}
140
141
142/*******************************************************************
143   Calculate the number of samples needed for this tape image
144********************************************************************/
145static int ace_tap_to_wav_size(const UINT8 *casdata, int caslen)
146{
147   cas_size = caslen;
148
149   return ace_handle_tap( NULL, casdata );
150}
151
152
153static const struct CassetteLegacyWaveFiller ace_legacy_fill_wave =
154{
155   ace_tap_fill_wave,               /* fill_wave */
156   -1,                              /* chunk_size */
157   0,                              /* chunk_samples */
158   ace_tap_to_wav_size,            /* chunk_sample_calc */
159   44100,                           /* sample_frequency */
160   0,                              /* header_samples */
161   0                              /* trailer_samples */
162};
163
164
165static casserr_t ace_tap_identify(cassette_image *cassette, struct CassetteOptions *opts)
166{
167   return cassette_legacy_identify(cassette, opts, &ace_legacy_fill_wave);
168}
169
170
171static casserr_t ace_tap_load(cassette_image *cassette)
172{
173   return cassette_legacy_construct(cassette, &ace_legacy_fill_wave);
174}
175
176
177static const struct CassetteFormat ace_tap_format =
178{
179   "tap",
180   ace_tap_identify,
181   ace_tap_load,
182   NULL
183};
184
185
186CASSETTE_FORMATLIST_START(ace_cassette_formats)
187   CASSETTE_FORMAT(ace_tap_format)
188CASSETTE_FORMATLIST_END
src/mess/formats/ace_tap.h
r0r9930
1/*********************************************************************
2
3    ace_tap.h
4
5    Format code for Jupiter Ace casette files
6
7*********************************************************************/
8
9#ifndef ACE_TAP_H
10#define ACE_TAP_H
11
12#include "imagedev/cassimg.h"
13
14typedef struct
15{
16   UINT8 hdr_type;
17   UINT8 hdr_name[10];
18   UINT16 hdr_len;
19   UINT16 hdr_addr;
20   UINT8 hdr_vars[8];
21   UINT8 hdr_3c4c;
22   UINT8 hdr_3c4d;
23   UINT16 dat_len;
24} ace_tape_t;
25
26CASSETTE_FORMATLIST_EXTERN(ace_cassette_formats);
27
28#endif /* ACE_TAP_H */
29
src/mess/messdriv.c
r9929r9930
861861   DRIVER( pc9821a )
862862
863863   /* Cantab */
864   DRIVER( jupiter )   /* Jupiter Ace    */
864   DRIVER( ace )   /* Jupiter Ace    */
865865
866866   /* Sord */
867867   DRIVER( sordm5 )
r9929r9930
18371837   DRIVER( okean240 )
18381838   DRIVER( vixen )
18391839   DRIVER( pt68k4 )
1840   DRIVER( jupiter2 )
1841   DRIVER( jupiter3 )
18401842   
18411843#endif /* DRIVER_RECURSIVE */
src/mess/mess.mak
r9929r9930
410410   $(MESSOBJ)/visual.a \
411411   $(MESSOBJ)/votrax.a \
412412   $(MESSOBJ)/vtech.a \
413   $(MESSOBJ)/wavemate.a \
413414   $(MESSOBJ)/xerox.a \
414415   $(MESSOBJ)/zvt.a \
415416   $(MESSOBJ)/shared.a \
r9929r9930
10341035   $(MESS_DRIVERS)/intv.o      \
10351036
10361037$(MESSOBJ)/jupiter.a:         \
1037   $(MESS_DRIVERS)/jupiter.o   \
1038   $(MESS_MACHINE)/jupiter.o   \
1039   $(MESS_FORMATS)/jupi_tap.o   \
1038   $(MESS_DRIVERS)/ace.o      \
1039   $(MESS_MACHINE)/ace.o      \
1040   $(MESS_FORMATS)/ace_tap.o   \
10401041
10411042$(MESSOBJ)/kaypro.a:         \
10421043   $(MESS_DRIVERS)/kaypro.o   \
r9929r9930
14001401   $(MESS_FORMATS)/x1_tap.o   \
14011402   $(MESS_DRIVERS)/mz2500.o   \
14021403   $(MESS_DRIVERS)/pce220.o   \
1403
1404
1404   
14051405$(MESSOBJ)/sinclair.a:         \
14061406   $(MESS_VIDEO)/spectrum.o   \
14071407   $(MESS_VIDEO)/timex.o      \
r9929r9930
16741674   $(MESS_DRIVERS)/pc2000.o   \
16751675   $(MESS_DRIVERS)/prestige.o   \
16761676
1677$(MESSOBJ)/wavemate.a:         \
1678   $(MESS_DRIVERS)/bullet.o   \
1679   $(MESS_DRIVERS)/jupiter.o   \
1680
16771681$(MESSOBJ)/xerox.a:            \
16781682   $(MESS_DRIVERS)/xerox820.o   \
16791683
r9929r9930
16871691   $(MESS_DRIVERS)/amico2k.o   \
16881692   $(MESS_DRIVERS)/beehive.o   \
16891693   $(MESS_DRIVERS)/bob85.o      \
1690   $(MESS_DRIVERS)/bullet.o   \
16911694   $(MESS_DRIVERS)/busicom.o   \
16921695   $(MESS_VIDEO)/busicom.o      \
16931696   $(MESS_DRIVERS)/c10.o      \
src/mess/drivers/ace.c
r0r9930
1/***************************************************************************
2Jupiter Ace memory map
3
4    CPU: Z80
5        0000-1fff ROM
6        2000-23ff Mirror of 2400-27FF
7        2400-27ff RAM (1K RAM used for screen and edit/cassette buffer)
8        2800-2bff Mirror of 2C00-2FFF
9        2c00-2fff RAM (1K RAM for char set, write only)
10        3000-3bff Mirror of 3C00-3FFF
11        3c00-3fff RAM (1K RAM standard)
12        4000-7fff RAM (16K Expansion)
13        8000-ffff RAM (48K Expansion)
14
15Interrupts:
16
17    IRQ:
18        50Hz vertical sync
19
20Ports:
21
22    Out 0xfe:
23        Tape and buzzer
24
25    In 0xfe:
26        Keyboard input, tape, and buzzer
27
28   http://www.jupiter-ace.co.uk/
29
30***************************************************************************/
31
32/*
33
34   TODO:
35
36   - printer
37   - Big Mouth speech unit (SP0256-AL1)
38   - Deep Thought disc interface (6850, 6821)
39
40*/
41
42#define ADDRESS_MAP_MODERN
43
44#include "emu.h"
45#include "cpu/z80/z80.h"
46#include "imagedev/cassette.h"
47#include "imagedev/snapquik.h"
48#include "machine/ram.h"
49#include "sound/ay8910.h"
50#include "sound/speaker.h"
51#include "sound/wave.h"
52#include "formats/ace_tap.h"
53#include "includes/ace.h"
54
55
56
57//**************************************************************************
58//   READ/WRITE HANDLERS
59//**************************************************************************
60
61//-------------------------------------------------
62//   io_r -
63//-------------------------------------------------
64
65READ8_MEMBER( ace_state::io_r )
66{
67   UINT8 data = 0xff;
68
69   if (!BIT(offset, 8)) data &= input_port_read(machine, "A8");
70   if (!BIT(offset, 9)) data &= input_port_read(machine, "A9");
71   if (!BIT(offset, 10)) data &= input_port_read(machine, "A10");
72   if (!BIT(offset, 11)) data &= input_port_read(machine, "A11");
73   if (!BIT(offset, 12)) data &= input_port_read(machine, "A12");
74   if (!BIT(offset, 13)) data &= input_port_read(machine, "A13");
75   if (!BIT(offset, 14)) data &= input_port_read(machine, "A14");
76   
77   if (!BIT(offset, 15))
78   {
79      data &= input_port_read(machine, "A15");
80
81      cassette_output(m_cassette, -1);
82      speaker_level_w(m_speaker, 0);
83   }
84
85   if (cassette_input(m_cassette) > 0)
86   {
87      data &= ~0x20;
88   }
89
90   return data;
91}
92
93
94//-------------------------------------------------
95//   io_w -
96//-------------------------------------------------
97
98WRITE8_MEMBER( ace_state::io_w )
99{
100   cassette_output(m_cassette, 1);
101   speaker_level_w(m_speaker, 1);
102}
103
104
105
106//**************************************************************************
107//   ADDRESS MAPS
108//**************************************************************************
109
110//-------------------------------------------------
111//  ADDRESS_MAP( ace_mem )
112//-------------------------------------------------
113
114static ADDRESS_MAP_START( ace_mem, ADDRESS_SPACE_PROGRAM, 8, ace_state )
115   AM_RANGE(0x0000, 0x1fff) AM_ROM
116   AM_RANGE(0x2400, 0x27ff) AM_MIRROR(0x0400) AM_RAM AM_BASE(m_video_ram)
117   AM_RANGE(0x2c00, 0x2fff) AM_MIRROR(0x0400) AM_RAM AM_BASE(m_char_ram) AM_REGION(Z80_TAG, 0xfc00)
118   AM_RANGE(0x3c00, 0x3fff) AM_MIRROR(0x0c00) AM_RAM
119   AM_RANGE(0x4000, 0xffff) AM_RAM
120ADDRESS_MAP_END
121
122
123//-------------------------------------------------
124//  ADDRESS_MAP( ace_io )
125//-------------------------------------------------
126
127static ADDRESS_MAP_START( ace_io, ADDRESS_SPACE_IO, 8, ace_state )
128   AM_RANGE(0x00, 0x00) AM_MIRROR(0xfffe) AM_MASK(0xff00) AM_READWRITE(io_r, io_w)
129   AM_RANGE(0x01, 0x01) AM_MIRROR(0xff00) AM_READ_PORT("JOY")
130   AM_RANGE(0xfd, 0xfd) AM_MIRROR(0xff00) AM_DEVWRITE_LEGACY(AY8910_TAG, ay8910_address_w)
131   AM_RANGE(0xff, 0xff) AM_MIRROR(0xff00) AM_DEVREADWRITE_LEGACY(AY8910_TAG, ay8910_r, ay8910_data_w)
132ADDRESS_MAP_END
133
134
135
136//**************************************************************************
137//   INPUT PORTS
138//**************************************************************************
139
140//-------------------------------------------------
141//  INPUT_PORTS( bullet )
142//-------------------------------------------------
143
144static INPUT_PORTS_START (ace)
145   PORT_START("A8")
146   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT)      PORT_CHAR(UCHAR_SHIFT_1)
147   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Symbol Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_2)
148   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z)         PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(':')
149   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X)         PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR('\xA3')
150   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C)         PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR('?')
151   PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
152
153   PORT_START("A9")
154   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)         PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR('~')
155   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S)         PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR('|')
156   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D)         PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR('\\')
157   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F)         PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR('{')
158   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G)         PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR('}')
159   PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
160
161   PORT_START("A10")
162   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)         PORT_CHAR('q') PORT_CHAR('Q')
163   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W)         PORT_CHAR('w') PORT_CHAR('W')
164   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E)         PORT_CHAR('e') PORT_CHAR('E')
165   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R)         PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR('<')
166   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T)         PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR('>')
167   PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
168
169   PORT_START("A11")
170   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1)         PORT_CHAR('1') PORT_CHAR('!')
171   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2)         PORT_CHAR('2') PORT_CHAR('@')
172   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3)         PORT_CHAR('3') PORT_CHAR('#')
173   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4)         PORT_CHAR('4') PORT_CHAR('$')
174   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_LEFT) PORT_CHAR('5') PORT_CHAR('%')
175   PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
176
177   PORT_START("A12")
178   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0)         PORT_CHAR('0') PORT_CHAR('_')
179   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9)         PORT_CHAR('9') PORT_CHAR(')')
180   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR('8') PORT_CHAR('(')
181   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('7') PORT_CHAR('\'')
182   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_UP)   PORT_CHAR('6') PORT_CHAR('&')
183   PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
184
185   PORT_START("A13")
186   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)         PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR('"')
187   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O)         PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(';')
188   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I)         PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x00A9)
189   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U)         PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(']')
190   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y)         PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR('[')
191   PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
192
193   PORT_START("A14")
194   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER)      PORT_CHAR(13)
195   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)         PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR('=')
196   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K)         PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR('+')
197   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J)         PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR('-')
198   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("h  H  \xE2\x86\x91") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
199   PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
200
201   PORT_START("A15")
202   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE)      PORT_CHAR(' ')
203   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M)         PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR('.')
204   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N)         PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(',')
205   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B)         PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR('*')
206   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V)         PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR('/')
207   PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
208   
209   PORT_START("JOY")
210   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
211   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
212   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
213   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
214   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
215   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 )
216   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
217   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
218INPUT_PORTS_END
219
220
221
222//**************************************************************************
223//   VIDEO
224//**************************************************************************
225
226//-------------------------------------------------
227//  gfx_layout ace_charlayout
228//-------------------------------------------------
229
230static const gfx_layout ace_charlayout =
231{
232   8, 8,   /* 8x8 characters */
233   128,   /* 128 characters */
234   1,      /* 1 bits per pixel */
235   {0},   /* no bitplanes; 1 bit per pixel */
236   {0, 1, 2, 3, 4, 5, 6, 7},
237   {0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8},
238   8*8    /* each character takes 8 consecutive bytes */
239};
240
241
242//-------------------------------------------------
243//  GFXDECODE( ace )
244//-------------------------------------------------
245
246static GFXDECODE_START( ace )
247   GFXDECODE_ENTRY( Z80_TAG, 0xfc00, ace_charlayout, 0, 1 )
248GFXDECODE_END
249
250
251//-------------------------------------------------
252//  TIMER_DEVICE_CALLBACK( set_irq )
253//-------------------------------------------------
254
255static TIMER_DEVICE_CALLBACK( set_irq )
256{
257   cputag_set_input_line(timer.machine, Z80_TAG, INPUT_LINE_IRQ0, ASSERT_LINE);
258}
259
260
261//-------------------------------------------------
262//  TIMER_DEVICE_CALLBACK( clear_irq )
263//-------------------------------------------------
264
265static TIMER_DEVICE_CALLBACK( clear_irq )
266{
267   cputag_set_input_line(timer.machine, Z80_TAG, INPUT_LINE_IRQ0, CLEAR_LINE);
268}
269
270
271//-------------------------------------------------
272//  VIDEO_UPDATE( ace )
273//-------------------------------------------------
274
275bool ace_state::video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect)
276{
277   UINT8 y,ra,chr,gfx;
278   UINT16 sy=0,ma=0,x;
279
280   for (y = 0; y < 24; y++)
281   {
282      for (ra = 0; ra < 8; ra++)
283      {
284         UINT16 *p = BITMAP_ADDR16(&bitmap, sy++, 0);
285
286         for (x = ma; x < ma+32; x++)
287         {
288            chr = m_video_ram[x];
289
290            /* get pattern of pixels for that character scanline */
291            gfx = m_char_ram[((chr&0x7f)<<3) | ra] ^ ((chr&0x80) ? 0xff : 0);
292
293            /* Display a scanline of a character (8 pixels) */
294            *p++ = ( gfx & 0x80 ) ? 1 : 0;
295            *p++ = ( gfx & 0x40 ) ? 1 : 0;
296            *p++ = ( gfx & 0x20 ) ? 1 : 0;
297            *p++ = ( gfx & 0x10 ) ? 1 : 0;
298            *p++ = ( gfx & 0x08 ) ? 1 : 0;
299            *p++ = ( gfx & 0x04 ) ? 1 : 0;
300            *p++ = ( gfx & 0x02 ) ? 1 : 0;
301            *p++ = ( gfx & 0x01 ) ? 1 : 0;
302         }
303      }
304      ma+=32;
305   }
306   return 0;
307}
308
309
310
311//**************************************************************************
312//   DEVICE CONFIGURATION
313//**************************************************************************
314
315//-------------------------------------------------
316//  cassette_config ace_cassette_config
317//-------------------------------------------------
318
319static const cassette_config ace_cassette_config =
320{
321   ace_cassette_formats,
322   NULL,
323   (cassette_state)(CASSETTE_STOPPED),
324   NULL
325};
326
327
328//-------------------------------------------------
329//  ay8910_interface psg_intf
330//-------------------------------------------------
331
332static const ay8910_interface psg_intf =
333{
334   AY8910_LEGACY_OUTPUT,
335   AY8910_DEFAULT_LOADS,
336   DEVCB_NULL,
337   DEVCB_NULL,
338   DEVCB_NULL,
339   DEVCB_NULL,
340};
341
342
343
344//**************************************************************************
345//   MACHINE INITIALIZATION
346//**************************************************************************
347
348//-------------------------------------------------
349//  MACHINE_START( ace )
350//-------------------------------------------------
351
352void ace_state::machine_start()
353{
354   address_space *program = cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM);
355
356   /* configure RAM */
357   switch (ram_get_size(m_ram))
358   {
359   case 1*1024:
360      memory_unmap_readwrite(program, 0x4000, 0xffff, 0, 0);
361      break;
362
363   case 16*1024:
364      memory_unmap_readwrite(program, 0x8000, 0xffff, 0, 0);
365      break;
366   }
367}
368
369
370
371//**************************************************************************
372//   MACHINE CONFIGURATION
373//**************************************************************************
374
375//-------------------------------------------------
376//  MACHINE_CONFIG( ace )
377//-------------------------------------------------
378
379static MACHINE_CONFIG_START( ace, ace_state )
380   /* basic machine hardware */
381   MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_6_5MHz/2)
382   MCFG_CPU_PROGRAM_MAP(ace_mem)
383   MCFG_CPU_IO_MAP(ace_io)
384   MCFG_QUANTUM_TIME(HZ(60))
385
386   /* video hardware */
387   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
388   MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
389   MCFG_SCREEN_RAW_PARAMS(XTAL_6_5MHz, 416, 0, 256, 264, 0, 192)
390   MCFG_TIMER_ADD_SCANLINE("set_irq", set_irq, SCREEN_TAG, 31*8, 264)
391   MCFG_TIMER_ADD_SCANLINE("clear_irq", clear_irq, SCREEN_TAG, 32*8, 264)
392
393   MCFG_GFXDECODE( ace )
394   MCFG_PALETTE_LENGTH(2)
395   MCFG_PALETTE_INIT(black_and_white)
396
397   /* sound hardware */
398   MCFG_SPEAKER_STANDARD_MONO("mono")
399   MCFG_SOUND_WAVE_ADD("wave", CASSETTE_TAG)
400   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
401   MCFG_SOUND_ADD(SPEAKER_TAG, SPEAKER_SOUND, 0)
402   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
403
404   MCFG_SOUND_ADD(AY8910_TAG, AY8910, XTAL_6_5MHz/2)
405   MCFG_SOUND_CONFIG(psg_intf)
406   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
407
408   /* Devices */
409   MCFG_CASSETTE_ADD(CASSETTE_TAG, ace_cassette_config)
410   MCFG_SNAPSHOT_ADD("snapshot", ace, "ace", 1)
411
412   /* internal ram */
413   MCFG_RAM_ADD("messram")
414   MCFG_RAM_DEFAULT_SIZE("1K")
415   MCFG_RAM_EXTRA_OPTIONS("16K,48K")
416MACHINE_CONFIG_END
417
418
419
420//**************************************************************************
421//   ROMS
422//**************************************************************************
423
424//-------------------------------------------------
425//  ROM( ace )
426//-------------------------------------------------
427
428ROM_START( ace )
429   ROM_REGION( 0x10000, Z80_TAG,0 )
430   ROM_LOAD( "rom-a.z1", 0x0000, 0x1000, CRC(dc8438a5) SHA1(8fa97eb71e5dd17c7d190c6587ee3840f839347c) )
431   ROM_LOAD( "rom-b.z2", 0x1000, 0x1000, CRC(4009f636) SHA1(98c5d4bcd74bcf014268cf4c00b2007ea5cc21f3) )
432
433   ROM_REGION( 0x1000, "fdc", 0 ) // Deep Thought disc interface
434   ROM_LOAD( "dos 4.bin", 0x0000, 0x1000, CRC(04c70448) SHA1(53ddcced6ae2feafd687a3b55864726656b71412) )
435ROM_END
436
437
438
439//**************************************************************************
440//   SYSTEM DRIVERS
441//**************************************************************************
442
443//    YEAR  NAME      PARENT      COMPAT   MACHINE      INPUT      INIT   COMPANY         FULLNAME            FLAGS
444COMP( 1981, ace,  0,   0,   ace,  ace,  0,   "Jupiter Cantab",  "Jupiter Ace" , 0 )
src/mess/drivers/jupiter.c
r9929r9930
1/***************************************************************************
2Jupiter Ace memory map
1/*
32
4    CPU: Z80
5        0000-1fff ROM
6        2000-23ff Mirror of 2400-27FF
7        2400-27ff RAM (1K RAM used for screen and edit/cassette buffer)
8        2800-2bff Mirror of 2C00-2FFF
9        2c00-2fff RAM (1K RAM for char set, write only)
10        3000-3bff Mirror of 3C00-3FFF
11        3c00-3fff RAM (1K RAM standard)
12        4000-7fff RAM (16K Expansion)
13        8000-ffff RAM (48K Expansion)
3Wave Mate Jupiter
144
15Interrupts:
5*/
166
17    IRQ:
18        50Hz vertical sync
7#define ADDRESS_MAP_MODERN
198
20Ports:
21
22    Out 0xfe:
23        Tape and buzzer
24
25    In 0xfe:
26        Keyboard input, tape, and buzzer
27***************************************************************************/
28
299#include "emu.h"
10#include "cpu/m6800/m6800.h"
3011#include "cpu/z80/z80.h"
31#include "imagedev/cassette.h"
32#include "imagedev/snapquik.h"
33#include "sound/speaker.h"
34#include "sound/wave.h"
35#include "formats/jupi_tap.h"
12#include "imagedev/flopdrv.h"
13#include "machine/ram.h"
14#include "machine/terminal.h"
15#include "machine/wd17xx.h"
3616#include "includes/jupiter.h"
3717
3818
39/* This needs to be moved to drivers/xtal */
40#define XTAL_6_5MHz   6500000
4119
20//**************************************************************************
21//   ADDRESS MAPS
22//**************************************************************************
4223
24//-------------------------------------------------
25//  ADDRESS_MAP( jupiter_m6800_mem )
26//-------------------------------------------------
4327
44static READ8_HANDLER( jupiter_io_r );
45static WRITE8_HANDLER( jupiter_io_w );
46static WRITE8_HANDLER( jupiter_expram_w );
28static ADDRESS_MAP_START( jupiter_m6800_mem, ADDRESS_SPACE_PROGRAM, 8, jupiter2_state )
29   AM_RANGE(0x0000, 0x7fff) AM_RAM
30//   AM_RANGE(0xc000, 0xcfff) Video RAM
31   AM_RANGE(0xf000, 0xffff) AM_ROM AM_REGION(MCM6571AP_TAG, 0)
32//   AM_RANGE(0xff58, 0xff5c) Cartridge Disk Controller PIA
33//   AM_RANGE(0xff60, 0xff76) DMA Controller
34//   AM_RANGE(0xff80, 0xff83) Floppy PIA
35//   AM_RANGE(0xff84, 0xff87) AM_DEVREADWRITE_LEGACY(INS1771N1_TAG, wd17xx_r, wd17xx_w)
36//   AM_RANGE(0xff90, 0xff93) Hytype Parallel Printer PIA
37//   AM_RANGE(0xffa0, 0xffa7) Persci Floppy Disk Controller
38//   AM_RANGE(0xffb0, 0xffb3) Video PIA
39//   AM_RANGE(0xffc0, 0xffc1) Serial Port 0 ACIA
40//   AM_RANGE(0xffc4, 0xffc5) Serial Port 1 ACIA
41//   AM_RANGE(0xffc8, 0xffc9) Serial Port 2 ACIA
42//   AM_RANGE(0xffcc, 0xffcd) Serial Port 3 ACIA
43//   AM_RANGE(0xffd0, 0xffd1) Serial Port 4 ACIA / Cassette
44//   AM_RANGE(0xffd4, 0xffd5) Serial Port 5 ACIA / EPROM Programmer (2704/2708)
45//   AM_RANGE(0xffd8, 0xffd9) Serial Port 6 ACIA / Hardware Breakpoint Registers
46//   AM_RANGE(0xffdc, 0xffdd) Serial Port 7 ACIA
47ADDRESS_MAP_END
4748
4849
49/* memory w/r functions */
50static ADDRESS_MAP_START( jupiter_mem , ADDRESS_SPACE_PROGRAM, 8)
51   AM_RANGE(0x0000, 0x1fff) AM_ROM
52   AM_RANGE(0x2400, 0x27ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(jupiter_state, videoram)
53   AM_RANGE(0x2c00, 0x2fff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(jupiter_state, charram) AM_REGION("maincpu", 0xfc00)
54   AM_RANGE(0x3c00, 0x3fff) AM_MIRROR(0x0c00) AM_RAM
55   AM_RANGE(0x4000, 0xffff) AM_RAM_WRITE( jupiter_expram_w ) AM_BASE_MEMBER(jupiter_state, expram) /* Expansion RAM */
56ADDRESS_MAP_END
50//-------------------------------------------------
51//  ADDRESS_MAP( jupiter_m6800_io )
52//-------------------------------------------------
5753
58/* port i/o functions */
59static ADDRESS_MAP_START( jupiter_io , ADDRESS_SPACE_IO, 8)
60   AM_RANGE( 0x0000, 0xffff ) AM_READWRITE( jupiter_io_r, jupiter_io_w )
54static ADDRESS_MAP_START( jupiter_m6800_io, ADDRESS_SPACE_IO, 8, jupiter2_state )
6155ADDRESS_MAP_END
6256
6357
64/* keyboard input */
58//-------------------------------------------------
59//  ADDRESS_MAP( jupiter3_mem )
60//-------------------------------------------------
6561
66static INPUT_PORTS_START (jupiter)
67   PORT_START("KEY0")   /* 0: 0xFEFE */
68   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT)      PORT_CHAR(UCHAR_SHIFT_1)
69   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Symbol Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_2)
70   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)         PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(':')
71   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)         PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR('\xA3')
72   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)         PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR('?')
62static ADDRESS_MAP_START( jupiter3_mem, ADDRESS_SPACE_PROGRAM, 8, jupiter3_state )
63   AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION(Z80_TAG, 0)
64ADDRESS_MAP_END
7365
74   PORT_START("KEY1")   /* 1: 0xFDFE */
75   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)         PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR('~')
76   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)         PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR('|')
77   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)         PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR('\\')
78   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)         PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR('{')
79   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)         PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR('}')
8066
81   PORT_START("KEY2")   /* 2: 0xFBFE */
82   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)         PORT_CHAR('q') PORT_CHAR('Q')
83   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)         PORT_CHAR('w') PORT_CHAR('W')
84   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)         PORT_CHAR('e') PORT_CHAR('E')
85   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)         PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR('<')
86   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)         PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR('>')
67//-------------------------------------------------
68//  ADDRESS_MAP( jupiter3_io )
69//-------------------------------------------------
8770
88   PORT_START("KEY3")   /* 3: 0xF7FE */
89   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)         PORT_CHAR('1') PORT_CHAR('!')
90   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)         PORT_CHAR('2') PORT_CHAR('@')
91   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)         PORT_CHAR('3') PORT_CHAR('#')
92   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)         PORT_CHAR('4') PORT_CHAR('$')
93   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_LEFT) PORT_CHAR('5') PORT_CHAR('%')
71static ADDRESS_MAP_START( jupiter3_io, ADDRESS_SPACE_IO, 8, jupiter3_state )
72ADDRESS_MAP_END
9473
95   PORT_START("KEY4")   /* 4: 0xEFFE */
96   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)         PORT_CHAR('0') PORT_CHAR('_')
97   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)         PORT_CHAR('9') PORT_CHAR(')')
98   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR('8') PORT_CHAR('(')
99   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('7') PORT_CHAR('\'')
100   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_UP)   PORT_CHAR('6') PORT_CHAR('&')
10174
102   PORT_START("KEY5")   /* 5: 0xDFFE */
103   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)         PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR('"')
104   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)         PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(';')
105   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)         PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x00A9)
106   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)         PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(']')
107   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)         PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR('[')
10875
109   PORT_START("KEY6")   /* 6: 0xBFFE */
110   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER)      PORT_CHAR(13)
111   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)         PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR('=')
112   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)         PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR('+')
113   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)         PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR('-')
114   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("h  H  \xE2\x86\x91") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
76//**************************************************************************
77//   INPUT PORTS
78//**************************************************************************
11579
116   PORT_START("KEY7")   /* 7: 0x7FFE */
117   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)      PORT_CHAR(' ')
118   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)         PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR('.')
119   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)         PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(',')
120   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)         PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR('*')
121   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)         PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR('/')
80//-------------------------------------------------
81//  INPUT_PORTS( jupiter )
82//-------------------------------------------------
12283
123   PORT_START("CFG")   /* 8: machine config */
124   PORT_DIPNAME( 0x03, 2, "RAM Size")
125   PORT_DIPSETTING(   0, "No RAM Expansion")
126   PORT_DIPSETTING(   1, "16KB RAM Expansion")
127   PORT_DIPSETTING(   2, "48KB RAM Expansion")
84INPUT_PORTS_START( jupiter )
85   PORT_INCLUDE(generic_terminal)
12886INPUT_PORTS_END
12987
13088
131static READ8_HANDLER( jupiter_io_r )
132{
133   device_t *speaker = space->machine->device("speaker");
134   UINT8 data = 0xff;
13589
136   if ( ( offset & 0xff ) != 0xfe )
137      return data;
90//**************************************************************************
91//   DEVICE CONFIGURATION
92//**************************************************************************
13893
139   if ( ! ( offset & 0x0100 ) )
140   {
141      data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY0" ) );
142   }
143   if ( ! ( offset & 0x0200 ) )
144   {
145      data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY1" ) );
146   }
147   if ( ! ( offset & 0x0400 ) )
148   {
149      data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY2" ) );
150   }
151   if ( ! ( offset & 0x0800 ) )
152   {
153      data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY3" ) );
154   }
155   if ( ! ( offset & 0x1000 ) )
156   {
157      data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY4" ) );
158   }
159   if ( ! ( offset & 0x2000 ) )
160   {
161      data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY5" ) );
162   }
163   if ( ! ( offset & 0x4000 ) )
164   {
165      data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY6" ) );
166   }
167   if ( ! ( offset & 0x8000 ) )
168   {
169//      cassette_output( space->machine->device("cassette"), -1 );
170      speaker_level_w(speaker,0);
171      data = ( data & 0xe0 ) | ( data & input_port_read( space->machine, "KEY7" ) );;
172   }
173   if ( cassette_input(space->machine->device("cassette")) > 0 )
174   {
175      data &= ~0x20;
176   }
177   return data;
178}
94//-------------------------------------------------
95//  wd17xx_interface fdc_intf
96//-------------------------------------------------
17997
180
181static WRITE8_HANDLER( jupiter_io_w )
98static const floppy_config jupiter_floppy_config =
18299{
183   device_t *speaker = space->machine->device("speaker");
184//  cassette_output( space->machine->device("cassette"), 1 );
185   speaker_level_w(speaker,1);
186}
100    DEVCB_NULL,
101   DEVCB_NULL,
102    DEVCB_NULL,
103    DEVCB_NULL,
104    DEVCB_NULL,
105    FLOPPY_STANDARD_5_25_SSDD_40,
106    FLOPPY_OPTIONS_NAME(default),
107    NULL
108};
187109
188
189static WRITE8_HANDLER( jupiter_expram_w )
110static const wd17xx_interface fdc_intf =
190111{
191   jupiter_state *state = space->machine->driver_data<jupiter_state>();
112   DEVCB_NULL,
113   DEVCB_NULL,
114   DEVCB_NULL,
115   { FLOPPY_0, FLOPPY_1, NULL, NULL }
116};
192117
193   if ( offset > 0x4000 )
194   {
195      if ( input_port_read(space->machine, "CFG") >= 1 )
196         state->expram[offset] = data;
197   }
198   else
199   {
200      if ( input_port_read(space->machine, "CFG") == 2 )
201         state->expram[offset] = data;
202   }
203}
204118
119//-------------------------------------------------
120//  GENERIC_TERMINAL_INTERFACE( terminal_intf )
121//-------------------------------------------------
205122
206/* graphics output */
207
208
209static const gfx_layout jupiter_charlayout =
123static GENERIC_TERMINAL_INTERFACE( terminal_intf )
210124{
211   8, 8,   /* 8x8 characters */
212   128,   /* 128 characters */
213   1,      /* 1 bits per pixel */
214   {0},   /* no bitplanes; 1 bit per pixel */
215   {0, 1, 2, 3, 4, 5, 6, 7},
216   {0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8},
217   8*8    /* each character takes 8 consecutive bytes */
125   DEVCB_NULL
218126};
219127
220128
221static GFXDECODE_START( jupiter )
222   GFXDECODE_ENTRY( "maincpu", 0xfc00, jupiter_charlayout, 0, 1 )
223GFXDECODE_END
224129
130//**************************************************************************
131//   MACHINE INITIALIZATION
132//**************************************************************************
225133
226static TIMER_CALLBACK( jupiter_set_irq_callback )
134//-------------------------------------------------
135//  MACHINE_START( jupiter )
136//-------------------------------------------------
137
138void jupiter2_state::machine_start()
227139{
228   cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE);
229140}
230141
231142
232static TIMER_CALLBACK( jupiter_clear_irq_callback )
143//-------------------------------------------------
144//  MACHINE_START( jupiter3 )
145//-------------------------------------------------
146
147void jupiter3_state::machine_start()
233148{
234   cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE);
235149}
236150
237151
238static VIDEO_START( jupiter )
239{
240   jupiter_state *state = machine->driver_data<jupiter_state>();
241   state->set_irq_timer = timer_alloc(machine,  jupiter_set_irq_callback, NULL );
242   state->clear_irq_timer = timer_alloc(machine,  jupiter_clear_irq_callback, NULL );
243152
244   timer_adjust_periodic( state->set_irq_timer,
245      machine->primary_screen->time_until_pos(31*8, 0 ),
246      0, machine->primary_screen->frame_period() );
153//**************************************************************************
154//   MACHINE CONFIGURATION
155//**************************************************************************
247156
248   timer_adjust_periodic( state->clear_irq_timer,
249      machine->primary_screen->time_until_pos(32*8, 0 ),
250      0, machine->primary_screen->frame_period() );
251}
157//-------------------------------------------------
158//  MACHINE_CONFIG( jupiter )
159//-------------------------------------------------
252160
161static MACHINE_CONFIG_START( jupiter, jupiter2_state )
162    // basic machine hardware
163    MCFG_CPU_ADD(MCM6571AP_TAG, M6800, 2000000)
164    MCFG_CPU_PROGRAM_MAP(jupiter_m6800_mem)
165    MCFG_CPU_IO_MAP(jupiter_m6800_io)
253166
254static VIDEO_UPDATE( jupiter )
255{
256   jupiter_state *state = screen->machine->driver_data<jupiter_state>();
257   UINT8 *charram = state->charram;
258   UINT8 *videoram = state->videoram;
259   UINT8 y,ra,chr,gfx;
260   UINT16 sy=0,ma=0,x;
167    // video hardware
168   MCFG_FRAGMENT_ADD( generic_terminal )
261169
262   for (y = 0; y < 24; y++)
263   {
264      for (ra = 0; ra < 8; ra++)
265      {
266         UINT16 *p = BITMAP_ADDR16(bitmap, sy++, 0);
170   // devices
171   MCFG_WD1771_ADD(INS1771N1_TAG, fdc_intf)
172   MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf)
173   
174   // internal ram
175   MCFG_RAM_ADD("messram")
176   MCFG_RAM_DEFAULT_SIZE("64K")
177MACHINE_CONFIG_END
267178
268         for (x = ma; x < ma+32; x++)
269         {
270            chr = videoram[x];
271179
272            /* get pattern of pixels for that character scanline */
273            gfx = charram[((chr&0x7f)<<3) | ra] ^ ((chr&0x80) ? 0xff : 0);
180//-------------------------------------------------
181//  MACHINE_CONFIG( jupiter3 )
182//-------------------------------------------------
274183
275            /* Display a scanline of a character (8 pixels) */
276            *p++ = ( gfx & 0x80 ) ? 1 : 0;
277            *p++ = ( gfx & 0x40 ) ? 1 : 0;
278            *p++ = ( gfx & 0x20 ) ? 1 : 0;
279            *p++ = ( gfx & 0x10 ) ? 1 : 0;
280            *p++ = ( gfx & 0x08 ) ? 1 : 0;
281            *p++ = ( gfx & 0x04 ) ? 1 : 0;
282            *p++ = ( gfx & 0x02 ) ? 1 : 0;
283            *p++ = ( gfx & 0x01 ) ? 1 : 0;
284         }
285      }
286      ma+=32;
287   }
288   return 0;
289}
184static MACHINE_CONFIG_START( jupiter3, jupiter3_state )
185    // basic machine hardware
186   MCFG_CPU_ADD(Z80_TAG, Z80, 4000000)
187    MCFG_CPU_PROGRAM_MAP(jupiter3_mem)
188    MCFG_CPU_IO_MAP(jupiter3_io)
290189
190    // video hardware
191   MCFG_FRAGMENT_ADD( generic_terminal )
291192
292static const cassette_config jupiter_cassette_config =
293{
294   jupiter_cassette_formats,
295   NULL,
296   (cassette_state)(CASSETTE_STOPPED),
297   NULL
298};
193   // devices
194   MCFG_WD1771_ADD(INS1771N1_TAG, fdc_intf)
195   MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf)
196   
197   // internal ram
198   MCFG_RAM_ADD("messram")
199   MCFG_RAM_DEFAULT_SIZE("64K")
200MACHINE_CONFIG_END
299201
300/* machine definition */
301static MACHINE_CONFIG_START( jupiter, jupiter_state )
302   /* basic machine hardware */
303   MCFG_CPU_ADD("maincpu", Z80, XTAL_6_5MHz/2)        /* 3.25 MHz */
304   MCFG_CPU_PROGRAM_MAP(jupiter_mem)
305   MCFG_CPU_IO_MAP(jupiter_io)
306   MCFG_QUANTUM_TIME(HZ(60))
307202
308   /* video hardware */
309   MCFG_SCREEN_ADD("screen", RASTER)
310   MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
311   MCFG_SCREEN_RAW_PARAMS( XTAL_6_5MHz, 416, 0, 256, 264, 0, 192 )
312203
313   MCFG_GFXDECODE( jupiter )
314   MCFG_PALETTE_LENGTH(2)
315   MCFG_PALETTE_INIT(black_and_white)
204//**************************************************************************
205//   ROMS
206//**************************************************************************
316207
317   MCFG_VIDEO_START( jupiter )
318   MCFG_VIDEO_UPDATE( jupiter )
208//-------------------------------------------------
209//  ROM( jupiter2 )
210//-------------------------------------------------
319211
320   /* sound hardware */
321   MCFG_SPEAKER_STANDARD_MONO("mono")
322   MCFG_SOUND_WAVE_ADD("wave", "cassette")
323   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
324   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
325   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
212ROM_START( jupiter2 )
213   ROM_REGION( 0x1000, MCM6571AP_TAG, ROMREGION_INVERT ) // address and data lines are inverted
214   ROM_LOAD( "idb v1.1 for 60k jii f000.1c", 0x0000, 0x0400, CRC(50893aae) SHA1(da0222c4cb6188f6cfc657fc33558d0a6a41cd1a) )
215   ROM_LOAD( "idb v1.1 for 60k jii f400.6c", 0x0400, 0x0400, CRC(a435344a) SHA1(bc4f4143301b10ec762ecc0cb69e5a9d4c4bef7b) )
216   ROM_LOAD( "idb v1.1 for 60k jii f800.1d", 0x0800, 0x0400, CRC(ab82df45) SHA1(be7ea5347ff0582401e26c2fa10e13463cbe57c6) )
217   ROM_LOAD( "boot_v2.6_sn5d00000000000003_fc00.6d", 0x0c00, 0x0400, CRC(8f33e4ed) SHA1(fb206e5019c166583ff516de3608ae86d2636d2a) )
218   ROM_LOAD( "jupiter ii boot rom v2.6 12_18_82 s_n 5d000...0015.6d", 0x0c00, 0x0400, CRC(f87cefdf) SHA1(229ea961e6036ec39e0ae33abc7f554bf9d8361b) )
219ROM_END
326220
327   /* Devices */
328   MCFG_CASSETTE_ADD( "cassette", jupiter_cassette_config )
329   MCFG_SNAPSHOT_ADD("snapshot", jupiter, "ace", 1)
330MACHINE_CONFIG_END
331221
222//-------------------------------------------------
223//  ROM( jupiter3 )
224//-------------------------------------------------
332225
333ROM_START (jupiter)
334   ROM_REGION (0x10000, "maincpu",0)
335   ROM_LOAD ("jupiter.lo", 0x0000, 0x1000, CRC(dc8438a5) SHA1(8fa97eb71e5dd17c7d190c6587ee3840f839347c))
336   ROM_LOAD ("jupiter.hi", 0x1000, 0x1000, CRC(4009f636) SHA1(98c5d4bcd74bcf014268cf4c00b2007ea5cc21f3))
226ROM_START( jupiter3 )
227   ROM_REGION( 0x1000, Z80_TAG, ROMREGION_INVERT ) // address and data lines are inverted
228   ROM_LOAD( "jove 2.0 78_034 4v2d000 1.1c", 0x0000, 0x0400, CRC(be92a76c) SHA1(9c7d9b37c2bbf0c2e9465421e3e1bcf3dd9e66a6) )
229   ROM_LOAD( "jove 2.0 78_034 4v2d000 2.6c", 0x0400, 0x0400, CRC(ee98dd32) SHA1(0513261c7c0d911225ea957ee67394871a36ada4) )
230   ROM_LOAD( "jove 2.0 78_034 4v2d000 3.1d", 0x0800, 0x0400, CRC(51476b1d) SHA1(ab6f4eb244bcf9718aafdae67da086ec81f33fa6) )
231   ROM_LOAD( "jove 2.0 78_034 4v2d000 4.6d", 0x0c00, 0x0400, CRC(16a9595d) SHA1(06150278650590497732e1f3f42356de56737921) )
337232ROM_END
338233
339/*    YEAR  NAME      PARENT    COMPAT  MACHINE   INPUT     INIT        COMPANY   FULLNAME */
340COMP( 1981, jupiter,  0,   0,   jupiter,  jupiter,  0,   "Jupiter Cantab",  "Jupiter Ace" , 0 )
234
235
236//**************************************************************************
237//   DRIVER INITIALIZATION
238//**************************************************************************
239
240//-------------------------------------------------
241//  DRIVER_INIT( jupiter )
242//-------------------------------------------------
243
244static DRIVER_INIT( jupiter )
245{
246   UINT8 *rom = machine->region(MCM6571AP_TAG)->base();
247   UINT8 inverted[0x1000];
248
249   memcpy(inverted, rom, 0x1000);
250
251   for (offs_t addr = 0; addr < 0x400; addr++)
252   {
253      // invert address lines
254      rom[0x3ff - addr] = inverted[addr];
255      rom[0x7ff - addr] = inverted[addr + 0x400];
256      rom[0xbff - addr] = inverted[addr + 0x800];
257      rom[0xfff - addr] = inverted[addr + 0xc00];
258   }
259}
260
261
262//-------------------------------------------------
263//  DRIVER_INIT( jupiter3 )
264//-------------------------------------------------
265
266static DRIVER_INIT( jupiter3 )
267{
268   UINT8 *rom = machine->region(Z80_TAG)->base();
269   UINT8 inverted[0x1000];
270
271   memcpy(inverted, rom, 0x1000);
272
273   for (offs_t addr = 0; addr < 0x400; addr++)
274   {
275      // invert address lines
276      rom[0x3ff - addr] = inverted[addr];
277      rom[0x7ff - addr] = inverted[addr + 0x400];
278      rom[0xbff - addr] = inverted[addr + 0x800];
279      rom[0xfff - addr] = inverted[addr + 0xc00];
280   }
281}
282
283//**************************************************************************
284//   SYSTEM DRIVERS
285//**************************************************************************
286
287//    YEAR  NAME    PARENT  COMPAT   MACHINE    INPUT    INIT    COMPANY   FULLNAME       FLAGS
288COMP( 1976, jupiter2,   0,      0,    jupiter,    jupiter,     jupiter,   "Wave Mate",   "Jupiter II",   GAME_NOT_WORKING | GAME_NO_SOUND_HW )
289COMP( 1976, jupiter3,   0,      0,    jupiter3,    jupiter,     jupiter3,   "Wave Mate",   "Jupiter III",   GAME_NOT_WORKING | GAME_NO_SOUND_HW )
docs/messnew.txt
r9929r9930
4141- NEC PC-8300 [Incog]
4242- Peripheral Technology PT68K4
4343- Osborne 4 Vixen [Curt Coder]
44- Wave Mate Jupiter II [Curt Coder]
45- Wave Mate Jupiter III [Curt Coder]
4446
4547
4648
r9929r9930
5961
6062- [ABC1600] Added ROM dumps. [Ola Andersson]
6163
64- [ACE] Renamed jupiter to ace to avoid naming conflict with Wave Mate.
65  Added support for BoldField Joystick interface AC5 and EME Soundbox AC4.
66  Cleaned up and modernized driver. [Curt Coder]
67
6268- [AMU880] Fixed keyboard. [Curt Coder]
6369
6470- [AVIGO] Fixed regressions. [Robbbert]

Previous 15994 Revisions Next


© 1998-2018 The MESS Team