~ubuntu-branches/ubuntu/lucid/sdlmame/lucid

« back to all changes in this revision

Viewing changes to src/mame/drivers/progolf.c

  • Committer: Bazaar Package Importer
  • Author(s): Cesare Falco
  • Date: 2009-11-03 17:10:15 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20091103171015-6hop4ory5lxnumpn
Tags: 0.135-0ubuntu1
* New upstream release - Closes (LP: #403212)
* debian/watch: unstable releases are no longer detected
* mame.ini: added the cheat subdirectories to cheatpath so zipped
  cheatfiles will be searched too
* renamed crsshair subdirectory to crosshair to reflect upstream change
* mame.ini: renamed references to crosshair subdirectory (see above)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************
 
1
/****************************************************************************************
 
2
 
 
3
18 Holes Pro Golf (c) 1981 Data East
 
4
 
 
5
driver by Angelo Salese and Roberto Zandona',
 
6
based on early work by Pierpaolo Prazzoli and David Haywood
 
7
 
 
8
TODO:
 
9
- Map display is (almost) correct but color pens aren't;
 
10
- Flip screen support;
 
11
 
 
12
=========================================================================================
2
13
 
3
14
Pro Golf
4
15
Data East 1981
37
48
 
38
49
Twenty four 8116 rams.
39
50
 
40
 
****************************************************************/
 
51
****************************************************************************************/
41
52
 
42
53
#include "driver.h"
43
54
#include "cpu/m6502/m6502.h"
44
55
#include "sound/ay8910.h"
45
 
#include "includes/btime.h"
 
56
#include "video/mc6845.h"
 
57
 
 
58
static UINT8 char_pen,char_pen_vreg;
 
59
static UINT8 *progolf_fg_fb;
 
60
static UINT8 *progolf_fbram;
 
61
static UINT8 scrollx_hi;
 
62
static UINT8 scrollx_lo;
 
63
static UINT8 progolf_gfx_switch;
 
64
 
 
65
static UINT8 sound_cmd;
 
66
 
 
67
static VIDEO_START( progolf )
 
68
{
 
69
        scrollx_hi = 0;
 
70
        scrollx_lo = 0;
 
71
 
 
72
        progolf_fg_fb = auto_alloc_array(machine, UINT8, 0x2000*8);
 
73
        videoram = auto_alloc_array(machine, UINT8, 0x1000);
 
74
}
 
75
 
 
76
 
 
77
static VIDEO_UPDATE( progolf )
 
78
{
 
79
        int count,color,x,y,xi,yi;
 
80
 
 
81
        {
 
82
                int scroll = (scrollx_lo | ((scrollx_hi & 0x03) << 8));
 
83
 
 
84
                count = 0;
 
85
 
 
86
                for(x=0;x<128;x++)
 
87
                {
 
88
                        for(y=0;y<32;y++)
 
89
                        {
 
90
                                int tile = videoram[count];
 
91
 
 
92
                                drawgfx_opaque(bitmap,cliprect,screen->machine->gfx[0],tile,1,0,0,(256-x*8)+scroll,y*8);
 
93
                                /* wrap-around */
 
94
                                drawgfx_opaque(bitmap,cliprect,screen->machine->gfx[0],tile,1,0,0,(256-x*8)+scroll-1024,y*8);
 
95
 
 
96
                                count++;
 
97
                        }
 
98
                }
 
99
        }
 
100
 
 
101
        /* framebuffer is 8x8 chars arranged like a bitmap + a register that controls the pen handling. */
 
102
        {
 
103
                count = 0;
 
104
 
 
105
                for(y=0;y<256;y+=8)
 
106
                {
 
107
                        for(x=0;x<256;x+=8)
 
108
                        {
 
109
                                for (yi=0;yi<8;yi++)
 
110
                                {
 
111
                                        for (xi=0;xi<8;xi++)
 
112
                                        {
 
113
                                                color = progolf_fg_fb[(xi+yi*8)+count*0x40];
 
114
 
 
115
                                                if((x+yi) <= cliprect->max_x && (256-y+xi) <= cliprect->max_y && color != 0)
 
116
                                                        *BITMAP_ADDR16(bitmap, x+yi, 256-y+xi) = screen->machine->pens[(color & 0x7)];
 
117
                                        }
 
118
                                }
 
119
 
 
120
                                count++;
 
121
                        }
 
122
                }
 
123
        }
 
124
 
 
125
        return 0;
 
126
}
 
127
 
 
128
static WRITE8_HANDLER( progolf_charram_w )
 
129
{
 
130
        int i;
 
131
        progolf_fbram[offset] = data;
 
132
 
 
133
        if(char_pen == 7)
 
134
        {
 
135
                for(i=0;i<8;i++)
 
136
                        progolf_fg_fb[offset*8+i] = 0;
 
137
        }
 
138
        else
 
139
        {
 
140
                for(i=0;i<8;i++)
 
141
                {
 
142
                        if(progolf_fg_fb[offset*8+i] == char_pen)
 
143
                                progolf_fg_fb[offset*8+i] = data & (1<<(7-i)) ? char_pen : 0;
 
144
                        else
 
145
                                progolf_fg_fb[offset*8+i] = data & (1<<(7-i)) ? progolf_fg_fb[offset*8+i]|char_pen : progolf_fg_fb[offset*8+i];
 
146
                }
 
147
        }
 
148
}
 
149
 
 
150
static WRITE8_HANDLER( progolf_char_vregs_w )
 
151
{
 
152
        char_pen = data & 0x07;
 
153
        progolf_gfx_switch = data & 0xf0;
 
154
        char_pen_vreg = data & 0x30;
 
155
}
 
156
 
 
157
static WRITE8_HANDLER( progolf_scrollx_lo_w )
 
158
{
 
159
        scrollx_lo = data;
 
160
}
 
161
 
 
162
static WRITE8_HANDLER( progolf_scrollx_hi_w )
 
163
{
 
164
        scrollx_hi = data;
 
165
}
 
166
 
 
167
static WRITE8_HANDLER( progolf_flip_screen_w )
 
168
{
 
169
        flip_screen_set(space->machine, data & 1);
 
170
        if(data & 0xfe)
 
171
                printf("$9600 with data = %02x used\n",data);
 
172
}
 
173
 
 
174
static WRITE8_HANDLER( audio_command_w )
 
175
{
 
176
        sound_cmd = data;
 
177
        cputag_set_input_line(space->machine, "audiocpu", 0, ASSERT_LINE);
 
178
}
 
179
 
 
180
static READ8_HANDLER( audio_command_r )
 
181
{
 
182
        cputag_set_input_line(space->machine, "audiocpu", 0, CLEAR_LINE);
 
183
        return sound_cmd;
 
184
}
 
185
 
 
186
static READ8_HANDLER( progolf_videoram_r )
 
187
{
 
188
        UINT8 *gfx_rom = memory_region(space->machine, "gfx1");
 
189
 
 
190
        if (offset >= 0x0800)
 
191
        {
 
192
                if      (progolf_gfx_switch == 0x50)
 
193
                        return gfx_rom[offset];
 
194
                else if (progolf_gfx_switch == 0x60)
 
195
                        return gfx_rom[offset + 0x1000];
 
196
                else if (progolf_gfx_switch == 0x70)
 
197
                        return gfx_rom[offset + 0x2000];
 
198
                else
 
199
                        return videoram[offset];
 
200
        } else {
 
201
                if      (progolf_gfx_switch == 0x10)
 
202
                        return gfx_rom[offset];
 
203
                else if (progolf_gfx_switch == 0x20)
 
204
                        return gfx_rom[offset + 0x1000];
 
205
                else if (progolf_gfx_switch == 0x30)
 
206
                        return gfx_rom[offset + 0x2000];
 
207
                else
 
208
                        return videoram[offset];
 
209
        }
 
210
}
 
211
 
 
212
static WRITE8_HANDLER( progolf_videoram_w )
 
213
{
 
214
        //if(progolf_gfx_switch & 0x40)
 
215
        videoram[offset] = data;
 
216
}
46
217
 
47
218
static ADDRESS_MAP_START( main_cpu, ADDRESS_SPACE_PROGRAM, 8 )
48
 
        AM_RANGE(0x0000, 0x0fff) AM_RAM
49
 
        AM_RANGE(0x1000, 0x1fff) AM_RAM //AM_WRITE(deco_charram_w) AM_BASE(&deco_charram)
50
 
        AM_RANGE(0x2000, 0x7fff) AM_RAM AM_BASE(&deco_charram) //AM_WRITE(deco_charram_w)
51
 
        AM_RANGE(0x9000, 0x9000) AM_WRITENOP //video control?
52
 
        AM_RANGE(0x9000, 0x9000) AM_READNOP
53
 
        AM_RANGE(0x9200, 0x9200) AM_WRITENOP
54
 
        AM_RANGE(0x9400, 0x9400) AM_WRITENOP
55
 
        AM_RANGE(0x9600, 0x9600) AM_WRITENOP
56
 
        AM_RANGE(0x9600, 0x9600) AM_READ_PORT("IN0")     /* VBLANK */
57
 
        AM_RANGE(0x9800, 0x9800) AM_READNOP
58
 
        AM_RANGE(0x9800, 0x9801) AM_WRITENOP // mc6845 regs
59
 
        AM_RANGE(0x9a00, 0x9a00) AM_WRITENOP
60
 
        AM_RANGE(0x9a00, 0x9a00) AM_READNOP
61
 
        AM_RANGE(0x9e00, 0x9e00) AM_WRITENOP
62
 
        AM_RANGE(0x8000, 0x83ff) AM_RAM AM_BASE(&btime_videoram) AM_SIZE(&btime_videoram_size)
63
 
        AM_RANGE(0x8400, 0x87ff) AM_RAM AM_BASE(&btime_colorram)
64
 
        AM_RANGE(0x8800, 0x881f) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
65
 
        AM_RANGE(0x8820, 0x8fff) AM_RAM
 
219
        AM_RANGE(0x0000, 0x5fff) AM_RAM
 
220
        AM_RANGE(0x6000, 0x7fff) AM_RAM_WRITE(progolf_charram_w) AM_BASE(&progolf_fbram)
 
221
        AM_RANGE(0x8000, 0x8fff) AM_READWRITE(progolf_videoram_r,progolf_videoram_w)
 
222
        AM_RANGE(0x9000, 0x9000) AM_READ_PORT("IN2") AM_WRITE(progolf_char_vregs_w)
 
223
        AM_RANGE(0x9200, 0x9200) AM_READ_PORT("P1") AM_WRITE(progolf_scrollx_hi_w) //p1 inputs
 
224
        AM_RANGE(0x9400, 0x9400) AM_READ_PORT("P2") AM_WRITE(progolf_scrollx_lo_w) //p2 inputs
 
225
        AM_RANGE(0x9600, 0x9600) AM_READ_PORT("IN0") AM_WRITE(progolf_flip_screen_w)   /* VBLANK */
 
226
        AM_RANGE(0x9800, 0x9800) AM_READ_PORT("DSW1")
 
227
        AM_RANGE(0x9800, 0x9800) AM_DEVWRITE("crtc", mc6845_address_w)
 
228
        AM_RANGE(0x9801, 0x9801) AM_DEVWRITE("crtc", mc6845_register_w)
 
229
        AM_RANGE(0x9a00, 0x9a00) AM_READ_PORT("DSW2") AM_WRITE(audio_command_w)
 
230
//  AM_RANGE(0x9e00, 0x9e00) AM_WRITENOP
66
231
        AM_RANGE(0xb000, 0xffff) AM_ROM
67
232
ADDRESS_MAP_END
68
233
 
72
237
        AM_RANGE(0x5000, 0x5fff) AM_DEVWRITE("ay1", ay8910_address_w)
73
238
        AM_RANGE(0x6000, 0x6fff) AM_DEVREADWRITE("ay2", ay8910_r, ay8910_data_w)
74
239
        AM_RANGE(0x7000, 0x7fff) AM_DEVWRITE("ay2", ay8910_address_w)
75
 
//  AM_RANGE(0x8000, 0x8fff) AM_WRITE(interrupt_enable_w) //???
76
 
        AM_RANGE(0x9000, 0xafff) AM_READ(soundlatch_r)
 
240
        AM_RANGE(0x8000, 0x8fff) AM_READ(audio_command_r) AM_WRITENOP //volume control?
77
241
        AM_RANGE(0xf000, 0xffff) AM_ROM
78
242
ADDRESS_MAP_END
79
243
 
 
244
static INPUT_CHANGED( coin_inserted )
 
245
{
 
246
        cputag_set_input_line(field->port->machine, "maincpu", INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE);
 
247
}
 
248
 
80
249
static INPUT_PORTS_START( progolf )
81
250
        PORT_START("IN0")
82
 
        PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
83
 
        PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
84
 
        PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
85
 
        PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
86
 
        PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
87
 
        PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
88
 
        PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
 
251
        PORT_DIPNAME( 0x01, 0x01, "IN0" )
 
252
        PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
 
253
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
254
        PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
 
255
        PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
 
256
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
257
        PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
 
258
        PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
 
259
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
260
        PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
 
261
        PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
 
262
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
263
        PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
 
264
        PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
 
265
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
266
        PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
 
267
        PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
 
268
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
269
        PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
 
270
        PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
 
271
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
89
272
        PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK )
