1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     Final Cartridge emulation
6 
7 **********************************************************************/
8 
9 #include "emu.h"
10 #include "final.h"
11 
12 
13 
14 //**************************************************************************
15 //  DEVICE DEFINITIONS
16 //**************************************************************************
17 
18 DEFINE_DEVICE_TYPE(C64_FINAL, c64_final_cartridge_device, "c64_final", "C64 Final Cartridge")
19 
20 
21 //-------------------------------------------------
22 //  INPUT_CHANGED_MEMBER( freeze )
23 //-------------------------------------------------
24 
INPUT_CHANGED_MEMBER(c64_final_cartridge_device::freeze)25 INPUT_CHANGED_MEMBER( c64_final_cartridge_device::freeze )
26 {
27 	if (newval)
28 	{
29 		m_game = 0;
30 	}
31 
32 	m_slot->nmi_w(newval);
33 }
34 
35 
36 //-------------------------------------------------
37 //  INPUT_PORTS( c64_final )
38 //-------------------------------------------------
39 
40 static INPUT_PORTS_START( c64_final )
41 	PORT_START("SW")
PORT_CODE(KEYCODE_F11)42 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reset") PORT_CODE(KEYCODE_F11) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF_OWNER, c64_expansion_slot_device, reset_w)
43 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Freeze") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, c64_final_cartridge_device, freeze, 0)
44 INPUT_PORTS_END
45 
46 
47 //-------------------------------------------------
48 //  input_ports - device-specific input ports
49 //-------------------------------------------------
50 
51 ioport_constructor c64_final_cartridge_device::device_input_ports() const
52 {
53 	return INPUT_PORTS_NAME( c64_final );
54 }
55 
56 
57 
58 //**************************************************************************
59 //  LIVE DEVICE
60 //**************************************************************************
61 
62 //-------------------------------------------------
63 //  c64_final_cartridge_device - constructor
64 //-------------------------------------------------
65 
c64_final_cartridge_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)66 c64_final_cartridge_device::c64_final_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
67 	device_t(mconfig, C64_FINAL, tag, owner, clock),
68 	device_c64_expansion_card_interface(mconfig, *this)
69 {
70 }
71 
72 
73 //-------------------------------------------------
74 //  device_start - device-specific startup
75 //-------------------------------------------------
76 
device_start()77 void c64_final_cartridge_device::device_start()
78 {
79 }
80 
81 
82 //-------------------------------------------------
83 //  device_reset - device-specific reset
84 //-------------------------------------------------
85 
device_reset()86 void c64_final_cartridge_device::device_reset()
87 {
88 	m_exrom = 0;
89 	m_game = 0;
90 }
91 
92 
93 //-------------------------------------------------
94 //  c64_cd_r - cartridge data read
95 //-------------------------------------------------
96 
c64_cd_r(offs_t offset,uint8_t data,int sphi2,int ba,int roml,int romh,int io1,int io2)97 uint8_t c64_final_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
98 {
99 	if (!roml || !romh || !io1 || !io2)
100 	{
101 		data = m_roml[offset & 0x3fff];
102 	}
103 
104 	if (!io1)
105 	{
106 		m_game = 1;
107 		m_exrom = 1;
108 	}
109 	else if (!io2)
110 	{
111 		m_exrom = 0;
112 		m_game = 0;
113 	}
114 
115 	return data;
116 }
117 
118 
119 //-------------------------------------------------
120 //  c64_cd_w - cartridge data write
121 //-------------------------------------------------
122 
c64_cd_w(offs_t offset,uint8_t data,int sphi2,int ba,int roml,int romh,int io1,int io2)123 void c64_final_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
124 {
125 	if (!io1)
126 	{
127 		m_game = 1;
128 		m_exrom = 1;
129 	}
130 	else if (!io2)
131 	{
132 		m_exrom = 0;
133 		m_game = 0;
134 	}
135 }
136