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