90
273
 
91
 
        PORT_START("IN1")
92
 
        /* */
 
274
        PORT_START("P1")
 
275
        PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
 
276
        PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
 
277
        PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
 
278
        PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
 
279
        PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
 
280
        PORT_BIT( 0x60, IP_ACTIVE_HIGH, IPT_UNUSED )
 
281
        PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START1 )
93
282
 
94
283
        PORT_START("IN2")
95
 
        PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
96
 
        PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
97
 
        PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
98
 
        PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
99
 
        PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
100
 
        PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
101
 
        PORT_BIT( 0x40, IP_ACTIVE_HIGH,IPT_COIN1 ) PORT_IMPULSE(2)
102
 
        PORT_BIT( 0x80, IP_ACTIVE_HIGH,IPT_COIN2 ) PORT_IMPULSE(2)
 
284
        PORT_DIPNAME( 0x01, 0x01, "IN3" )
 
285
        PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
 
286
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
287
        PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
 
288
        PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
 
289
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
290
        PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
 
291
        PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
 
292
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
293
        PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
 
294
        PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
 
295
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
296
        PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
 
297
        PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
 
298
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
299
        PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
 
300
        PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
 
301
        PORT_DIPSETTING(    0x00, DEF_STR( On ) )
 
302
        PORT_BIT( 0x40, IP_ACTIVE_LOW,IPT_COIN1 ) PORT_CHANGED(coin_inserted, 0)
 
