1
/***************************************************************************
5
preliminary driver by Angelo Salese
7
****************************************************************************/
10
#include "cpu/i86/i86.h"
11
#include "machine/wd17xx.h"
12
#include "imagedev/flopdrv.h"
13
#include "cpu/z80/z80daisy.h"
14
#include "machine/z80ctc.h"
15
#include "imagedev/flopdrv.h"
16
#include "formats/basicdsk.h"
18
class act_state : public driver_device
21
act_state(const machine_config &mconfig, device_type type, const char *tag)
22
: driver_device(mconfig, type, tag) { }
31
static VIDEO_START( act_f1 )
35
static SCREEN_UPDATE( act_f1 )
37
act_state *state = screen->machine().driver_data<act_state>();
51
pen[0] = (state->m_vram[state->m_scrollram[y]+x_count])>>(7-i) & 1;
52
pen[1] = (state->m_vram[state->m_scrollram[y]+x_count])>>(15-i) & 1;
54
color = pen[0]|pen[1]<<1;
56
const rectangle &visarea = screen->visible_area();
57
if((x+i)<=visarea.max_x && ((y)+0)<visarea.max_y)
58
*BITMAP_ADDR16(bitmap, y, x+i) = screen->machine().pens[color];
69
//static UINT8 fdc_irq_flag;
70
//static UINT8 fdc_drq_flag;
71
//static UINT8 fdc_side;
72
//static UINT8 fdc_drive;
74
static READ8_HANDLER( act_fdc_r )
76
act_state *state = space->machine().driver_data<act_state>();
77
device_t* dev = space->machine().device("fdc");
79
// printf("%02x\n",offset);
81
floppy_mon_w(floppy_get_device(space->machine(), state->m_fdrv_num), CLEAR_LINE);
82
floppy_drive_set_ready_state(floppy_get_device(space->machine(), state->m_fdrv_num), 1,0);
87
return wd17xx_status_r(dev,offset);
89
return wd17xx_track_r(dev,offset);
91
return wd17xx_sector_r(dev,offset);
93
return wd17xx_data_r(dev,offset);
95
logerror("FDC: read from %04x\n",offset);
102
static WRITE8_HANDLER( act_fdc_w )
104
act_state *state = space->machine().driver_data<act_state>();
105
device_t* dev = space->machine().device("fdc");
107
// printf("%02x %02x\n",offset,data);
109
floppy_mon_w(floppy_get_device(space->machine(), state->m_fdrv_num), CLEAR_LINE);
110
floppy_drive_set_ready_state(floppy_get_device(space->machine(), state->m_fdrv_num), 1,0);
115
wd17xx_command_w(dev,offset,data);
118
wd17xx_track_w(dev,offset,data);
121
wd17xx_sector_w(dev,offset,data);
124
wd17xx_data_w(dev,offset,data);
127
logerror("FDC: write to %04x = %02x\n",offset,data);
132
static READ16_HANDLER( act_pal_r )
134
act_state *state = space->machine().driver_data<act_state>();
136
return state->m_paletteram[offset];
139
static WRITE16_HANDLER( act_pal_w )
141
act_state *state = space->machine().driver_data<act_state>();
143
COMBINE_DATA(&state->m_paletteram[offset]);
145
if(ACCESSING_BITS_0_7 && offset) //TODO: offset 0 looks bogus
147
i = state->m_paletteram[offset] & 1;
148
r = ((state->m_paletteram[offset] & 2)>>0) | i;
149
g = ((state->m_paletteram[offset] & 4)>>1) | i;
150
b = ((state->m_paletteram[offset] & 8)>>2) | i;
152
palette_set_color_rgb(space->machine(), offset, pal2bit(r), pal2bit(g), pal2bit(b));
156
static ADDRESS_MAP_START(act_f1_mem, AS_PROGRAM, 16)
157
ADDRESS_MAP_UNMAP_HIGH
158
AM_RANGE(0x01e00,0x01fff) AM_RAM AM_BASE_MEMBER(act_state,m_scrollram)
159
AM_RANGE(0xe0000,0xe001f) AM_READWRITE(act_pal_r,act_pal_w) AM_BASE_MEMBER(act_state,m_paletteram)
160
AM_RANGE(0x00000,0xeffff) AM_RAM AM_BASE_MEMBER(act_state,m_vram)
161
AM_RANGE(0xf0000,0xf7fff) AM_RAM
162
AM_RANGE(0xf8000,0xfffff) AM_ROM
165
static WRITE8_HANDLER( actf1_sys_w )
167
// static UINT8 cur_fdrv;
168
// device_t* dev = space->machine().device("fdc");
173
// cur_fdrv = ~data & 1;
174
// wd17xx_set_drive(dev,cur_fdrv);
177
// wd17xx_set_side(dev,data ? 1 : 0);
180
// floppy_drive_set_motor_state(floppy_get_device(space->machine(), cur_fdrv), data);
181
// floppy_drive_set_ready_state(floppy_get_device(space->machine(), cur_fdrv), data,0);
184
// data ? 256 : 200 line mode
188
// data ? 80 : 40 columns mode
189
// data ? 14 Mhz : 7 Mhz Pixel clock
200
static ADDRESS_MAP_START( act_f1_io , AS_IO, 16)
201
ADDRESS_MAP_UNMAP_HIGH
202
AM_RANGE(0x0000, 0x000f) AM_WRITE8(actf1_sys_w,0x00ff)
203
AM_RANGE(0x0010, 0x0017) AM_DEVREADWRITE8("ctc",z80ctc_r,z80ctc_w,0x00ff)
204
// AM_RANGE(0x0020, 0x0027) z80 sio (!)
205
// AM_RANGE(0x0030, 0x0031) AM_WRITE8(ctc_ack_w,0x00ff)
206
AM_RANGE(0x0040, 0x0047) AM_READWRITE8(act_fdc_r, act_fdc_w,0x00ff)
207
// AM_RANGE(0x01e0, 0x01ff) winchester
211
static INPUT_PORTS_START( act )
215
static MACHINE_RESET(act)
220
static const gfx_layout charset_8x8 =
226
{ 0, 1, 2, 3, 4, 5, 6, 7 },
227
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
231
static GFXDECODE_START( act_f1 )
232
GFXDECODE_ENTRY( "gfx", 0x00000, charset_8x8, 0x000, 1 )
235
static Z80CTC_INTERFACE( ctc_intf )
238
DEVCB_NULL, // interrupt handler
239
DEVCB_NULL, // ZC/TO0 callback
240
DEVCB_NULL, // ZC/TO1 callback
241
DEVCB_NULL, // ZC/TO2 callback
246
static const z80sio_interface sio_intf =
248
0, /* interrupt handler */
249
0, /* DTR changed handler */
250
0, /* RTS changed handler */
251
0, /* BREAK changed handler */
252
0, /* transmit handler */
253
0 /* receive handler */
258
static const z80_daisy_config x1_daisy[] =
265
static INTERRUPT_GEN( act_f1_irq )
267
//if(device->machine().input().code_pressed(KEYCODE_C))
268
// device_set_input_line_and_vector(device,0,HOLD_LINE,0x60);
271
static FLOPPY_OPTIONS_START( act )
272
FLOPPY_OPTION( img2hd, "dsk", "2HD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
277
FIRST_SECTOR_ID([1]))
280
static const floppy_interface act_floppy_interface =
287
FLOPPY_STANDARD_5_25_DSHD,
288
FLOPPY_OPTIONS_NAME(act),
293
static MACHINE_CONFIG_START( act_f1, act_state )
295
/* basic machine hardware */
296
MCFG_CPU_ADD("maincpu", I8086, 4670000)
297
MCFG_CPU_PROGRAM_MAP(act_f1_mem)
298
MCFG_CPU_IO_MAP(act_f1_io)
299
MCFG_CPU_VBLANK_INT("screen",act_f1_irq )
300
// MCFG_CPU_CONFIG(x1_daisy)
302
MCFG_Z80CTC_ADD( "ctc", 4670000 , ctc_intf )
304
MCFG_MACHINE_RESET(act)
307
MCFG_SCREEN_ADD("screen", RASTER)
308
MCFG_SCREEN_REFRESH_RATE(50)
309
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
310
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
311
MCFG_SCREEN_SIZE(640, 256)
312
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1)
313
MCFG_SCREEN_UPDATE(act_f1)
315
MCFG_PALETTE_LENGTH(16)
316
// MCFG_PALETTE_INIT(black_and_white)
318
MCFG_WD2793_ADD("fdc", default_wd17xx_interface_2_drives )
320
MCFG_GFXDECODE(act_f1)
322
MCFG_VIDEO_START(act_f1)
324
MCFG_FLOPPY_2_DRIVES_ADD(act_floppy_interface)
329
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF )
330
ROM_LOAD16_BYTE( "lo_f1_1.6.8f", 0xf8000, 0x4000, CRC(be018be2) SHA1(80b97f5b2111daf112c69b3f58d1541a4ba69da0) ) // Labelled F1 - LO Vr. 1.6
331
ROM_LOAD16_BYTE( "hi_f1_1.6.10f", 0xf8001, 0x4000, CRC(bbba77e2) SHA1(e62bed409eb3198f4848f85fccd171cd0745c7c0) ) // Labelled F1 - HI Vr. 1.6
333
ROM_REGION( 0x00800, "gfx", ROMREGION_ERASEFF )
334
ROM_COPY( "maincpu", 0xf8800, 0x00000, 0x00800 )
338
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF )
339
ROM_LOAD16_BYTE( "lo_f10_3.1.1.8f", 0xf8000, 0x4000, CRC(bfd46ada) SHA1(0a36ef379fa9af7af9744b40c167ce6e12093485) ) // Labelled LO-FRange Vr3.1.1
340
ROM_LOAD16_BYTE( "hi_f10_3.1.1.10f", 0xf8001, 0x4000, CRC(67ad5b3a) SHA1(a5ececb87476a30167cf2a4eb35c03aeb6766601) ) // Labelled HI-FRange Vr3.1.1
342
ROM_REGION( 0x00800, "gfx", ROMREGION_ERASEFF )
343
ROM_COPY( "maincpu", 0xf8800, 0x00000, 0x00800 )
347
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF )
348
ROM_LOAD16_BYTE( "lo_fp_3.1.ic20", 0xf8000, 0x4000, CRC(0572add2) SHA1(c7ab0e5ced477802e37f9232b5673f276b8f5623) ) // Labelled 11212721 F97E PORT LO VR 3.1
349
ROM_LOAD16_BYTE( "hi_fp_3.1.ic9", 0xf8001, 0x4000, CRC(3903674b) SHA1(8418682dcc0c52416d7d851760fea44a3cf2f914) ) // Labelled 11212721 BD2D PORT HI VR 3.1
351
ROM_REGION( 0x00800, "gfx", ROMREGION_ERASEFF )
352
ROM_COPY( "maincpu", 0xf8800, 0x00000, 0x00800 )
357
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
358
COMP( 1984, aprif1, 0, 0, act_f1, act, 0, "ACT", "Apricot F1", GAME_NOT_WORKING | GAME_NO_SOUND )
359
COMP( 1985, aprif10, 0, 0, act_f1, act, 0, "ACT", "Apricot F10", GAME_NOT_WORKING | GAME_NO_SOUND )
360
COMP( 1984, aprifp, 0, 0, act_f1, act, 0, "ACT", "Apricot Portable / FP", GAME_NOT_WORKING | GAME_NO_SOUND )