72
72
pcxt_state(const machine_config &mconfig, device_type type, const char *tag)
73
: driver_device(mconfig, type, tag) { }
73
: driver_device(mconfig, type, tag),
74
m_pit8253(*this,"pit8253"),
75
m_pic8259_1(*this,"pic8259_1"),
76
m_pic8259_2(*this,"pic8259_2"),
77
m_dma8237_1(*this,"dma8237_1") { }
86
90
UINT8 m_at_pages[0x10];
87
91
UINT8 m_pc_spkrdata, m_pc_input;
90
device_t *m_pic8259_1;
91
device_t *m_pic8259_2;
92
device_t *m_dma8237_1;
93
device_t *m_dma8237_2;
93
required_device<device_t> m_pit8253;
94
required_device<device_t> m_pic8259_1;
95
required_device<device_t> m_pic8259_2;
96
required_device<device_t> m_dma8237_1;
98
DECLARE_READ8_MEMBER(disk_iobank_r);
99
DECLARE_WRITE8_MEMBER(disk_iobank_w);
100
DECLARE_READ8_MEMBER(fdc765_status_r);
101
DECLARE_READ8_MEMBER(fdc765_data_r);
102
DECLARE_WRITE8_MEMBER(fdc765_data_w);
103
DECLARE_WRITE8_MEMBER(drive_selection_w);
104
DECLARE_READ8_MEMBER(pc_dma_read_byte);
105
DECLARE_WRITE8_MEMBER(pc_dma_write_byte);
106
DECLARE_READ8_MEMBER(dma_page_select_r);
107
DECLARE_WRITE8_MEMBER(dma_page_select_w);
108
DECLARE_WRITE8_MEMBER(tetriskr_bg_bank_w);
96
111
static SCREEN_UPDATE_RGB32( tetriskr )
135
static READ8_HANDLER( disk_iobank_r )
150
READ8_MEMBER(pcxt_state::disk_iobank_r)
137
pcxt_state *state = space->machine().driver_data<pcxt_state>();
138
//printf("Read Prototyping card [%02x] @ PC=%05x\n",offset,cpu_get_pc(&space->device()));
139
//if(offset == 0) return input_port_read(space->machine(), "DSW");
140
if(offset == 1) return input_port_read(space->machine(), "IN1");
152
//printf("Read Prototyping card [%02x] @ PC=%05x\n",offset,cpu_get_pc(&space.device()));
153
//if(offset == 0) return ioport("DSW")->read();
154
if(offset == 1) return ioport("IN1")->read();
142
return state->m_disk_data[offset];
156
return m_disk_data[offset];
145
static WRITE8_HANDLER( disk_iobank_w )
159
WRITE8_MEMBER(pcxt_state::disk_iobank_w)
147
pcxt_state *state = space->machine().driver_data<pcxt_state>();
149
162
BIOS does a single out $0310,$F0 on reset
178
if((state->m_lastvalue == 0xF0) && (data == 0xF2))
191
if((m_lastvalue == 0xF0) && (data == 0xF2))
180
else if ((state->m_lastvalue == 0xF1) && (data == 0xF2))
193
else if ((m_lastvalue == 0xF1) && (data == 0xF2))
182
else if ((state->m_lastvalue == 0xF0) && (data == 0xF3))
195
else if ((m_lastvalue == 0xF0) && (data == 0xF3))
184
else if ((state->m_lastvalue == 0xF1) && (data == 0xF3))
197
else if ((m_lastvalue == 0xF1) && (data == 0xF3))
188
201
// printf("newbank = %d\n", newbank);
190
if (newbank != state->m_bank)
203
if (newbank != m_bank)
192
state->m_bank = newbank;
193
memory_set_bankptr(space->machine(), "bank1",space->machine().region("game_prg")->base() + 0x10000 * state->m_bank );
206
membank("bank1")->set_base(machine().root_device().memregion("game_prg")->base() + 0x10000 * m_bank );
196
state->m_lastvalue = data;
198
state->m_disk_data[offset] = data;
211
m_disk_data[offset] = data;
201
214
/*********************************
331
344
cputag_set_input_line(device->machine(), "maincpu", INPUT_LINE_RESET, PULSE_LINE);
335
static const ppi8255_interface filetto_ppi8255_intf[2] =
338
DEVCB_HANDLER(port_a_r), /* Port A read */
339
DEVCB_HANDLER(port_b_r), /* Port B read */
340
DEVCB_HANDLER(port_c_r), /* Port C read */
341
DEVCB_NULL, /* Port A write */
342
DEVCB_HANDLER(port_b_w), /* Port B write */
343
DEVCB_NULL /* Port C write */
346
DEVCB_NULL, /* Port A read */
347
DEVCB_NULL, /* Port B read */
348
DEVCB_NULL, /* Port C read */
349
DEVCB_HANDLER(wss_1_w), /* Port A write */
350
DEVCB_HANDLER(wss_2_w), /* Port B write */
351
DEVCB_HANDLER(sys_reset_w) /* Port C write */
347
static I8255A_INTERFACE( ppi8255_0_intf )
349
DEVCB_HANDLER(port_a_r), /* Port A read */
350
DEVCB_NULL, /* Port A write */
351
DEVCB_HANDLER(port_b_r), /* Port B read */
352
DEVCB_HANDLER(port_b_w), /* Port B write */
353
DEVCB_HANDLER(port_c_r), /* Port C read */
354
DEVCB_NULL /* Port C write */
357
static I8255A_INTERFACE( ppi8255_1_intf )
359
DEVCB_NULL, /* Port A read */
360
DEVCB_HANDLER(wss_1_w), /* Port A write */
361
DEVCB_NULL, /* Port B read */
362
DEVCB_HANDLER(wss_2_w), /* Port B write */
363
DEVCB_NULL, /* Port C read */
364
DEVCB_HANDLER(sys_reset_w) /* Port C write */
355
368
/*Floppy Disk Controller 765 device*/
356
369
/*Currently we only emulate it at a point that the BIOS will pass the checks*/
359
372
#define FDC_WRITE 0x40
360
373
#define FDC_READ 0x00 /*~0x40*/
362
static READ8_HANDLER( fdc765_status_r )
375
READ8_MEMBER(pcxt_state::fdc765_status_r)
364
pcxt_state *state = space->machine().driver_data<pcxt_state>();
366
// popmessage("Read FDC status @ PC=%05x",cpu_get_pc(&space->device()));
367
tmp = state->m_status | 0x80;
368
state->m_clr_status++;
369
if(state->m_clr_status == 0x10)
378
// popmessage("Read FDC status @ PC=%05x",cpu_get_pc(&space.device()));
379
tmp = m_status | 0x80;
381
if(m_clr_status == 0x10)
372
state->m_clr_status = 0;
377
static READ8_HANDLER( fdc765_data_r )
389
READ8_MEMBER(pcxt_state::fdc765_data_r)
379
pcxt_state *state = space->machine().driver_data<pcxt_state>();
380
state->m_status = (FDC_READ);
391
m_status = (FDC_READ);
384
static WRITE8_HANDLER( fdc765_data_w )
395
WRITE8_MEMBER(pcxt_state::fdc765_data_w)
386
pcxt_state *state = space->machine().driver_data<pcxt_state>();
387
state->m_status = (FDC_WRITE);
397
m_status = (FDC_WRITE);
391
static WRITE8_HANDLER( drive_selection_w )
401
WRITE8_MEMBER(pcxt_state::drive_selection_w)
393
// pcxt_state *state = space->machine().driver_data<pcxt_state>();
395
404
/* TODO: properly hook-up upd765 FDC there */
396
pic8259_ir6_w(space->machine().device("pic8259_1"), 1);
405
pic8259_ir6_w(machine().device("pic8259_1"), 1);
399
408
/******************
413
static READ8_HANDLER( pc_dma_read_byte )
415
pcxt_state *state = space->machine().driver_data<pcxt_state>();
416
offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16)
419
return space->read_byte(page_offset + offset);
423
static WRITE8_HANDLER( pc_dma_write_byte )
425
pcxt_state *state = space->machine().driver_data<pcxt_state>();
426
offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16)
429
space->write_byte(page_offset + offset, data);
432
static READ8_HANDLER(dma_page_select_r)
434
pcxt_state *state = space->machine().driver_data<pcxt_state>();
435
UINT8 data = state->m_at_pages[offset % 0x10];
422
READ8_MEMBER(pcxt_state::pc_dma_read_byte)
424
offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
427
return space.read_byte(page_offset + offset);
431
WRITE8_MEMBER(pcxt_state::pc_dma_write_byte)
433
offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
436
space.write_byte(page_offset + offset, data);
439
READ8_MEMBER(pcxt_state::dma_page_select_r)
441
UINT8 data = m_at_pages[offset % 0x10];
437
443
switch(offset % 8) {
439
data = state->m_dma_offset[(offset / 8) & 1][2];
445
data = m_dma_offset[(offset / 8) & 1][2];
442
data = state->m_dma_offset[(offset / 8) & 1][3];
448
data = m_dma_offset[(offset / 8) & 1][3];
445
data = state->m_dma_offset[(offset / 8) & 1][1];
451
data = m_dma_offset[(offset / 8) & 1][1];
448
data = state->m_dma_offset[(offset / 8) & 1][0];
454
data = m_dma_offset[(offset / 8) & 1][0];
455
static WRITE8_HANDLER(dma_page_select_w)
461
WRITE8_MEMBER(pcxt_state::dma_page_select_w)
457
pcxt_state *state = space->machine().driver_data<pcxt_state>();
458
state->m_at_pages[offset % 0x10] = data;
463
m_at_pages[offset % 0x10] = data;
460
465
switch(offset % 8) {
462
state->m_dma_offset[(offset / 8) & 1][2] = data;
467
m_dma_offset[(offset / 8) & 1][2] = data;
465
state->m_dma_offset[(offset / 8) & 1][3] = data;
470
m_dma_offset[(offset / 8) & 1][3] = data;
468
state->m_dma_offset[(offset / 8) & 1][1] = data;
473
m_dma_offset[(offset / 8) & 1][1] = data;
471
state->m_dma_offset[(offset / 8) & 1][0] = data;
476
m_dma_offset[(offset / 8) & 1][0] = data;
489
494
DEVCB_LINE(pc_dma_hrq_changed),
491
DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte),
492
DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte),
496
DEVCB_DRIVER_MEMBER(pcxt_state, pc_dma_read_byte),
497
DEVCB_DRIVER_MEMBER(pcxt_state, pc_dma_write_byte),
493
498
{ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL },
494
499
{ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL },
495
500
{ DEVCB_LINE(pc_dack0_w), DEVCB_LINE(pc_dack1_w), DEVCB_LINE(pc_dack2_w), DEVCB_LINE(pc_dack3_w) }
533
538
return pic8259_acknowledge(state->m_pic8259_1);
536
static ADDRESS_MAP_START( filetto_map, AS_PROGRAM, 8 )
541
static ADDRESS_MAP_START( filetto_map, AS_PROGRAM, 8, pcxt_state )
537
542
AM_RANGE(0x00000, 0x9ffff) AM_RAM //work RAM 640KB
538
543
AM_RANGE(0xa0000, 0xbffff) AM_RAM //CGA VRAM
539
544
AM_RANGE(0xc0000, 0xcffff) AM_ROMBANK("bank1")
541
546
AM_RANGE(0xf0000, 0xfffff) AM_ROM
544
static ADDRESS_MAP_START( pcxt_io_common, AS_IO, 8 )
549
static ADDRESS_MAP_START( pcxt_io_common, AS_IO, 8, pcxt_state )
545
550
ADDRESS_MAP_GLOBAL_MASK(0x3ff)
546
AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237_1", i8237_r, i8237_w ) //8237 DMA Controller
547
AM_RANGE(0x0020, 0x002f) AM_DEVREADWRITE("pic8259_1", pic8259_r, pic8259_w ) //8259 Interrupt control
548
AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE("pit8253", pit8253_r, pit8253_w) //8253 PIT
549
AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255_0", ppi8255_r, ppi8255_w) //PPI 8255
550
AM_RANGE(0x0064, 0x0066) AM_DEVREADWRITE("ppi8255_1", ppi8255_r, ppi8255_w) //PPI 8255
551
AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE_MODERN("rtc", mc146818_device, read, write)
551
AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE_LEGACY("dma8237_1", i8237_r, i8237_w ) //8237 DMA Controller
552
AM_RANGE(0x0020, 0x002f) AM_DEVREADWRITE_LEGACY("pic8259_1", pic8259_r, pic8259_w ) //8259 Interrupt control
553
AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w) //8253 PIT
554
AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255_0", i8255_device, read, write) //PPI 8255
555
AM_RANGE(0x0064, 0x0066) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) //PPI 8255
556
AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE("rtc", mc146818_device, read, write)
552
557
AM_RANGE(0x0080, 0x0087) AM_READWRITE(dma_page_select_r,dma_page_select_w)
553
AM_RANGE(0x00a0, 0x00af) AM_DEVREADWRITE("pic8259_2", pic8259_r, pic8259_w )
558
AM_RANGE(0x00a0, 0x00af) AM_DEVREADWRITE_LEGACY("pic8259_2", pic8259_r, pic8259_w )
554
559
AM_RANGE(0x0278, 0x027f) AM_RAM //printer (parallel) port latch
555
560
AM_RANGE(0x02f8, 0x02ff) AM_RAM //Modem port
556
561
AM_RANGE(0x0378, 0x037f) AM_RAM //printer (parallel) port
561
566
AM_RANGE(0x03f8, 0x03ff) AM_RAM //rs232c (serial) port
564
static ADDRESS_MAP_START( filetto_io, AS_IO, 8 )
569
static ADDRESS_MAP_START( filetto_io, AS_IO, 8, pcxt_state )
565
570
ADDRESS_MAP_GLOBAL_MASK(0x3ff)
566
571
AM_IMPORT_FROM( pcxt_io_common )
567
572
// AM_RANGE(0x0200, 0x020f) AM_RAM //game port
570
575
AM_RANGE(0x0312, 0x0312) AM_READ_PORT("IN0") //Prototyping card,read only
573
static WRITE8_HANDLER( tetriskr_bg_bank_w )
578
WRITE8_MEMBER(pcxt_state::tetriskr_bg_bank_w)
575
pcxt_state *state = space->machine().driver_data<pcxt_state>();
577
state->m_bg_bank = (data & 0x0f) ^ 8;
581
m_bg_bank = (data & 0x0f) ^ 8;
580
static ADDRESS_MAP_START( tetriskr_io, AS_IO, 8 )
584
static ADDRESS_MAP_START( tetriskr_io, AS_IO, 8, pcxt_state )
581
585
ADDRESS_MAP_GLOBAL_MASK(0x3ff)
582
586
AM_IMPORT_FROM( pcxt_io_common )
583
587
AM_RANGE(0x0200, 0x020f) AM_RAM //game port
706
710
state->m_bank = -1;
707
711
state->m_lastvalue = -1;
708
712
device_set_irq_callback(machine.device("maincpu"), irq_callback);
709
state->m_pit8253 = machine.device( "pit8253" );
710
state->m_pic8259_1 = machine.device( "pic8259_1" );
711
state->m_pic8259_2 = machine.device( "pic8259_2" );
712
state->m_dma8237_1 = machine.device( "dma8237_1" );
713
state->m_dma8237_2 = machine.device( "dma8237_2" );
715
714
state->m_pc_spkrdata = 0;
716
715
state->m_pc_input = 0;
728
727
MCFG_PIT8253_ADD( "pit8253", pc_pit8253_config )
730
MCFG_PPI8255_ADD( "ppi8255_0", filetto_ppi8255_intf[0] )
731
MCFG_PPI8255_ADD( "ppi8255_1", filetto_ppi8255_intf[1] )
729
MCFG_I8255A_ADD( "ppi8255_0", ppi8255_0_intf )
730
MCFG_I8255A_ADD( "ppi8255_1", ppi8255_1_intf )
733
732
MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config )