1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     Final Cartridge III emulation
6 
7 **********************************************************************/
8 
9 #include "emu.h"
10 #include "final3.h"
11 
12 
13 
14 //**************************************************************************
15 //  DEVICE DEFINITIONS
16 //**************************************************************************
17 
18 DEFINE_DEVICE_TYPE(C64_FINAL3, c64_final3_cartridge_device, "c64_final3", "C64 Final Cartridge III")
19 
20 
21 //-------------------------------------------------
22 //  INPUT_CHANGED_MEMBER( freeze )
23 //-------------------------------------------------
24 
INPUT_CHANGED_MEMBER(c64_final3_cartridge_device::freeze)25 INPUT_CHANGED_MEMBER( c64_final3_cartridge_device::freeze )
26 {
27 	if (newval)
28 	{
29 		m_game = 0;
30 		m_hidden = 0;
31 	}
32 
33 	m_slot->nmi_w(newval);
34 }
35 
36 
37 //-------------------------------------------------
38 //  INPUT_PORTS( c64_final3 )
39 //-------------------------------------------------
40 
41 static INPUT_PORTS_START( c64_final3 )
42 	PORT_START("SW")
PORT_CODE(KEYCODE_F11)43 	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)
44 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Freeze") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, c64_final3_cartridge_device, freeze, 0)
45 INPUT_PORTS_END
46 
47 
48 //-------------------------------------------------
49 //  input_ports - device-specific input ports
50 //-------------------------------------------------
51 
52 ioport_constructor c64_final3_cartridge_device::device_input_ports() const
53 {
54 	return INPUT_PORTS_NAME( c64_final3 );
55 }
56 
57 
58 
59 //**************************************************************************
60 //  LIVE DEVICE
61 //**************************************************************************
62 
63 //-------------------------------------------------
64 //  c64_final3_cartridge_device - constructor
65 //-------------------------------------------------
66 
c64_final3_cartridge_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)67 c64_final3_cartridge_device::c64_final3_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
68 	device_t(mconfig, C64_FINAL3, tag, owner, clock),
69 	device_c64_expansion_card_interface(mconfig, *this), m_bank(0), m_hidden(0)
70 {
71 }
72 
73 
74 //-------------------------------------------------
75 //  device_start - device-specific startup
76 //-------------------------------------------------
77 
device_start()78 void c64_final3_cartridge_device::device_start()
79 {
80 	// state saving
81 	save_item(NAME(m_bank));
82 	save_item(NAME(m_hidden));
83 }
84 
85 
86 //-------------------------------------------------
87 //  device_reset - device-specific reset
88 //-------------------------------------------------
89 
device_reset()90 void c64_final3_cartridge_device::device_reset()
91 {
92 	m_bank = 0;
93 
94 	m_exrom = 0;
95 	m_game = 0;
96 
97 	m_slot->nmi_w(CLEAR_LINE);
98 
99 	m_hidden = 0;
100 }
101 
102 
103 //-------------------------------------------------
104 //  c64_cd_r - cartridge data read
105 //-------------------------------------------------
106 
c64_cd_r(offs_t offset,uint8_t data,int sphi2,int ba,int roml,int romh,int io1,int io2)107 uint8_t c64_final3_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
108 {
109 	if (!roml || !romh || !io1 || !io2)
110 	{
111 		offs_t addr = (m_bank << 14) | (offset & 0x3fff);
112 		data = m_roml[addr];
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_final3_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 (!m_hidden && !io2 && ((offset & 0xff) == 0xff))
126 	{
127 		/*
128 
129 		    bit     description
130 
131 		    0       A14
132 		    1       A15
133 		    2
134 		    3
135 		    4       EXROM
136 		    5       GAME
137 		    6       NMI
138 		    7       hide register
139 
140 		*/
141 
142 		m_bank = data & 0x03;
143 
144 		m_exrom = BIT(data, 4);
145 		m_game = BIT(data, 5);
146 
147 		m_slot->nmi_w(BIT(data, 6) ? CLEAR_LINE : ASSERT_LINE);
148 
149 		m_hidden = BIT(data, 7);
150 	}
151 }
152