mirror of
https://github.com/holub/mame
synced 2025-04-24 01:11:11 +03:00
some fast invaders improvements [ANY]
This commit is contained in:
parent
0802d60f8a
commit
8eb32c4c4b
@ -15,6 +15,9 @@ http://www.citylan.it/wiki/index.php/Fast_Invaders_%288275_version%29
|
||||
|
||||
#include "video/i8275.h"
|
||||
#include "video/mc6845.h"
|
||||
#include "machine/pic8259.h"
|
||||
#include "machine/i8257.h"
|
||||
|
||||
|
||||
class fastinvaders_state : public driver_device
|
||||
{
|
||||
@ -25,7 +28,9 @@ public:
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_crtc8275(*this, "8275"),
|
||||
m_crtc6845(*this, "6845")
|
||||
m_crtc6845(*this, "6845"),
|
||||
m_pic8259(*this, "pic8259"),
|
||||
m_dma8257(*this, "dma8257")
|
||||
{ }
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
@ -34,15 +39,163 @@ public:
|
||||
|
||||
optional_device<i8275_device> m_crtc8275;
|
||||
optional_device<mc6845_device> m_crtc6845;
|
||||
required_device<pic8259_device> m_pic8259;
|
||||
required_device<i8257_device> m_dma8257;
|
||||
|
||||
UINT8 m_rest55;
|
||||
UINT8 m_rest65;
|
||||
UINT8 m_trap;
|
||||
UINT8 m_ar;
|
||||
UINT8 m_av;
|
||||
UINT8 m_prom[256];
|
||||
UINT8 m_riga_sup;
|
||||
UINT8 m_scudi;
|
||||
UINT8 m_cannone;
|
||||
UINT8 m_riga_inf;
|
||||
|
||||
UINT8 m_irq0;
|
||||
UINT8 m_irq1;
|
||||
UINT8 m_irq2;
|
||||
UINT8 m_irq3;
|
||||
UINT8 m_irq4;
|
||||
UINT8 m_irq5;
|
||||
UINT8 m_irq6;
|
||||
UINT8 m_irq7;
|
||||
|
||||
|
||||
UINT8 m_start2_value;
|
||||
UINT8 m_dma1;
|
||||
UINT8 m_io_40;
|
||||
UINT8 m_hsync;
|
||||
|
||||
DECLARE_WRITE8_MEMBER(io_40_w);
|
||||
|
||||
DECLARE_READ8_MEMBER(io_60_r);
|
||||
DECLARE_WRITE8_MEMBER(io_70_w);
|
||||
DECLARE_WRITE8_MEMBER(io_90_w);
|
||||
DECLARE_WRITE8_MEMBER(io_a0_w);
|
||||
DECLARE_WRITE8_MEMBER(io_b0_w);
|
||||
DECLARE_WRITE8_MEMBER(io_c0_w);
|
||||
DECLARE_WRITE8_MEMBER(io_d0_w);
|
||||
DECLARE_WRITE8_MEMBER(io_e0_w);
|
||||
DECLARE_WRITE8_MEMBER(io_f0_w);
|
||||
|
||||
|
||||
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(start);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(start2);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(tilt);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(in0);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(in1);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(in2);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(in3);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(in4);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(in5);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(in6);
|
||||
|
||||
DECLARE_READ_LINE_MEMBER(sid_read);
|
||||
|
||||
|
||||
|
||||
virtual void video_start() override;
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(scanline_timer);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(count_ar);
|
||||
DECLARE_WRITE_LINE_MEMBER(vsync);
|
||||
DECLARE_WRITE_LINE_MEMBER(hsync);
|
||||
DECLARE_READ8_MEMBER(memory_read_byte);
|
||||
DECLARE_WRITE8_MEMBER(memory_write_byte);
|
||||
DECLARE_WRITE8_MEMBER(dark_1_clr);
|
||||
DECLARE_WRITE8_MEMBER(dark_2_clr);
|
||||
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
|
||||
DECLARE_DRIVER_INIT(fi6845);
|
||||
|
||||
};
|
||||
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(fastinvaders_state::scanline_timer)
|
||||
{
|
||||
/* int scanline = param;
|
||||
|
||||
|
||||
|
||||
|
||||
if(scanline == 16){
|
||||
//logerror("scanline\n");
|
||||
m_dma8257->dreq1_w(0x01);
|
||||
m_dma8257->hlda_w(1);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(fastinvaders_state::count_ar)
|
||||
{
|
||||
if (m_ar<255){
|
||||
|
||||
m_riga_sup= ((m_prom[m_ar]&0x08)>>3)&0x01;
|
||||
m_scudi= ((m_prom[m_ar]&0x04)>>2)&0x01;
|
||||
m_cannone= ((m_prom[m_ar]&0x02)>>1)&0x01;
|
||||
m_riga_inf= ((m_prom[m_ar]&0x01))&0x01;
|
||||
//logerror("m_ar = %02X m_riga_sup %02X, m_scudi %02X, m_cannone %02X, m_riga_inf %02X\n",m_ar,m_riga_sup,m_scudi,m_cannone,m_riga_inf);
|
||||
|
||||
if(m_riga_sup==0x01){
|
||||
if(((m_prom[m_ar-1]&0x08)>>3)==0x01){
|
||||
//logerror(" DMA1 \n");
|
||||
//logerror("m_prom[m_ar]=%d m_prom[m_ar-1]= %d ar = %d r_s %d, sc %d, ca %d, ri %d\n",m_prom[m_ar],m_prom[m_ar-1],m_ar,m_riga_sup,m_scudi,m_cannone,m_riga_inf);
|
||||
m_dma8257->dreq1_w(0x01);
|
||||
m_dma8257->hlda_w(1);
|
||||
//m_pic8259->ir1_w(HOLD_LINE);
|
||||
m_dma1=1;
|
||||
}
|
||||
}
|
||||
m_ar++;
|
||||
}
|
||||
|
||||
if (m_av<255){
|
||||
m_av++;
|
||||
//logerror("m_av=%02X\n",m_av);
|
||||
if (m_av == m_io_40){
|
||||
if (m_hsync==1){
|
||||
logerror(" DMA2 \n");
|
||||
m_dma8257->dreq2_w(0x01);
|
||||
m_dma8257->hlda_w(1);
|
||||
//m_pic8259->ir3_w(HOLD_LINE);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::dark_1_clr)
|
||||
{
|
||||
//address_space& prog_space = m_maincpu->space(AS_PROGRAM);
|
||||
if(data){
|
||||
m_dma8257->dreq1_w(0x00);
|
||||
}
|
||||
if(!data){
|
||||
m_dma1=0;
|
||||
}
|
||||
|
||||
//logerror("dma 1 clr\n");
|
||||
//m_maincpu->set_input_line(I8085_RST75_LINE, ASSERT_LINE);
|
||||
//m_maincpu->set_input_line(I8085_RST75_LINE, CLEAR_LINE);
|
||||
//return prog_space.read_byte(offset);
|
||||
//return 0x00;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::dark_2_clr)
|
||||
{
|
||||
//address_space& prog_space = m_maincpu->space(AS_PROGRAM);
|
||||
if(data){
|
||||
m_dma8257->dreq2_w(0x00);
|
||||
}
|
||||
/* if(!data){
|
||||
m_dma1=0;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Video
|
||||
@ -86,6 +239,262 @@ UINT32 fastinvaders_state::screen_update(screen_device &screen, bitmap_ind16 &bi
|
||||
return 0;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_40_w)
|
||||
{
|
||||
m_io_40=data;
|
||||
logerror("av target= %02X\n",m_io_40);
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_90_w)
|
||||
{
|
||||
logerror("Audio write &02X\n",data);
|
||||
}
|
||||
|
||||
|
||||
READ8_MEMBER(fastinvaders_state::io_60_r)
|
||||
{
|
||||
UINT8 tmp=0;
|
||||
//0x60 ds6 input bit 0 DX or SX
|
||||
// bit 1 DX or SX
|
||||
// bit 2-7 dip switch
|
||||
|
||||
tmp=ioport("IN1")->read()&0x03;
|
||||
tmp=tmp | (ioport("DSW1")->read()&0xfc);
|
||||
|
||||
//logerror("return %02X from 0x60\n",tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_70_w)
|
||||
{
|
||||
//bit 0 rest55 clear
|
||||
//bit 1 rest65 clear
|
||||
//bit 2 trap clear
|
||||
//bit 3 coin counter
|
||||
|
||||
//bit 4 irq0 clear
|
||||
//bit 5 8085 reset
|
||||
//bit 6 TODO
|
||||
//bit 7 both used TODO
|
||||
|
||||
//IRQ clear
|
||||
if (data&0x01){
|
||||
m_rest55=0;
|
||||
m_maincpu->set_input_line(I8085_RST55_LINE, CLEAR_LINE);
|
||||
}
|
||||
if (data&0x02){
|
||||
|
||||
if (m_rest65){
|
||||
//logerror("clear");
|
||||
m_rest65=0;
|
||||
m_maincpu->set_input_line(I8085_RST65_LINE, CLEAR_LINE);
|
||||
}
|
||||
}
|
||||
if (data&0x04){
|
||||
m_trap=0;
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
if (data&0x10){
|
||||
m_irq0=0;
|
||||
m_pic8259->ir0_w(CLEAR_LINE);
|
||||
}
|
||||
|
||||
//self reset
|
||||
if (data&0x20){
|
||||
logerror("RESET!!!!!\n");
|
||||
}
|
||||
|
||||
|
||||
//coin counter
|
||||
// if (data&0x08){
|
||||
// coin_counter_w(machine(), offset,0x01);
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_a0_w)
|
||||
{
|
||||
m_irq1=0;
|
||||
m_pic8259->ir1_w(CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_b0_w)
|
||||
{
|
||||
m_irq2=0;
|
||||
m_pic8259->ir2_w(CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_c0_w)
|
||||
{
|
||||
m_irq3=0;
|
||||
m_pic8259->ir3_w(CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_d0_w)
|
||||
{
|
||||
m_irq5=0;
|
||||
m_pic8259->ir5_w(CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_e0_w)
|
||||
{
|
||||
m_irq4=0;
|
||||
m_pic8259->ir4_w(CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::io_f0_w)
|
||||
{
|
||||
m_irq6=0;
|
||||
m_pic8259->ir6_w(CLEAR_LINE);
|
||||
}
|
||||
|
||||
READ_LINE_MEMBER(fastinvaders_state::sid_read)
|
||||
{
|
||||
UINT8 tmp= m_start2_value ? ASSERT_LINE : CLEAR_LINE;
|
||||
m_start2_value=0;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::tilt)
|
||||
{
|
||||
m_trap=1;
|
||||
if (newval)
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, HOLD_LINE);
|
||||
}
|
||||
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::coin_inserted)
|
||||
{
|
||||
m_rest65=1;
|
||||
if (newval)
|
||||
m_maincpu->set_input_line(I8085_RST65_LINE, HOLD_LINE);
|
||||
}
|
||||
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::start)
|
||||
{
|
||||
m_rest55=1;
|
||||
if (newval)
|
||||
m_maincpu->set_input_line(I8085_RST55_LINE, HOLD_LINE);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::start2)
|
||||
{
|
||||
m_rest55=1;
|
||||
m_start2_value=1;
|
||||
if (newval)
|
||||
m_maincpu->set_input_line(I8085_RST55_LINE, HOLD_LINE);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::in0)
|
||||
{
|
||||
m_irq0=1;
|
||||
if (newval)
|
||||
m_pic8259->ir0_w(HOLD_LINE);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::in1)
|
||||
{
|
||||
m_irq1=1;
|
||||
if (newval)
|
||||
m_pic8259->ir1_w(HOLD_LINE);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::in2)
|
||||
{
|
||||
m_irq2=1;
|
||||
if (newval)
|
||||
m_pic8259->ir2_w(HOLD_LINE);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::in3)
|
||||
{
|
||||
m_irq3=1;
|
||||
if (newval)
|
||||
m_pic8259->ir3_w(HOLD_LINE);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::in4)
|
||||
{
|
||||
m_irq4=1;
|
||||
if (newval)
|
||||
m_pic8259->ir4_w(HOLD_LINE);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::in5)
|
||||
{
|
||||
m_irq5=1;
|
||||
if (newval)
|
||||
m_pic8259->ir5_w(HOLD_LINE);
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(fastinvaders_state::in6)
|
||||
{
|
||||
m_irq6=1;
|
||||
if (newval)
|
||||
m_pic8259->ir6_w(HOLD_LINE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER( fastinvaders_state::vsync)
|
||||
{
|
||||
//logerror("p8257_drq_w\n");
|
||||
if (!state){
|
||||
m_dma8257->dreq0_w(0x01);
|
||||
m_dma8257->hlda_w(1);
|
||||
|
||||
m_maincpu->set_input_line(I8085_RST75_LINE, ASSERT_LINE);
|
||||
m_maincpu->set_input_line(I8085_RST75_LINE, CLEAR_LINE);
|
||||
//machine().scheduler().abort_timeslice(); // transfer occurs immediately
|
||||
//machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100)); // smooth things out a bit
|
||||
m_av=0;
|
||||
}
|
||||
|
||||
if (state){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER( fastinvaders_state::hsync)
|
||||
{
|
||||
//m_hsync=1;
|
||||
if (!state){
|
||||
m_hsync=0;
|
||||
m_ar=0;
|
||||
}
|
||||
|
||||
if (state){
|
||||
m_hsync=1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
READ8_MEMBER(fastinvaders_state::memory_read_byte)
|
||||
{
|
||||
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
|
||||
logerror("dma read\n");
|
||||
//m_maincpu->set_input_line(I8085_RST75_LINE, ASSERT_LINE);
|
||||
//m_maincpu->set_input_line(I8085_RST75_LINE, CLEAR_LINE);
|
||||
return prog_space.read_byte(offset);
|
||||
//return 0x00;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(fastinvaders_state::memory_write_byte)
|
||||
{
|
||||
//address_space& prog_space = m_maincpu->space(AS_PROGRAM);
|
||||
logerror("dma write\n");
|
||||
//m_maincpu->set_input_line(I8085_RST75_LINE, ASSERT_LINE);
|
||||
//m_maincpu->set_input_line(I8085_RST75_LINE, CLEAR_LINE);
|
||||
//return prog_space.read_byte(offset);
|
||||
//return 0x00;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -94,25 +503,55 @@ UINT32 fastinvaders_state::screen_update(screen_device &screen, bitmap_ind16 &bi
|
||||
***************************************************************************/
|
||||
|
||||
static ADDRESS_MAP_START( fastinvaders_map, AS_PROGRAM, 8, fastinvaders_state )
|
||||
AM_RANGE(0x0000, 0x1fff) AM_ROM
|
||||
|
||||
AM_RANGE(0x2800, 0x2fff) AM_RAM AM_SHARE("videoram")
|
||||
AM_RANGE(0x3000, 0x33ff) AM_RAM
|
||||
|
||||
//AM_RANGE(0x0000, 0x1fff) AM_ROM AM_MIRROR(0x8000)
|
||||
AM_RANGE(0x0000, 0x27ff) AM_ROM AM_MIRROR(0x8000)
|
||||
AM_RANGE(0x2800, 0x2fff) AM_RAM AM_MIRROR(0x8000) AM_SHARE("videoram")
|
||||
AM_RANGE(0x3000, 0x33ff) AM_RAM AM_MIRROR(0x8000)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( fastinvaders_io_base, AS_IO, 8, fastinvaders_state )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( fastinvaders_6845_io, AS_IO, 8, fastinvaders_state )
|
||||
AM_RANGE(0x10, 0x1f) AM_DEVREADWRITE("dma8257", i8257_device, read, write)
|
||||
AM_RANGE(0x20, 0x20) AM_DEVWRITE("6845", mc6845_device, address_w)
|
||||
AM_RANGE(0x21, 0x21) AM_DEVREADWRITE("6845", mc6845_device, register_r, register_w)
|
||||
AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("pic8259", pic8259_device, read, write)
|
||||
AM_RANGE(0x40, 0x4f) AM_WRITE(io_40_w) //ds4 //latch
|
||||
//AM_RANGE(0x50, 0x50) AM_READ(io_50_r) //ds5 //latch
|
||||
AM_RANGE(0x60, 0x60) AM_READ(io_60_r)
|
||||
AM_RANGE(0x70, 0x70) AM_WRITE(io_70_w) //ds7 rest55,rest65,trap, irq0 clear
|
||||
AM_RANGE(0x80, 0x80) AM_NOP //ds8 write here a LOT ?????
|
||||
AM_RANGE(0x90, 0x90) AM_WRITE(io_90_w) //ds9 sound command
|
||||
AM_RANGE(0xa0, 0xa0) AM_WRITE(io_a0_w) //ds10 irq1 clear
|
||||
AM_RANGE(0xb0, 0xb0) AM_WRITE(io_b0_w) //ds11 irq2 clear
|
||||
AM_RANGE(0xc0, 0xc0) AM_WRITE(io_c0_w) //ds12 irq3 clear
|
||||
AM_RANGE(0xd0, 0xd0) AM_WRITE(io_d0_w) //ds13 irq5 clear
|
||||
AM_RANGE(0xe0, 0xe0) AM_WRITE(io_e0_w) //ds14 irq4 clear
|
||||
AM_RANGE(0xf0, 0xf0) AM_WRITE(io_f0_w) //ds15 irq6 clear
|
||||
|
||||
AM_IMPORT_FROM(fastinvaders_io_base)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( fastinvaders_8275_io, AS_IO, 8, fastinvaders_state )
|
||||
AM_RANGE( 0x20, 0x21 ) AM_DEVREADWRITE("8275", i8275_device, read, write)
|
||||
|
||||
AM_RANGE(0x10, 0x1f) AM_DEVREADWRITE("dma8257", i8257_device, read, write)
|
||||
AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("pic8259", pic8259_device, read, write)
|
||||
AM_RANGE(0x40, 0x4f) AM_WRITE(io_40_w) //ds4 //latch
|
||||
//AM_RANGE(0x50, 0x50) AM_READ(io_50_r) //ds5 //latch
|
||||
AM_RANGE(0x60, 0x60) AM_READ(io_60_r)
|
||||
AM_RANGE(0x70, 0x70) AM_WRITE(io_70_w) //ds7 rest55,rest65,trap, irq0 clear
|
||||
AM_RANGE(0x80, 0x80) AM_NOP //write here a LOT
|
||||
//AM_RANGE(0x80, 0x80) AM_WRITE(io_80_w) //ds8 ????
|
||||
AM_RANGE(0x90, 0x90) AM_WRITE(io_90_w) //ds9 sound command
|
||||
AM_RANGE(0xa0, 0xa0) AM_WRITE(io_a0_w) //ds10 irq1 clear
|
||||
AM_RANGE(0xb0, 0xb0) AM_WRITE(io_b0_w) //ds11 irq2 clear
|
||||
AM_RANGE(0xc0, 0xc0) AM_WRITE(io_c0_w) //ds12 irq3 clear
|
||||
AM_RANGE(0xd0, 0xd0) AM_WRITE(io_d0_w) //ds13 irq5 clear
|
||||
AM_RANGE(0xe0, 0xe0) AM_WRITE(io_e0_w) //ds14 irq4 clear
|
||||
AM_RANGE(0xf0, 0xf0) AM_WRITE(io_f0_w) //ds15 irq6 clear
|
||||
AM_IMPORT_FROM(fastinvaders_io_base)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -125,6 +564,50 @@ ADDRESS_MAP_END
|
||||
***************************************************************************/
|
||||
|
||||
static INPUT_PORTS_START( fastinvaders )
|
||||
|
||||
PORT_START("COIN") /* FAKE async input */
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, coin_inserted, 0) //I8085_RST65_LINE
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, start, 0) //I8085_RST55_LINE
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state, start2, 0) //I8085_RST55_LINE
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in0, 0) // int0, sparo
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,tilt, 0) //INPUT_LINE_NMI tilt
|
||||
|
||||
|
||||
PORT_START("IN0")
|
||||
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_NAME("1") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in1, 0)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_NAME("2") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in2, 0)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_NAME("3") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in3, 0)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_NAME("4") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in4, 0)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_NAME("5") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in5, 0)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_NAME("6") PORT_CHANGED_MEMBER(DEVICE_SELF, fastinvaders_state,in6, 0)
|
||||
|
||||
|
||||
PORT_START("IN1") //0x60 io port
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
|
||||
|
||||
|
||||
PORT_START("DSW1") //0x60 io port
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0xf0, 0x80, "Ships/lives number" )
|
||||
PORT_DIPSETTING( 0x10, "1 Ship" )
|
||||
PORT_DIPSETTING( 0x20, "2 Ships" )
|
||||
PORT_DIPSETTING( 0x30, "3 Ships" )
|
||||
PORT_DIPSETTING( 0x40, "4 Ships" )
|
||||
PORT_DIPSETTING( 0x50, "5 Ships" )
|
||||
PORT_DIPSETTING( 0x60, "6 Ships" )
|
||||
PORT_DIPSETTING( 0x70, "7 Ships" )
|
||||
PORT_DIPSETTING( 0x80, "8 Ships" )
|
||||
PORT_DIPSETTING( 0x90, "9 Ships" )
|
||||
|
||||
|
||||
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -152,17 +635,31 @@ GFXDECODE_END
|
||||
static MACHINE_CONFIG_START( fastinvaders, fastinvaders_state )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", I8085A, 2000000 ) // guess
|
||||
MCFG_CPU_ADD("maincpu", I8085A, 6144100/2 ) // 6144100 Xtal /2 internaly
|
||||
MCFG_CPU_PROGRAM_MAP(fastinvaders_map)
|
||||
// MCFG_CPU_IO_MAP(fastinvaders_io_map)
|
||||
// MCFG_CPU_VBLANK_INT_DRIVER("screen", fastinvaders_state, irq0_line_hold)
|
||||
MCFG_I8085A_SID(READLINE(fastinvaders_state, sid_read))
|
||||
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
|
||||
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", fastinvaders_state, scanline_timer, "screen", 0, 1)
|
||||
|
||||
MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), VCC, NULL)
|
||||
|
||||
MCFG_DEVICE_ADD("dma8257", I8257, 6144100)
|
||||
MCFG_I8257_IN_MEMR_CB(READ8(fastinvaders_state, memory_read_byte))
|
||||
MCFG_I8257_OUT_MEMW_CB(WRITE8(fastinvaders_state, memory_write_byte))
|
||||
MCFG_I8257_OUT_DACK_1_CB(WRITE8(fastinvaders_state, dark_1_clr))
|
||||
MCFG_I8257_OUT_DACK_2_CB(WRITE8(fastinvaders_state, dark_2_clr))
|
||||
|
||||
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("count_ar", fastinvaders_state, count_ar, attotime::from_hz(11500000/2))
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_REFRESH_RATE(60)
|
||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
|
||||
MCFG_SCREEN_SIZE(64*16, 32*16)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*16, 40*16-1, 0*14, 19*14-1)
|
||||
MCFG_SCREEN_SIZE(64*16, 32*16)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*16, 40*16-1, 0*14, 19*14-1)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(fastinvaders_state, screen_update)
|
||||
MCFG_SCREEN_PALETTE("palette")
|
||||
|
||||
@ -187,12 +684,28 @@ static MACHINE_CONFIG_DERIVED( fastinvaders_6845, fastinvaders )
|
||||
MCFG_CPU_MODIFY("maincpu" ) // guess
|
||||
MCFG_CPU_IO_MAP(fastinvaders_6845_io)
|
||||
|
||||
MCFG_MC6845_ADD("6845", MC6845, "screen", 1000000) /* guess */
|
||||
MCFG_MC6845_ADD("6845", MC6845, "screen", 11500000/16) /* confirmed */
|
||||
MCFG_MC6845_SHOW_BORDER_AREA(false)
|
||||
MCFG_MC6845_CHAR_WIDTH(16)
|
||||
MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(fastinvaders_state,vsync))
|
||||
MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(fastinvaders_state,hsync))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
|
||||
|
||||
DRIVER_INIT_MEMBER(fastinvaders_state, fi6845)
|
||||
{
|
||||
const UINT8 *prom = memregion("prom")->base();
|
||||
int i;
|
||||
for (i=0;i<256;i++){
|
||||
m_prom[i]=prom[i];
|
||||
}
|
||||
m_dma1=0;
|
||||
m_io_40=0;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Game drivers
|
||||
@ -201,7 +714,8 @@ MACHINE_CONFIG_END
|
||||
|
||||
// the last pair of gfx roms were mixed up in each set (each set contained 2 identical roms rather than one of each) hopefully nothing else was
|
||||
|
||||
ROM_START( fi6845 )
|
||||
//ROM_START( fi6845 )
|
||||
ROM_START( fi8275 )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "R2.1A", 0x0000, 0x0200, CRC(6180d652) SHA1(3aac67f52897059c8366f52c41464052ce860ae8) )
|
||||
ROM_LOAD( "R2.1B", 0x0200, 0x0200, CRC(f10baf3e) SHA1(4a1702c24e949d9bef990033b5507a573abd7bc3) )
|
||||
@ -217,6 +731,12 @@ ROM_START( fi6845 )
|
||||
ROM_LOAD( "R2.6B", 0x1600, 0x0200, CRC(0c96ba4a) SHA1(0da104472c33523d4002cab0c77ca20fc2998a2c) )
|
||||
ROM_LOAD( "R2.7A", 0x1800, 0x0200, CRC(c9207fbd) SHA1(bf388e26ee1e2073b8a641ba6fb551c24d471a70) )
|
||||
|
||||
ROM_LOAD( "R2.1A", 0x2000, 0x0200, CRC(6180d652) SHA1(3aac67f52897059c8366f52c41464052ce860ae8) )
|
||||
ROM_LOAD( "R2.1B", 0x2200, 0x0200, CRC(f10baf3e) SHA1(4a1702c24e949d9bef990033b5507a573abd7bc3) )
|
||||
ROM_LOAD( "R2.2A", 0x2400, 0x0200, CRC(f446ef0d) SHA1(2be337c1197d14e5ffc33ea05b5262f1ea17d442) )
|
||||
ROM_LOAD( "R2.2B", 0x2600, 0x0200, CRC(b97e35a3) SHA1(0878a83c7f9f0645749fdfb1ff372d0e04833c9e) )
|
||||
|
||||
|
||||
ROM_REGION( 0x0c00, "gfx1", 0 )
|
||||
ROM_LOAD( "C2.1F", 0x0000, 0x0200, CRC(9feca88a) SHA1(14a8c46eb51eed01b7b537a9931cd092cec2019f) )
|
||||
ROM_LOAD( "C2.1G", 0x0200, 0x0200, CRC(79fc3963) SHA1(25651d1031895a01a2a4751b355ff1200a899ac5) )
|
||||
@ -224,9 +744,13 @@ ROM_START( fi6845 )
|
||||
ROM_LOAD( "C2.2F", 0x0600, 0x0200, CRC(3bb16f55) SHA1(b1cc1e2346acd0e5c84861b414b4677871079844) )
|
||||
ROM_LOAD( "C2.2G", 0x0800, 0x0200, CRC(19828c47) SHA1(f215ce55be32b3564e1b7cc19500d38a93117051) )
|
||||
ROM_LOAD( "C2.2H", 0x0a00, 0x0200, CRC(284ae4eb) SHA1(6e28fcd9d481d37f47728f22f6048b29266f4346) )
|
||||
|
||||
ROM_REGION( 0x0100, "prom", 0 )
|
||||
ROM_LOAD( "93427.bin", 0x0000, 0x0100, CRC(f59c8573) SHA1(5aed4866abe1690fd0f088af1cfd99b3c85afe9a) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fi8275 )
|
||||
//ROM_START( fi8275 )
|
||||
ROM_START( fi6845 )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "R1.1A", 0x0000, 0x0200, CRC(fef96dfe) SHA1(f6df0cf6b5d90ea07ee890985c8cbf0f68e08550) )
|
||||
ROM_LOAD( "R1.1B", 0x0200, 0x0200, CRC(c48c6ebc) SHA1(f1f86839819b6abce9ff55c1b02bbf2c4036c51a) )
|
||||
@ -250,9 +774,11 @@ ROM_START( fi8275 )
|
||||
ROM_LOAD( "C1.1A", 0x0600, 0x0200, CRC(3bb16f55) SHA1(b1cc1e2346acd0e5c84861b414b4677871079844) )
|
||||
ROM_LOAD( "C1.2A", 0x0800, 0x0200, CRC(19828c47) SHA1(f215ce55be32b3564e1b7cc19500d38a93117051) )
|
||||
ROM_LOAD( "C1.3A", 0x0a00, 0x0200, CRC(284ae4eb) SHA1(6e28fcd9d481d37f47728f22f6048b29266f4346) )
|
||||
|
||||
ROM_REGION( 0x0100, "prom", 0 )
|
||||
ROM_LOAD( "93427.bin", 0x0000, 0x0100, CRC(f59c8573) SHA1(5aed4866abe1690fd0f088af1cfd99b3c85afe9a) )
|
||||
ROM_END
|
||||
|
||||
|
||||
GAME( 1979, fi6845, 0, fastinvaders_6845, fastinvaders, driver_device, 0, ROT270, "Fiberglass", "Fast Invaders (6845 version)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
|
||||
GAME( 1979, fi8275, fi6845, fastinvaders_8275, fastinvaders, driver_device, 0, ROT270, "Fiberglass", "Fast Invaders (8275 version)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
|
||||
|
||||
/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS*/
|
||||
GAME( 1979, fi6845, 0, fastinvaders_6845, fastinvaders, fastinvaders_state, fi6845, ROT270, "Fiberglass", "Fast Invaders (6845 version)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
|
||||
GAME( 1979, fi8275, fi6845, fastinvaders_8275, fastinvaders, fastinvaders_state,fi6845, ROT270, "Fiberglass", "Fast Invaders (8275 version)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
|
Loading…
Reference in New Issue
Block a user