Forte Card improvements: Added a default serial EEPROM after an exhaustive

reverse-engineering work of Grull Osgo. Refactored and cleaned up the sets
and driver. Added technical notes.

Clones promoted to working
--------------------------
Forte Card (Ver 103, English) [Grull Osgo, Roberto Fresca]
This commit is contained in:
RobertoFresca 2021-01-20 19:27:58 +01:00
parent e669b5ef46
commit 42a36976f1
2 changed files with 99 additions and 108 deletions

View File

@ -6,17 +6,27 @@
1994, Fortex Ltd.
Driver by Angelo Salese.
Additional work by Roberto Fresca & Rob Ragon.
Additional work by Roberto Fresca.
Supported sets:
* Forte Card (Ver 110, Spanish), 1994, Fortex Ltd.
* Forte Card (Ver 103, English), 1994, Fortex Ltd.
Special thanks to Grull Osgo for his exhaustive reverse engineering that allowed to recreate
the original default serial EEPROM contents for the english set, critical to get it working.
Special thanks to Rob Ragon for dump the spanish set, and all the tests on the real hardware.
-------------------------------------------------------------------------------------------------
Notes:
- NMI mask and vblank bit are made thru SW usage of the I register (that is unused
if the z80 is in IM 1).
TODO:
- fortecar requires a proper EEPROM dump, doesn't start due of it.
- fortecrd has non-default data in the default EEPROM.
Debug notes:
English set: bp 512 do pc=53e
Spanish set: bp 512 do pc=562
@ -86,6 +96,8 @@
Game Notes...
The game takes some seconds to boot, due to a lot of complex checks at begining.
NVRAM is created automatically.
There are 3 keys for service modes:
@ -331,10 +343,10 @@
#define AY_CLOCK (MASTER_CLOCK/8)
class fortecar_state : public driver_device
class fortecrd_state : public driver_device
{
public:
fortecar_state(const machine_config &mconfig, device_type type, const char *tag) :
fortecrd_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this,"maincpu"),
m_watchdog(*this, "watchdog"),
@ -345,9 +357,7 @@ public:
m_lamps(*this, "lamp%u", 0U)
{ }
void fortecar(machine_config &config);
void init_fortecar();
void fortecrd(machine_config &config);
protected:
virtual void machine_start() override;
@ -367,11 +377,11 @@ private:
void ayporta_w(uint8_t data);
void ayportb_w(uint8_t data);
void fortecar_palette(palette_device &palette) const;
void fortecrd_palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void fortecar_map(address_map &map);
void fortecar_ports(address_map &map);
void fortecrd_map(address_map &map);
void fortecrd_ports(address_map &map);
};
@ -379,12 +389,12 @@ private:
* Video Hardware *
***********************************/
void fortecar_state::machine_start()
void fortecrd_state::machine_start()
{
m_lamps.resolve();
}
uint32_t fortecar_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
uint32_t fortecrd_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int count = 0;
@ -408,7 +418,7 @@ uint32_t fortecar_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
return 0;
}
void fortecar_state::fortecar_palette(palette_device &palette) const
void fortecrd_state::fortecrd_palette(palette_device &palette) const
{
/* Video resistors...
@ -463,7 +473,7 @@ R = 82 Ohms Pull Down.
* Misc R/W Handlers *
***********************************/
void fortecar_state::ppi0_portc_w(uint8_t data)
void fortecrd_state::ppi0_portc_w(uint8_t data)
{
/*
NM93CS56N Serial EEPROM
@ -478,13 +488,13 @@ DOUT PPI_PC4
m_eeprom->clk_write((data & 0x02) ? ASSERT_LINE : CLEAR_LINE);
}
uint8_t fortecar_state::ppi0_portc_r()
uint8_t fortecrd_state::ppi0_portc_r()
{
// popmessage("%s",machine().describe_context());
return ((m_eeprom->do_read() << 4) & 0x10);
}
void fortecar_state::ayporta_w(uint8_t data)
void fortecrd_state::ayporta_w(uint8_t data)
{
/* System Lamps...
@ -514,7 +524,7 @@ void fortecar_state::ayporta_w(uint8_t data)
}
void fortecar_state::ayportb_w(uint8_t data)
void fortecrd_state::ayportb_w(uint8_t data)
{
/*
@ -529,12 +539,10 @@ trigger a reset.
Seems to work properly, but must be checked closely...
*/
if (((data >> 7) & 0x01) == 0) /* check for bit7 */
if (((data >> 7) & 0x01) == 0) // check for bit7
{
m_watchdog->watchdog_reset();
}
// logerror("AY port B write %02x\n",data);
}
@ -542,22 +550,21 @@ Seems to work properly, but must be checked closely...
* Memory Map Information *
***********************************/
void fortecar_state::fortecar_map(address_map &map)
void fortecrd_state::fortecrd_map(address_map &map)
{
map(0x0000, 0xbfff).rom();
map(0xc000, 0xc7ff).rom();
map(0x0000, 0xc7ff).rom();
map(0xd000, 0xd7ff).ram().share("nvram");
map(0xd800, 0xffff).ram().share("vram");
}
void fortecar_state::fortecar_ports(address_map &map)
void fortecrd_state::fortecrd_ports(address_map &map)
{
map.global_mask(0xff);
map(0x20, 0x20).w("crtc", FUNC(mc6845_device::address_w)); // pc=444
map(0x21, 0x21).w("crtc", FUNC(mc6845_device::register_w));
map(0x40, 0x40).r("aysnd", FUNC(ay8910_device::data_r));
map(0x40, 0x41).w("aysnd", FUNC(ay8910_device::address_data_w));
map(0x60, 0x63).rw("fcppi0", FUNC(i8255_device::read), FUNC(i8255_device::write));//M5L8255AP
map(0x60, 0x63).rw("fcppi0", FUNC(i8255_device::read), FUNC(i8255_device::write)); // M5L8255AP
// map(0x80, 0x81) //8251A UART
map(0xa0, 0xa0).rw("rtc", FUNC(v3021_device::read), FUNC(v3021_device::write));
map(0xa1, 0xa1).portr("DSW");
@ -572,6 +579,7 @@ Error messages:
"FALSA PRUEBA NVR" (NVRAM new, no serial EEPROM connected)
"FALLO EN NVR" (NVRAM ok, no serial EEPROM connected)
"FALSA PRUEBA NVRAM PERMANENTE" (NVRAM new, serial EEPROM connected)
"FALSA PRUEBA BOTONES" (Input ports error )
*/
@ -580,8 +588,28 @@ Error messages:
* Input Ports *
***********************************/
static INPUT_PORTS_START( fortecar )
PORT_START("DSW") /* 8bit */
static INPUT_PORTS_START( fortecrd )
PORT_START("INPUT")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Red / Bet")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_LOW ) PORT_NAME("Black")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL )
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Rear Door") PORT_CODE(KEYCODE_D) PORT_TOGGLE
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_NAME("Payout")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin In")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // to trace
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Note In")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Credits Key") PORT_CODE(KEYCODE_Q) PORT_TOGGLE
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Owner Key") PORT_CODE(KEYCODE_0) PORT_TOGGLE
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Rental Key") PORT_CODE(KEYCODE_9) PORT_TOGGLE
PORT_START("DSW")
PORT_DIPNAME( 0x01, 0x01, "DSW-1" ) PORT_DIPLOCATION("DSW:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@ -606,26 +634,6 @@ static INPUT_PORTS_START( fortecar )
PORT_DIPNAME( 0x80, 0x80, "DSW-8" ) PORT_DIPLOCATION("DSW:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("INPUT") /* 8bit */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Red / Bet")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_LOW ) PORT_NAME("Black")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL )
PORT_START("SYSTEM") /* 8bit */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Rear Door") PORT_CODE(KEYCODE_D) PORT_TOGGLE
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_NAME("Payout")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin In")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* to trace */
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Note In")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Credits Key") PORT_CODE(KEYCODE_Q) PORT_TOGGLE
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Owner Key") PORT_CODE(KEYCODE_0) PORT_TOGGLE
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Rental Key") PORT_CODE(KEYCODE_9) PORT_TOGGLE
INPUT_PORTS_END
@ -660,7 +668,7 @@ static const gfx_layout tiles8x8_layout_6bpp =
* Graphics Decode Information *
****************************************/
static GFXDECODE_START( gfx_fortecar )
static GFXDECODE_START( gfx_fortecrd )
GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout_3bpp, 0x000, 0x20 )
GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout_6bpp, 0x100, 0x04 )
GFXDECODE_END
@ -670,9 +678,9 @@ GFXDECODE_END
* Machine Start & Reset *
***********************************/
void fortecar_state::machine_reset()
void fortecrd_state::machine_reset()
{
/* apparently there's a random fill in there (checked thru trojan TODO: extract proper algorithm) */
// apparently there's a random fill in there (checked thru trojan)
for (int i = 0; i < m_vram.bytes(); i++)
m_vram[i] = machine().rand();
}
@ -682,41 +690,41 @@ void fortecar_state::machine_reset()
* Machine Drivers *
***********************************/
void fortecar_state::fortecar(machine_config &config)
void fortecrd_state::fortecrd(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, CPU_CLOCK); /* 3 MHz, measured */
m_maincpu->set_addrmap(AS_PROGRAM, &fortecar_state::fortecar_map);
m_maincpu->set_addrmap(AS_IO, &fortecar_state::fortecar_ports);
// basic machine hardware
Z80(config, m_maincpu, CPU_CLOCK); // 3 MHz, measured
m_maincpu->set_addrmap(AS_PROGRAM, &fortecrd_state::fortecrd_map);
m_maincpu->set_addrmap(AS_IO, &fortecrd_state::fortecrd_ports);
WATCHDOG_TIMER(config, m_watchdog).set_time(attotime::from_msec(200)); /* guess */
WATCHDOG_TIMER(config, m_watchdog).set_time(attotime::from_msec(200)); // guess
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(640, 256);
screen.set_visarea(0, 600-1, 0, 240-1); /* driven by CRTC */
screen.set_screen_update(FUNC(fortecar_state::screen_update));
screen.set_visarea(0, 600-1, 0, 240-1); // driven by CRTC
screen.set_screen_update(FUNC(fortecrd_state::screen_update));
EEPROM_93C56_16BIT(config, "eeprom").default_value(0);
i8255_device &fcppi0(I8255A(config, "fcppi0"));
/* Init with 0x9a... A, B and high C as input
Serial Eprom connected to Port C */
// PPI init with 0x9a... A, B and high C as input.
// Serial Eprom connected to Port C.
fcppi0.in_pa_callback().set_ioport("SYSTEM");
fcppi0.in_pb_callback().set_ioport("INPUT");
fcppi0.in_pc_callback().set(FUNC(fortecar_state::ppi0_portc_r));
fcppi0.out_pc_callback().set(FUNC(fortecar_state::ppi0_portc_w));
fcppi0.in_pc_callback().set(FUNC(fortecrd_state::ppi0_portc_r));
fcppi0.out_pc_callback().set(FUNC(fortecrd_state::ppi0_portc_w));
V3021(config, "rtc");
GFXDECODE(config, m_gfxdecode, m_palette, gfx_fortecar);
PALETTE(config, m_palette, FUNC(fortecar_state::fortecar_palette), 0x200);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_fortecrd);
PALETTE(config, m_palette, FUNC(fortecrd_state::fortecrd_palette), 0x200);
mc6845_device &crtc(MC6845(config, "crtc", CRTC_CLOCK)); /* 1.5 MHz, measured */
mc6845_device &crtc(MC6845(config, "crtc", CRTC_CLOCK)); // 1.5 MHz, measured
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
@ -724,9 +732,9 @@ void fortecar_state::fortecar(machine_config &config)
SPEAKER(config, "mono").front_center();
ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK)); /* 1.5 MHz, measured */
aysnd.port_a_write_callback().set(FUNC(fortecar_state::ayporta_w));
aysnd.port_b_write_callback().set(FUNC(fortecar_state::ayportb_w));
ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK)); // 1.5 MHz, measured
aysnd.port_a_write_callback().set(FUNC(fortecrd_state::ayporta_w));
aysnd.port_b_write_callback().set(FUNC(fortecrd_state::ayportb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
}
@ -737,58 +745,41 @@ void fortecar_state::fortecar(machine_config &config)
ROM_START( fortecrd )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "forte_card.u7", 0x00000, 0x010000, CRC(79fc6dd3) SHA1(5454f2ee12b62d573b61c54e48398f43332b000e) )
ROM_LOAD( "forte_card_sp.u7", 0x00000, 0x010000, CRC(79fc6dd3) SHA1(5454f2ee12b62d573b61c54e48398f43332b000e) )
ROM_REGION( 0x30000, "gfx1", 0 )
ROM_LOAD( "forte_card.u38", 0x00000, 0x10000, CRC(258fb7bf) SHA1(cd75001fe40836b2dc229caddfc38f6076df7a79) )
ROM_LOAD( "forte_card.u39", 0x10000, 0x10000, CRC(3d9c478e) SHA1(eb86115d1c36038f2c80cd116f5aeddd94036424) )
ROM_LOAD( "forte_card.u40", 0x20000, 0x10000, CRC(9693bb83) SHA1(e3e3bc750c89a1edd1072ce3890b2ce498dec633) )
ROM_LOAD( "forte_card_sp.u38", 0x00000, 0x10000, CRC(258fb7bf) SHA1(cd75001fe40836b2dc229caddfc38f6076df7a79) )
ROM_LOAD( "forte_card_sp.u39", 0x10000, 0x10000, CRC(3d9c478e) SHA1(eb86115d1c36038f2c80cd116f5aeddd94036424) )
ROM_LOAD( "forte_card_sp.u40", 0x20000, 0x10000, CRC(9693bb83) SHA1(e3e3bc750c89a1edd1072ce3890b2ce498dec633) ) // identical to the english version
ROM_REGION( 0x0800, "nvram", 0 ) /* default NVRAM */
ROM_LOAD( "fortecrd_nvram.u6", 0x0000, 0x0800, CRC(7d3e7eb5) SHA1(788fe7adc381bcc6eaefed33f5aa1081340608a0) )
ROM_REGION16_BE( 0x0100, "eeprom", 0 ) /* default serial EEPROM */
ROM_LOAD16_WORD_SWAP( "forte_card_93cs56_serial_12345678.u13", 0x0000, 0x0100, CRC(2fc5961d) SHA1(f958c8b2b4e48cc6e5a607a6751acde5592bd27f) )
ROM_REGION16_BE( 0x0100, "eeprom", 0 ) // default serial EEPROM
ROM_LOAD16_WORD_SWAP( "forte_card_sp_93cs56_serial_12345678.u13", 0x0000, 0x0100, CRC(2fc5961d) SHA1(f958c8b2b4e48cc6e5a607a6751acde5592bd27f) )
ROM_REGION( 0x0200, "proms", 0 )
ROM_LOAD( "forte_card_82s147.u47", 0x0000, 0x0200, CRC(7e631818) SHA1(ac08b0de30260278af3a1c5dee5810d4304cb9ca) )
ROM_END
ROM_START( fortecar )
ROM_START( fortecrde )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "fortecar.u7", 0x00000, 0x010000, CRC(2a4b3429) SHA1(8fa630dac949e758678a1a36b05b3412abe8ae16) )
ROM_LOAD( "forte_card_en.u7", 0x00000, 0x010000, CRC(2a4b3429) SHA1(8fa630dac949e758678a1a36b05b3412abe8ae16) )
ROM_REGION( 0x30000, "gfx1", 0 )
ROM_LOAD( "fortecar.u38", 0x00000, 0x10000, CRC(c2090690) SHA1(f0aa8935b90a2ab6043555ece69f926372246648) )
ROM_LOAD( "fortecar.u39", 0x10000, 0x10000, CRC(fc3ddf4f) SHA1(4a95b24c4edb67f6d59f795f86dfbd12899e01b0) )
ROM_LOAD( "fortecar.u40", 0x20000, 0x10000, CRC(9693bb83) SHA1(e3e3bc750c89a1edd1072ce3890b2ce498dec633) )
ROM_LOAD( "forte_card_en.u38", 0x00000, 0x10000, CRC(c2090690) SHA1(f0aa8935b90a2ab6043555ece69f926372246648) )
ROM_LOAD( "forte_card_en.u39", 0x10000, 0x10000, CRC(fc3ddf4f) SHA1(4a95b24c4edb67f6d59f795f86dfbd12899e01b0) )
ROM_LOAD( "forte_card_en.u40", 0x20000, 0x10000, CRC(9693bb83) SHA1(e3e3bc750c89a1edd1072ce3890b2ce498dec633) )
/* taken from the Spanish version, these are likely to be identical anyway */
ROM_REGION( 0x0800, "nvram", 0 ) /* default NVRAM */
ROM_LOAD( "fortecrd_nvram.u6", 0x0000, 0x0800, BAD_DUMP CRC(7d3e7eb5) SHA1(788fe7adc381bcc6eaefed33f5aa1081340608a0) )
ROM_REGION16_BE( 0x0100, "eeprom", 0 ) /* default serial EEPROM */
ROM_LOAD16_WORD_SWAP( "forte_card_93cs56_serial_12345678.u13", 0x0000, 0x0100, BAD_DUMP CRC(2fc5961d) SHA1(f958c8b2b4e48cc6e5a607a6751acde5592bd27f) )
ROM_REGION16_BE( 0x0100, "eeprom", 0 ) // default serial EEPROM
ROM_LOAD16_WORD_SWAP( "forte_card_en_93cs56_serial_12345678.u13", 0x0000, 0x0100, CRC(2f546bcd) SHA1(ffd610aa60515eda91bfbbeab8b4f88491f79fcf) )
ROM_REGION( 0x200, "proms", 0 )
ROM_LOAD( "forte_card_82s147.u47", 0x0000, 0x0200, BAD_DUMP CRC(7e631818) SHA1(ac08b0de30260278af3a1c5dee5810d4304cb9ca) )
ROM_LOAD( "forte_card_82s147.u47", 0x0000, 0x0200, CRC(7e631818) SHA1(ac08b0de30260278af3a1c5dee5810d4304cb9ca) )
ROM_END
/***********************************
* Driver Init *
***********************************/
void fortecar_state::init_fortecar()
{
// ...
}
/***********************************
* Game Drivers *
***********************************/
// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS LAYOUT
GAMEL( 1994, fortecrd, 0, fortecar, fortecar, fortecar_state, init_fortecar, ROT0, "Fortex Ltd", "Forte Card (Ver 110, Spanish)", 0, layout_fortecrd )
GAMEL( 1994, fortecar, fortecrd, fortecar, fortecar, fortecar_state, init_fortecar, ROT0, "Fortex Ltd", "Forte Card (Ver 103, English)", MACHINE_NOT_WORKING, layout_fortecrd )
// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS LAYOUT
GAMEL( 1994, fortecrd, 0, fortecrd, fortecrd, fortecrd_state, empty_init, ROT0, "Fortex Ltd.", "Forte Card (Ver 110, Spanish)", 0, layout_fortecrd )
GAMEL( 1994, fortecrde, fortecrd, fortecrd, fortecrd, fortecrd_state, empty_init, ROT0, "Fortex Ltd.", "Forte Card (Ver 103, English)", 0, layout_fortecrd )

View File

@ -13866,7 +13866,7 @@ pesadelo // (c) 1989 Forte II Games
@source:fortecar.cpp
fortecrd // (c) 1994, Fortex Ltd.
fortecar // (c) 1994, Fortex Ltd.
fortecrde // (c) 1994, Fortex Ltd.
@source:fp1100.cpp
fp1100 //