303
        PORT_BIT( 0x80, IP_ACTIVE_LOW,IPT_COIN2 ) PORT_CHANGED(coin_inserted, 0)
 
304
 
 
305
        PORT_START("P2")
 
306
        PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
 
307
        PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
 
308
        PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
 
309
        PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
 
310
        PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
 
311
        PORT_BIT( 0x60, IP_ACTIVE_HIGH, IPT_UNUSED )
 
312
        PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START2 )
 
313
 
 
314
        PORT_START("DSW1")
 
315
        PORT_DIPNAME( 0x01, 0x00, "DSW1" )
 
316
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
317
        PORT_DIPSETTING(    0x01, DEF_STR( On ) )
 
318
        PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
 
319
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
320
        PORT_DIPSETTING(    0x02, DEF_STR( On ) )
 
321
        PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
 
322
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
323
        PORT_DIPSETTING(    0x04, DEF_STR( On ) )
 
324
        PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
 
325
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
326
        PORT_DIPSETTING(    0x08, DEF_STR( On ) )
 
327
        PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
 
328
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
329
        PORT_DIPSETTING(    0x10, DEF_STR( On ) )
 
330
        PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
 
331
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
332
        PORT_DIPSETTING(    0x20, DEF_STR( On ) )
 
333
        PORT_BIT( 0x40, IP_ACTIVE_HIGH,IPT_SERVICE1 ) PORT_CHANGED(coin_inserted, 0)
 
334
        PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
 
335
 
 
336
        PORT_START("DSW2")
 
337
        PORT_DIPNAME( 0x01, 0x00, "DSW2" )
 
338
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
339
        PORT_DIPSETTING(    0x01, DEF_STR( On ) )
 
340
        PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
 
341
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
342
        PORT_DIPSETTING(    0x02, DEF_STR( On ) )
 
343
        PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
 
344
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
345
        PORT_DIPSETTING(    0x04, DEF_STR( On ) )
 
346
        PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
 
347
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
348
        PORT_DIPSETTING(    0x08, DEF_STR( On ) )
 
349
        PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
 
350
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
351
        PORT_DIPSETTING(    0x10, DEF_STR( On ) )
 
352
        PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
 
353
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
354
        PORT_DIPSETTING(    0x20, DEF_STR( On ) )
 
355
        PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
 
356
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
357
        PORT_DIPSETTING(    0x40, DEF_STR( On ) )
 
358
        PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
 
359
        PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
 
360
        PORT_DIPSETTING(    0x80, DEF_STR( On ) )
103
361
INPUT_PORTS_END
104
362
 
105
 
static const gfx_layout charlayout =
106
 
{
107
 
        8,8,    /* 8*8 characters */
108
 
        1024,   /* 1024 characters */
109
 
        3,      /* 3 bits per pixel */
110
 
        { 2*1024*8*8, 1024*8*8, 0 },    /* the bitplanes are separated */
111
 
        { 0, 1, 2, 3, 4, 5, 6, 7 },
112
 
        { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
113
 
        8*8     /* every char takes 8 consecutive bytes */
114
 
};
115
 
 
116
 
static const gfx_layout spritelayout =
117
 
{
118
 
        16,16,  /* 16*16 sprites */
119
 
        256,    /* 256 sprites */
120
 
        3,      /* 3 bits per pixel */
121
 
        { 2*256*16*16, 256*16*16, 0 },  /* the bitplanes are separated */
122
 
        { 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7,
123
 
          0, 1, 2, 3, 4, 5, 6, 7 },
124
 
        { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
125
 
          8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
126
 
        32*8    /* every sprite takes 32 consecutive bytes */
127
 
};
128
 
 
129
363
static const gfx_layout progolf_charlayout =
130
364
{
131
365
        8,8,                    /* 8*8 characters */
137
371
        8*8     /* every char takes 8 consecutive bytes */
138
372
};
139
373
 
140
 
static const gfx_layout progolf_charlayout2 =
141
 
{
142
 
        8,8,                    /* 8*8 characters */
143
 
        RGN_FRAC(1,1),  /* 512 characters */
144
 
        1,                              /* 3 bits per pixel */
145
 
        { 0 },  /* the bitplanes are separated */
146
 
        { 0, 1, 2, 3, 4, 5, 6, 7 },
147
 
        { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
148
 
        8*8     /* every char takes 8 consecutive bytes */
149
 
};
150
 
 
151
 
#if 1
152
 
static const gfx_layout progolf_spritelayout2 =
153
 
{
154
 
        16,16,  /* 16*16 sprites */
155
 
        RGN_FRAC(1,1),    /* 256 sprites */
156
 
        1,//3,      /* 3 bits per pixel */
157
 
        { 0},//RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) },  /* the bitplanes are separated */
158
 
        { 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7,
159
 
          0, 1, 2, 3, 4, 5, 6, 7 },
160
 
        { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
161
 
          8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
162
 
        32*8    /* every sprite takes 32 consecutive bytes */
163
 
};
164
 
#endif
165
374
static GFXDECODE_START( progolf )
166
375
        GFXDECODE_ENTRY( "gfx1", 0x0000, progolf_charlayout, 0, 8 ) /* sprites */
167
 
        GFXDECODE_ENTRY( NULL,           0x2000, charlayout,           0, 4 ) /* char set #1 */
168
 
        GFXDECODE_ENTRY( NULL,           0x2000, spritelayout,         0, 4 ) /* sprites */
169
 
 
170
 
//  GFXDECODE_ENTRY( "gfx2", 0x0000, progolf_charlayout2, 0, 8 ) /* sprites */
171
 
//  GFXDECODE_ENTRY( "gfx2", 0x0000, progolf_spritelayout2, 0, 8 ) /* sprites */
172
376
GFXDECODE_END
173
377
 
174
378
 
175
 
#ifdef UNUSED_FUNCTION
 
379
//#ifdef UNUSED_FUNCTION
176
380
static INTERRUPT_GEN( progolf_interrupt )
177
381
{
178
 
        //if (input_port_read(machine, "IN2") & 0xc0)
179
 
                cpu_set_input_line(device, /*0*/INPUT_LINE_NMI, /*HOLD_LINE*/PULSE_LINE);
180
 
}
181
 
#endif
 
382
}
 
383
//#endif
 
384
 
 
385
static const mc6845_interface mc6845_intf =
 
386
{
 
387
        "screen",       /* screen we are acting on */
 
388
        8,                      /* number of pixels per video memory address */
 
389
        NULL,           /* before pixel update callback */
 
390
        NULL,           /* row update callback */
 
391
        NULL,           /* after pixel update callback */
 
392
        DEVCB_NULL,     /* callback for display state changes */
 
393
        DEVCB_NULL,     /* callback for cursor state changes */
 
394
        DEVCB_NULL,     /* HSYNC callback */
 
395
        DEVCB_NULL,     /* VSYNC callback */
 
396
        NULL            /* update address callback */
 
397
 
 
398
};
 
399
 
 
400
static PALETTE_INIT( progolf )
 
401
{
 
402
        int i;
 
403
 
 
404
        for (i = 0;i < machine->config->total_colors;i++)
 
405
        {
 
406
                int bit0,bit1,bit2,r,g,b;
 
407
 
 
408
                /* red component */
 
409
                bit0 = (color_prom[i] >> 0) & 0x01;
 
410
                bit1 = (color_prom[i] >> 1) & 0x01;
 
411
                bit2 = (color_prom[i] >> 2) & 0x01;
 
412
                r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
 
413
                /* green component */
 
414
                bit0 = (color_prom[i] >> 3) & 0x01;
 
415
                bit1 = (color_prom[i] >> 4) & 0x01;
 
416
                bit2 = (color_prom[i] >> 5) & 0x01;
 
417
                g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
 
418
                /* blue component */
 
419
                bit0 = 0;
 
420
                bit1 = (color_prom[i] >> 6) & 0x01;
 
421
                bit2 = (color_prom[i] >> 7) & 0x01;
 
422
                b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
 
423
 
 
424
                palette_set_color(machine,i,MAKE_RGB(r,g,b));
 
425
        }
 
426
}
182
427
 
183
428
static MACHINE_DRIVER_START( progolf )
184
429
        /* basic machine hardware */
185
 
        MDRV_CPU_ADD("maincpu", M6502, 2000000)          /* ? */
 
430
        MDRV_CPU_ADD("maincpu", M6502, 3000000/2) /* guess, 3 Mhz makes the game to behave worse? */
186
431
        MDRV_CPU_PROGRAM_MAP(main_cpu)
187
 
//  MDRV_CPU_VBLANK_INT("screen", progolf_interrupt)
 
432
        MDRV_CPU_VBLANK_INT("screen", progolf_interrupt)
188
433
 
189
434
        MDRV_CPU_ADD("audiocpu", M6502, 500000)
190
435
        MDRV_CPU_PROGRAM_MAP(sound_cpu)
191
 
//  MDRV_CPU_VBLANK_INT("screen",nmi_line_pulse)
 
436
 
 
437
        MDRV_QUANTUM_PERFECT_CPU("maincpu")
192
438
 
193
439
        /* video hardware */
194
440
        MDRV_SCREEN_ADD("screen", RASTER)
200
446
 
201
447
        MDRV_GFXDECODE(progolf)
202
448
        MDRV_PALETTE_LENGTH(32*3)
203
 
 
204
 
        MDRV_PALETTE_INIT(btime)
205
 
 
206
 
        MDRV_VIDEO_START(btime)
 
449
        MDRV_PALETTE_INIT(progolf)
 
450
 
 
451
        MDRV_MC6845_ADD("crtc", MC6845, 3000000/4, mc6845_intf) /* hand tuned to get ~57 fps */
 
452
        MDRV_VIDEO_START(progolf)
207
453
        MDRV_VIDEO_UPDATE(progolf)
208
454
 
209
455
        /* sound hardware */
210
456
        MDRV_SPEAKER_STANDARD_MONO("mono")
211
457
 
212
 
        MDRV_SOUND_ADD("ay1", AY8910, 1500000)
 
458
        MDRV_SOUND_ADD("ay1", AY8910, 12000000/8)
213
459
        MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23)
214
460
 
215
 
        MDRV_SOUND_ADD("ay2", AY8910, 1500000)
 
461
        MDRV_SOUND_ADD("ay2", AY8910, 12000000/8)
216
462
        MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23)
217
463
MACHINE_DRIVER_END
218
464
 
228
474
        ROM_REGION( 0x10000, "audiocpu", 0 )
229
475
        ROM_LOAD( "g6-m.1b",      0xf000, 0x1000, CRC(0c6fadf5) SHA1(9af2c2152b339cadab7aff0b0164d4431d2558bd) )
230
476
 
231
 
        ROM_REGION( 0x3000, "gfx1", ROMREGION_DISPOSE )
 
477
        ROM_REGION( 0x3000, "gfx1", 0 )
232
478
        ROM_LOAD( "g7-m.7a",      0x0000, 0x1000, CRC(16b42975) SHA1(29268a8a660781ff0de77b3b1bfc16edff7be134) )
233
479
        ROM_LOAD( "g8-m.9a",      0x1000, 0x1000, CRC(cf3f35da) SHA1(06acc29a5e282b5a9960eabebdb1a529910286b6) )
234
480
        ROM_LOAD( "g9-m.10a",     0x2000, 0x1000, CRC(7712e248) SHA1(4e7dd12d323cf8378adb1e32a763a1799e2b4bdc) )
240
486
ROM_END
241
487
 
242
488
ROM_START( progolfa )
243
 
        ROM_REGION( 0x10000, "maincpu", 0 )
 
489
        ROM_REGION( 0x10000, "maincpu", 0 ) // custom DECO CPU-6 module
244
490
        ROM_LOAD( "g4-m.a3",      0xb000, 0x1000, CRC(015a08d9) SHA1(671d5cd708e098dbda3e495a8b4ce3393c6971da) )
245
491
        ROM_LOAD( "g3-m.a4",      0xc000, 0x1000, CRC(c1339da5) SHA1(e9728dcc5f67fbe79eea818ba48421c46d9e63e9) )
246
492
        ROM_LOAD( "g2-m.a6",      0xd000, 0x1000, CRC(fafec36e) SHA1(70880d6f9b11505d466f36c12a43361ee2639fed) )
250
496
        ROM_REGION( 0x10000, "audiocpu", 0 )
251
497
        ROM_LOAD( "g5-m.b1",      0xf000, 0x1000, CRC(0c6fadf5) SHA1(9af2c2152b339cadab7aff0b0164d4431d2558bd) )
252
498
 
253
 
        ROM_REGION( 0x3000, "gfx1", ROMREGION_DISPOSE )
 
499
        ROM_REGION( 0x3000, "gfx1", 0 )
254
500
        ROM_LOAD( "g7-m.a8",      0x0000, 0x1000, CRC(16b42975) SHA1(29268a8a660781ff0de77b3b1bfc16edff7be134) )
255
501
        ROM_LOAD( "g8-m.a9",      0x1000, 0x1000, CRC(cf3f35da) SHA1(06acc29a5e282b5a9960eabebdb1a529910286b6) )
256
502
        ROM_LOAD( "g9-m.a10",     0x2000, 0x1000, CRC(7712e248) SHA1(4e7dd12d323cf8378adb1e32a763a1799e2b4bdc) )
272
518
        memory_set_decrypted_region(space,0x0000,0xffff, decrypted);
273
519
 
274
520
        /* Swap bits 5 & 6 for opcodes */
275
 
        for (A = 0;A < 0x10000;A++)
 
521
        for (A = 0xb000 ; A < 0x10000 ; A++)
276
522
                decrypted[A] = BITSWAP8(rom[A],7,5,6,4,3,2,1,0);
277
523
}
278
524
 
279
 
/*Maybe progolf is a bootleg and progolfa is the original (with Deco C10707 as CPU)?*/
280
 
GAME( 1981, progolf,  0,       progolf, progolf, progolf, ROT270, "Data East Corporation", "18 Holes Pro Golf (set 1)", GAME_NOT_WORKING )
281
 
GAME( 1981, progolfa, progolf, progolf, progolf, progolf, ROT270, "Data East Corporation", "18 Holes Pro Golf (set 2)", GAME_NOT_WORKING ) // doesn't display anything
 
525
static DRIVER_INIT( progolfa )
 
526
{
 
527
        int A;
 
528
        const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
 
529
        UINT8 *rom = memory_region(machine, "maincpu");
 
530
        UINT8* decrypted = auto_alloc_array(machine, UINT8, 0x10000);
 
531
 
 
532
        memory_set_decrypted_region(space,0x0000,0xffff, decrypted);
 
533
 
 
534
        /* data is likely to not be encrypted, just the opcodes are. */
 
535
        for (A = 0x0000 ; A < 0x10000 ; A++)
 
536
        {
 
537
                if (A & 1)
 
538
                        decrypted[A] = BITSWAP8(rom[A],6,4,7,5,3,2,1,0);
 
539
                else
 
540
                        decrypted[A] = rom[A];
 
541
        }
 
542
}
 
543
 
 
544
/* Maybe progolf is a bootleg? progolfa uses DECO CPU-6 as custom module CPU (the same as Zoar) */
 
545
GAME( 1981, progolf,  0,       progolf, progolf, progolf,  ROT270, "Data East Corporation", "18 Holes Pro Golf (set 1)", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS )
 
546
GAME( 1981, progolfa, progolf, progolf, progolf, progolfa, ROT270, "Data East Corporation", "18 Holes Pro Golf (set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL )