Previous 199869 Revisions Next

r20636 Thursday 31st January, 2013 at 15:17:11 UTC by Curt Coder
(MESS) pet2001: Rewrote the PET 2001 series. [Curt Coder]
[src/mess]mess.mak
[src/mess/drivers]pet.c pet2001.c*
[src/mess/includes]pet2001.h*

trunk/src/mess/includes/pet2001.h
r0r20636
1#pragma once
2
3#ifndef __PET2001__
4#define __PET2001__
5
6#include "emu.h"
7#include "cpu/m6502/m6502.h"
8#include "machine/6821pia.h"
9#include "machine/6522via.h"
10#include "machine/cbmipt.h"
11#include "machine/ieee488.h"
12#include "machine/petcass.h"
13#include "machine/ram.h"
14#include "video/mc6845.h"
15
16#define M6502_TAG       "f3"
17#define M6522_TAG       "a5"
18#define M6520_1_TAG    "g8"
19#define M6520_2_TAG    "b8"
20#define SCREEN_TAG      "screen"
21
22class pet2001_state : public driver_device
23{
24public:
25   pet2001_state(const machine_config &mconfig, device_type type, const char *tag)
26      : driver_device(mconfig, type, tag),
27         m_maincpu(*this, M6502_TAG),
28         m_via(*this, M6522_TAG),
29         m_pia1(*this, M6520_1_TAG),
30         m_pia2(*this, M6520_2_TAG),
31         m_ieee(*this, IEEE488_TAG),
32         m_cassette(*this, PET_DATASSETTE_PORT_TAG),
33         m_cassette2(*this, PET_DATASSETTE_PORT2_TAG),
34         //m_exp(*this, PET_EXPANSION_SLOT_TAG),
35         //m_user(*this, PET_USER_PORT_TAG),
36         m_ram(*this, RAM_TAG),
37         m_rom(*this, M6502_TAG),
38         m_char_rom(*this, "gfx1"),
39         m_video_ram(*this, "video_ram"),
40         m_row0(*this, "ROW0"),
41         m_row1(*this, "ROW1"),
42         m_row2(*this, "ROW2"),
43         m_row3(*this, "ROW3"),
44         m_row4(*this, "ROW4"),
45         m_row5(*this, "ROW5"),
46         m_row6(*this, "ROW6"),
47         m_row7(*this, "ROW7"),
48         m_row8(*this, "ROW8"),
49         m_row9(*this, "ROW9"),
50         m_lock(*this, "LOCK"),
51         m_key(0),
52         m_sync(0),
53         m_graphic(0),
54         m_blanktv(0),
55         m_via_irq(CLEAR_LINE),
56         m_pia1a_irq(CLEAR_LINE),
57         m_pia1b_irq(CLEAR_LINE),
58         m_pia2a_irq(CLEAR_LINE),
59         m_pia2b_irq(CLEAR_LINE),
60         m_exp_irq(CLEAR_LINE)
61   { }
62
63   required_device<m6502_device> m_maincpu;
64   required_device<via6522_device> m_via;
65   required_device<pia6821_device> m_pia1;
66   required_device<pia6821_device> m_pia2;
67   required_device<ieee488_device> m_ieee;
68   required_device<pet_datassette_port_device> m_cassette;
69   required_device<pet_datassette_port_device> m_cassette2;
70   //required_device<pet_expansion_slot_device> m_exp;
71   //required_device<pet_user_port_device> m_user;
72   required_device<ram_device> m_ram;
73   required_memory_region m_rom;
74   required_memory_region m_char_rom;
75   optional_shared_ptr<UINT8> m_video_ram;
76   required_ioport m_row0;
77   required_ioport m_row1;
78   required_ioport m_row2;
79   required_ioport m_row3;
80   required_ioport m_row4;
81   required_ioport m_row5;
82   required_ioport m_row6;
83   required_ioport m_row7;
84   required_ioport m_row8;
85   required_ioport m_row9;
86   required_ioport m_lock;
87
88   virtual void machine_start();
89   virtual void machine_reset();
90
91   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
92
93   void check_interrupts();
94
95   DECLARE_READ8_MEMBER( read );
96   DECLARE_WRITE8_MEMBER( write );
97
98   DECLARE_WRITE_LINE_MEMBER( via_irq_w );
99   DECLARE_READ8_MEMBER( via_pb_r );
100   DECLARE_WRITE8_MEMBER( via_pb_w );
101   DECLARE_WRITE_LINE_MEMBER( via_ca2_w );
102
103   DECLARE_WRITE_LINE_MEMBER( pia1_irqa_w );
104   DECLARE_WRITE_LINE_MEMBER( pia1_irqb_w );
105   DECLARE_READ8_MEMBER( pia1_pa_r );
106   DECLARE_READ8_MEMBER( pia1_pb_r );
107   DECLARE_WRITE8_MEMBER( pia1_pa_w );
108   DECLARE_WRITE_LINE_MEMBER( pia1_ca2_w );
109   DECLARE_READ_LINE_MEMBER( pia1_cb1_r );
110
111   DECLARE_WRITE_LINE_MEMBER( pia2_irqa_w );
112   DECLARE_WRITE_LINE_MEMBER( pia2_irqb_w );
113
114   TIMER_DEVICE_CALLBACK_MEMBER( sync_tick );
115
116   enum
117   {
118      SEL0 = 0,
119      SEL1,
120      SEL2,
121      SEL3,
122      SEL4,
123      SEL5,
124      SEL6,
125      SEL7,
126      SEL8,
127      SEL9,
128      SELA,
129      SELB,
130      SELC,
131      SELD,
132      SELE,
133      SELF
134   };
135
136   // keyboard state
137   UINT8 m_key;
138
139   // video state
140   int m_sync;
141   int m_graphic;
142   int m_blanktv;
143
144   // interrupt state
145   int m_via_irq;
146   int m_pia1a_irq;
147   int m_pia1b_irq;
148   int m_pia2a_irq;
149   int m_pia2b_irq;
150   int m_exp_irq;
151};
152
153
154class pet2001b_state : public pet2001_state
155{
156public:
157   pet2001b_state(const machine_config &mconfig, device_type type, const char *tag)
158      : pet2001_state(mconfig, type, tag)
159   { }
160
161   DECLARE_READ8_MEMBER( pia1_pb_r );
162};
163
164
165
166#endif
No newline at end of file
Property changes on: trunk/src/mess/includes/pet2001.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/mess/drivers/pet2001.c
r0r20636
1/*
2
3   TODO:
4
5   - cursor
6   - accurate video timings
7   - user port
8   - memory expansion port
9
10*/
11
12#include "includes/pet2001.h"
13
14
15
16//**************************************************************************
17//  INTERRUPTS
18//**************************************************************************
19
20//-------------------------------------------------
21//  check_interrupts -
22//-------------------------------------------------
23
24void pet2001_state::check_interrupts()
25{
26   int irq = m_via_irq || m_pia1a_irq || m_pia1b_irq || m_pia2a_irq || m_pia2b_irq || m_exp_irq;
27
28   m_maincpu->set_input_line(M6502_IRQ_LINE, irq);
29}
30
31
32//-------------------------------------------------
33//  read -
34//-------------------------------------------------
35
36READ8_MEMBER( pet2001_state::read )
37{
38   UINT8 data = 0;
39
40   switch (offset >> 12)
41   {
42   case SEL0:
43   case SEL1:
44   case SEL2:
45   case SEL3:
46   case SEL4:
47   case SEL5:
48   case SEL6:
49   case SEL7:
50      if (offset < m_ram->size())
51      {
52         data = m_ram->pointer()[offset];
53      }
54      break;
55
56   case SEL8:
57      data = m_video_ram[offset & 0x3ff];
58      break;
59   
60   case SELE:
61      if (BIT(offset, 11))
62      {
63         if (BIT(offset, 4))
64         {
65            data = m_pia1->read(space, offset & 0x03);
66         }
67         if (BIT(offset, 5))
68         {
69            data = m_pia2->read(space, offset & 0x03);
70         }
71         if (BIT(offset, 6))
72         {
73            data = m_via->read(space, offset & 0x0f);
74         }
75      }
76      else
77      {
78         data = m_rom->base()[offset & 0x3fff];
79      }
80      break;
81
82   case SELC:
83   case SELD:
84   case SELF:
85      data = m_rom->base()[offset & 0x3fff];
86      break;
87   }
88
89   return data;
90}
91
92
93//-------------------------------------------------
94//  write -
95//-------------------------------------------------
96
97WRITE8_MEMBER( pet2001_state::write )
98{
99   switch (offset >> 12)
100   {
101   case SEL0:
102   case SEL1:
103   case SEL2:
104   case SEL3:
105   case SEL4:
106   case SEL5:
107   case SEL6:
108   case SEL7:
109      if (offset < m_ram->size())
110      {
111         m_ram->pointer()[offset] = data;
112      }
113      break;
114
115   case SEL8:
116      m_video_ram[offset & 0x3ff] = data;
117      break;
118
119   case SELE:
120      if (BIT(offset, 11))
121      {
122         if (BIT(offset, 4))
123         {
124            m_pia1->write(space, offset & 0x03, data);
125         }
126         if (BIT(offset, 5))
127         {
128            m_pia2->write(space, offset & 0x03, data);
129         }
130         if (BIT(offset, 6))
131         {
132            m_via->write(space, offset & 0x0f, data);
133         }
134      }
135      break;
136   }
137}
138
139
140
141//**************************************************************************
142//  ADDRESS MAPS
143//**************************************************************************
144
145//-------------------------------------------------
146//  ADDRESS_MAP( pet2001_mem )
147//-------------------------------------------------
148
149static ADDRESS_MAP_START( pet2001_mem, AS_PROGRAM, 8, pet2001_state )
150   AM_RANGE(0x0000, 0xffff) AM_READWRITE(read, write)
151ADDRESS_MAP_END
152
153
154
155//**************************************************************************
156//  INPUT PORTS
157//**************************************************************************
158
159//-------------------------------------------------
160//  INPUT_PORTS( pet )
161//-------------------------------------------------
162
163static INPUT_PORTS_START( pet )
164   PORT_START( "ROW0" )
165   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Right Left") PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
166   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Home  Clr Screen") PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME))
167   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x90") PORT_CODE(KEYCODE_MINUS) PORT_CHAR(0x2190)
168   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9)          PORT_CHAR('(')
169   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7)          PORT_CHAR('&')
170   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5)          PORT_CHAR('%')
171   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3)          PORT_CHAR('#')
172   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1)          PORT_CHAR('!')
173
174   PORT_START( "ROW1" )
175   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Del  Inst") PORT_CODE(KEYCODE_DEL) PORT_CHAR(8) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
176   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Down Up") PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(UCHAR_MAMEKEY(UP))
177   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
178   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0)          PORT_CHAR(')')
179   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8)          PORT_CHAR('\\')
180   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6)          PORT_CHAR('\'')
181   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4)          PORT_CHAR('$')
182   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2)          PORT_CHAR('"')
183
184   PORT_START( "ROW2" )
185   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD)      PORT_CHAR('9')
186   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD)      PORT_CHAR('7')
187   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x91 Pi") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x2191) PORT_CHAR(0x03C0)
188   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O)          PORT_CHAR('O')
189   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U)          PORT_CHAR('U')
190   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T)          PORT_CHAR('T')
191   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E)          PORT_CHAR('E')
192   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)          PORT_CHAR('Q')
193
194   PORT_START( "ROW3" )
195   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD)  PORT_CHAR('/')
196   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD)      PORT_CHAR('8')
197   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
198   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)          PORT_CHAR('P')
199   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I)          PORT_CHAR('I')
200   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y)          PORT_CHAR('Y')
201   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R)          PORT_CHAR('R')
202   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W)          PORT_CHAR('W')
203
204   PORT_START( "ROW4" )
205   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD)      PORT_CHAR('6')
206   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD)      PORT_CHAR('4')
207   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
208   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)          PORT_CHAR('L')
209   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J)          PORT_CHAR('J')
210   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G)          PORT_CHAR('G')
211   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D)          PORT_CHAR('D')
212   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)          PORT_CHAR('A')
213
214   PORT_START( "ROW5" )
215   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK)   PORT_CHAR('*')
216   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD)      PORT_CHAR('5')
217   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
218   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(':')
219   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K)          PORT_CHAR('K')
220   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H)          PORT_CHAR('H')
221   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F)          PORT_CHAR('F')
222   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S)          PORT_CHAR('S')
223
224   PORT_START( "ROW6" )
225   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD)      PORT_CHAR('3')
226   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD)      PORT_CHAR('1')
227   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
228   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP)       PORT_CHAR(';')
229   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M)          PORT_CHAR('M')
230   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B)          PORT_CHAR('B')
231   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C)          PORT_CHAR('C')
232   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z)          PORT_CHAR('Z')
233
234   PORT_START( "ROW7" )
235   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD)   PORT_CHAR('+')
236   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD)      PORT_CHAR('2')
237   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
238   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH)      PORT_CHAR('?')
239   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA)      PORT_CHAR(',')
240   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N)          PORT_CHAR('N')
241   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V)          PORT_CHAR('V')
242   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X)          PORT_CHAR('X')
243
244   PORT_START( "ROW8" )
245   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD)  PORT_CHAR('-')
246   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD)      PORT_CHAR('0')
247   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Right)") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
248   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('>')
249   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
250   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE)  PORT_CHAR(']')
251   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('@')
252   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Left)") PORT_CODE(KEYCODE_LSHIFT)
253
254   PORT_START( "ROW9" )
255   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad =") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR('=')
256   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD)    PORT_CHAR('.')
257   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
258   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Stop Run") PORT_CODE(KEYCODE_QUOTE)
259   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('<')
260   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE)      PORT_CHAR(' ')
261   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('[')
262   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Rvs Off") PORT_CODE(KEYCODE_TAB)
263
264   PORT_START( "LOCK" )
265   PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED )
266   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
267INPUT_PORTS_END
268
269
270//-------------------------------------------------
271//  INPUT_PORTS( petb )
272//-------------------------------------------------
273
274INPUT_PORTS_START( petb )
275   PORT_START( "ROW0" )
276   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
277   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
278   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Right Left") PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
279   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD)      PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
280   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('-') PORT_CHAR('=')
281   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8)          PORT_CHAR('8') PORT_CHAR('\\')
282   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5)          PORT_CHAR('5') PORT_CHAR('%')
283   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2)          PORT_CHAR('2') PORT_CHAR('"')
284
285   PORT_START( "ROW1" )
286   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD)      PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
287   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
288   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x91") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x2191)
289   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD)      PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
290   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD)      PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
291   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7)          PORT_CHAR('7') PORT_CHAR('&')
292   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4)          PORT_CHAR('4') PORT_CHAR('$')
293   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1)          PORT_CHAR('1') PORT_CHAR('!')
294
295   PORT_START( "ROW2" )
296   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD)      PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
297   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR('+')
298   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K)          PORT_CHAR('K')
299   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR(']')
300   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H)          PORT_CHAR('H')
301   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F)          PORT_CHAR('F')
302   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S)          PORT_CHAR('S')
303   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC)        PORT_CHAR(UCHAR_MAMEKEY(ESC))
304
305   PORT_START( "ROW3" )
306   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD)      PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
307   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE)      PORT_CHAR('@')
308   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)          PORT_CHAR('L')
309   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
310   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J)          PORT_CHAR('J')
311   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G)          PORT_CHAR('G')
312   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D)          PORT_CHAR('D')
313   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)          PORT_CHAR('A')
314
315   PORT_START( "ROW4" )
316   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Del  Inst") PORT_CODE(KEYCODE_DEL) PORT_CHAR(8) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
317   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)          PORT_CHAR('P')
318   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I)          PORT_CHAR('I')
319   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('\\')
320   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y)          PORT_CHAR('Y')
321   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R)          PORT_CHAR('R')
322   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W)          PORT_CHAR('W')
323   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB)        PORT_CHAR('\t')
324
325   PORT_START( "ROW5" )
326   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD)      PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
327   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[')
328   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O)          PORT_CHAR('O')
329   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Down Up") PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(UCHAR_MAMEKEY(UP))
330   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U)          PORT_CHAR('U')
331   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T)          PORT_CHAR('T')
332   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E)          PORT_CHAR('E')
333   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)          PORT_CHAR('Q')
334
335   PORT_START( "ROW6" )
336   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD)      PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
337   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Right)") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
338   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
339   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD)    PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
340   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP)       PORT_CHAR('.') PORT_CHAR('>')
341   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B)          PORT_CHAR('B')
342   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C)          PORT_CHAR('C')
343   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Left)") PORT_CODE(KEYCODE_LSHIFT)
344
345   PORT_START( "ROW7" )
346   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD)      PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
347   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Repeat") PORT_CODE(KEYCODE_LALT)
348   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
349   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0)          PORT_CHAR('0') PORT_CHAR(')')
350   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA)      PORT_CHAR(',') PORT_CHAR('<')
351   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N)          PORT_CHAR('N')
352   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V)          PORT_CHAR('V')
353   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z)          PORT_CHAR('Z')
354
355   PORT_START( "ROW8" )
356   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD)      PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
357   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH)      PORT_CHAR('/') PORT_CHAR('?')
358   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
359   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Home  Clr Screen") PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME))
360   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M)          PORT_CHAR('M')
361   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE)      PORT_CHAR(' ')
362   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X)          PORT_CHAR('X')
363   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Rvs Off") PORT_CODE(KEYCODE_INSERT)
364
365   PORT_START( "ROW9" )
366   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
367   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
368   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS)      PORT_CHAR(':') PORT_CHAR('*')
369   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Stop Run") PORT_CODE(KEYCODE_END)
370   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9)          PORT_CHAR('9') PORT_CHAR('(')
371   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6)          PORT_CHAR('6') PORT_CHAR('\'')
372   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3)          PORT_CHAR('3') PORT_CHAR('#')
373   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x90") PORT_CODE(KEYCODE_TILDE) PORT_CHAR(0x2190)
374
375   PORT_START( "LOCK" )
376   PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED )
377   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
378INPUT_PORTS_END
379
380
381
382//**************************************************************************
383//  DEVICE CONFIGURATION
384//**************************************************************************
385
386//-------------------------------------------------
387//  via6522_interface via_intf
388//-------------------------------------------------
389
390WRITE_LINE_MEMBER( pet2001_state::via_irq_w )
391{
392   m_via_irq = state;
393
394   check_interrupts();
395}
396
397READ8_MEMBER( pet2001_state::via_pb_r )
398{
399   /*
400
401       bit     description
402
403       PB0     _NDAC IN
404       PB1     
405       PB2     
406       PB3     
407       PB4     
408       PB5     SYNC IN
409       PB6     _NRFD IN
410       PB7     _DAV IN
411
412   */
413
414   UINT8 data = 0;
415
416   // video sync
417   data |= m_sync << 5;
418
419   // IEEE-488
420   data |= m_ieee->ndac_r();
421   data |= m_ieee->nrfd_r() << 6;
422   data |= m_ieee->dav_r() << 7;
423
424   return data;
425}
426
427WRITE8_MEMBER( pet2001_state::via_pb_w )
428{
429   /*
430
431       bit     description
432
433       PB0     
434       PB1     _NRFD OUT
435       PB2     _ATN OUT
436       PB3     CASS WRITE
437       PB4     #2 CASS MOTOR
438       PB5     
439       PB6     
440       PB7     
441
442   */
443
444   // IEEE-488
445   m_ieee->nrfd_w(BIT(data, 1));
446   m_ieee->atn_w(BIT(data, 2));
447
448   // cassette
449   m_cassette->write(BIT(data, 3));
450   m_cassette2->write(BIT(data, 3));
451   m_cassette2->motor_w(BIT(data, 4));
452}
453
454WRITE_LINE_MEMBER( pet2001_state::via_ca2_w )
455{
456   m_graphic = state;
457}
458
459const via6522_interface via_intf =
460{
461   DEVCB_NULL,//DEVCB_DEVICE_MEMBER(PET_USER_PORT_TAG, pet_user_port_device, pa_r),
462   DEVCB_DRIVER_MEMBER(pet2001_state, via_pb_r),
463   DEVCB_NULL,
464   DEVCB_DEVICE_LINE_MEMBER(PET_DATASSETTE_PORT2_TAG, pet_datassette_port_device, read),
465   DEVCB_NULL,
466   DEVCB_NULL,
467   DEVCB_NULL,//DEVCB_DEVICE_MEMBER(PET_USER_PORT_TAG, pet_user_port_device, pa_w),
468   DEVCB_DRIVER_MEMBER(pet2001_state, via_pb_w),
469   DEVCB_NULL,//DEVCB_DEVICE_LINE_MEMBER(PET_USER_PORT_TAG, pet_user_port_device, ca1_w),
470   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, via_ca2_w),
471   DEVCB_NULL,
472   DEVCB_NULL,//DEVCB_DEVICE_LINE_MEMBER(PET_USER_PORT_TAG, pet_user_port_device, cb2_w),
473   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, via_irq_w)
474};
475
476
477//-------------------------------------------------
478//  pia6821_interface pia1_intf
479//-------------------------------------------------
480
481WRITE_LINE_MEMBER( pet2001_state::pia1_irqa_w )
482{
483   m_pia1a_irq = state;
484
485   check_interrupts();
486}
487
488WRITE_LINE_MEMBER( pet2001_state::pia1_irqb_w )
489{
490   m_pia1b_irq = state;
491
492   check_interrupts();
493}
494
495READ8_MEMBER( pet2001_state::pia1_pa_r )
496{
497   /*
498
499       bit     description
500
501       PA0     KEY A
502       PA1     KEY B
503       PA2     KEY C
504       PA3     KEY D
505       PA4     #1 CASS SWITCH
506       PA5     #2 CASS SWITCH
507       PA6     _EOI IN
508       PA7     DIAG JUMPER
509
510   */
511
512   UINT8 data = 0;
513
514   // keyboard
515   data |= m_key;
516
517   // cassette
518   data |= m_cassette->sense_r() << 4;
519   data |= m_cassette2->sense_r() << 5;
520
521   // IEEE-488
522   data |= m_ieee->eoi_r() << 6;
523
524   // diagnostic jumper
525   data |= 0x80;
526
527   return data;
528}
529
530WRITE8_MEMBER( pet2001_state::pia1_pa_w )
531{
532   /*
533
534       bit     description
535
536       PA0     KEY A
537       PA1     KEY B
538       PA2     KEY C
539       PA3     KEY D
540       PA4     
541       PA5     
542       PA6     
543       PA7     
544
545   */
546
547   // keyboard
548   m_key = data & 0x0f;
549}
550
551READ8_MEMBER( pet2001_state::pia1_pb_r )
552{
553   UINT8 data = 0xff;
554
555   switch (m_key)
556   {
557   case 0: data &= m_row0->read(); break;
558   case 1: data &= m_row1->read(); break;
559   case 2: data &= m_row2->read(); break;
560   case 3: data &= m_row3->read(); break;
561   case 4: data &= m_row4->read(); break;
562   case 5: data &= m_row5->read(); break;
563   case 6: data &= m_row6->read(); break;
564   case 7: data &= m_row7->read(); break;
565   case 8: data &= m_row8->read() & m_lock->read(); break;
566   case 9: data &= m_row9->read(); break;
567   }
568
569   return data;
570}
571
572READ8_MEMBER( pet2001b_state::pia1_pb_r )
573{
574   UINT8 data = 0xff;
575
576   switch (m_key)
577   {
578   case 0: data &= m_row0->read(); break;
579   case 1: data &= m_row1->read(); break;
580   case 2: data &= m_row2->read(); break;
581   case 3: data &= m_row3->read(); break;
582   case 4: data &= m_row4->read(); break;
583   case 5: data &= m_row5->read(); break;
584   case 6: data &= m_row6->read() & m_lock->read(); break;
585   case 7: data &= m_row7->read(); break;
586   case 8: data &= m_row8->read(); break;
587   case 9: data &= m_row9->read(); break;
588   }
589
590   return data;
591}
592
593READ_LINE_MEMBER( pet2001_state::pia1_cb1_r )
594{
595   return m_sync;
596}
597
598WRITE_LINE_MEMBER( pet2001_state::pia1_ca2_w )
599{
600   m_ieee->eoi_w(state);
601
602   m_blanktv = state;
603}
604
605const pia6821_interface pia1_intf =
606{
607   DEVCB_DRIVER_MEMBER(pet2001_state, pia1_pa_r),
608   DEVCB_DRIVER_MEMBER(pet2001_state, pia1_pb_r),
609   DEVCB_DEVICE_LINE_MEMBER(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, read),
610   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia1_cb1_r),
611   DEVCB_NULL,
612   DEVCB_NULL,
613   DEVCB_DRIVER_MEMBER(pet2001_state, pia1_pa_w),
614   DEVCB_NULL,
615   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia1_ca2_w),
616   DEVCB_DEVICE_LINE_MEMBER(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, motor_w),
617   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia1_irqa_w),
618   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia1_irqb_w)
619};
620
621const pia6821_interface pet2001b_pia1_intf =
622{
623   DEVCB_DRIVER_MEMBER(pet2001_state, pia1_pa_r),
624   DEVCB_DRIVER_MEMBER(pet2001b_state, pia1_pb_r),
625   DEVCB_DEVICE_LINE_MEMBER(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, read),
626   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia1_cb1_r),
627   DEVCB_NULL,
628   DEVCB_NULL,
629   DEVCB_DRIVER_MEMBER(pet2001_state, pia1_pa_w),
630   DEVCB_NULL,
631   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia1_ca2_w),
632   DEVCB_DEVICE_LINE_MEMBER(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, motor_w),
633   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia1_irqa_w),
634   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia1_irqb_w)
635};
636
637
638//-------------------------------------------------
639//  pia6821_interface pia2_intf
640//-------------------------------------------------
641
642WRITE_LINE_MEMBER( pet2001_state::pia2_irqa_w )
643{
644   m_pia2a_irq = state;
645
646   check_interrupts();
647}
648
649WRITE_LINE_MEMBER( pet2001_state::pia2_irqb_w )
650{
651   m_pia2b_irq = state;
652
653   check_interrupts();
654}
655
656const pia6821_interface pia2_intf =
657{
658   DEVCB_DEVICE_MEMBER(IEEE488_TAG, ieee488_device, dio_r),
659   DEVCB_NULL,
660   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, atn_r),
661   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, srq_r),
662   DEVCB_NULL,
663   DEVCB_NULL,
664   DEVCB_NULL,
665   DEVCB_DEVICE_MEMBER(IEEE488_TAG, ieee488_device, dio_w),
666   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, ndac_w),
667   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, dav_w),
668   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia2_irqa_w),
669   DEVCB_DRIVER_LINE_MEMBER(pet2001_state, pia2_irqb_w)
670};
671
672
673//-------------------------------------------------
674//  IEEE488_INTERFACE( ieee488_intf )
675//-------------------------------------------------
676
677static IEEE488_INTERFACE( ieee488_intf )
678{
679   DEVCB_NULL,
680   DEVCB_NULL,
681   DEVCB_NULL,
682   DEVCB_NULL,
683   DEVCB_NULL,
684   DEVCB_DEVICE_LINE_MEMBER(M6520_2_TAG, pia6821_device, cb1_w),
685   DEVCB_DEVICE_LINE_MEMBER(M6520_2_TAG, pia6821_device, ca1_w),
686   DEVCB_NULL
687};
688
689
690//-------------------------------------------------
691//  PET_DATASSETTE_PORT_INTERFACE( datassette_intf )
692//-------------------------------------------------
693
694static PET_DATASSETTE_PORT_INTERFACE( datassette_intf )
695{
696   DEVCB_DEVICE_LINE_MEMBER(M6520_1_TAG, pia6821_device, ca1_w)
697};
698
699
700//-------------------------------------------------
701//  PET_DATASSETTE_PORT_INTERFACE( datassette2_intf )
702//-------------------------------------------------
703
704static PET_DATASSETTE_PORT_INTERFACE( datassette2_intf )
705{
706   DEVCB_DEVICE_LINE_MEMBER(M6522_TAG, via6522_device, write_cb1)
707};
708
709
710
711//**************************************************************************
712//  VIDEO
713//**************************************************************************
714
715//-------------------------------------------------
716//  TIMER_DEVICE_CALLBACK( sync_tick )
717//-------------------------------------------------
718
719TIMER_DEVICE_CALLBACK_MEMBER( pet2001_state::sync_tick )
720{
721   m_sync = !m_sync;
722
723   m_pia1->cb1_w(m_sync);
724}
725
726
727//-------------------------------------------------
728//  SCREEN_UPDATE( pet2001 )
729//-------------------------------------------------
730
731UINT32 pet2001_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
732{
733   for (int y = 0; y < 200; y++)
734   {
735      for (int sx = 0; sx < 40; sx++)
736      {
737         int sy = y / 8;
738         offs_t video_addr = (sy * 40) + sx;
739         UINT8 code = m_video_ram[video_addr];
740
741         int ra = y & 0x07;
742         offs_t char_addr = (m_graphic << 10) | (code << 3) | ra;
743         UINT8 data = m_char_rom->base()[char_addr];
744
745         for (int x = 0; x < 8; x++)
746         {
747            int color = BIT(data, 7);
748
749            bitmap.pix32(y, (sx * 8) + x) = RGB_MONOCHROME_GREEN[color];
750           
751            data <<= 1;
752         }
753      }
754   }
755
756   return 0;
757}
758
759
760
761//**************************************************************************
762//  MACHINE INITIALIZATION
763//**************************************************************************
764
765//-------------------------------------------------
766//  MACHINE_START( pet2001 )
767//-------------------------------------------------
768
769void pet2001_state::machine_start()
770{
771   // allocate memory
772   m_video_ram.allocate(0x400);
773
774   // initialize memory
775   UINT8 data = 0xff;
776
777   for (offs_t offset = 0; offset < m_ram->size(); offset++)
778   {
779      m_ram->pointer()[offset] = data;
780      if (!(offset % 64)) data ^= 0xff;
781   }
782
783   data = 0xff;
784
785   for (offs_t offset = 0; offset < 0x400; offset++)
786   {
787      m_video_ram[offset] = data;
788      if (!(offset % 64)) data ^= 0xff;
789   }
790
791   // state saving
792   save_item(NAME(m_key));
793   save_item(NAME(m_sync));
794   save_item(NAME(m_graphic));
795   save_item(NAME(m_blanktv));
796   save_item(NAME(m_via_irq));
797   save_item(NAME(m_pia1a_irq));
798   save_item(NAME(m_pia1b_irq));
799   save_item(NAME(m_pia2a_irq));
800   save_item(NAME(m_pia2b_irq));
801   save_item(NAME(m_exp_irq));
802}
803
804
805//-------------------------------------------------
806//  MACHINE_RESET( pet2001 )
807//-------------------------------------------------
808
809void pet2001_state::machine_reset()
810{
811   m_maincpu->reset();
812
813   m_via->reset();
814   m_pia1->reset();
815   m_pia2->reset();
816   //m_exp->reset();
817}
818
819
820
821//**************************************************************************
822//  MACHINE DRIVERS
823//**************************************************************************
824
825//-------------------------------------------------
826//  MACHINE_CONFIG( pet2001 )
827//-------------------------------------------------
828
829static MACHINE_CONFIG_START( pet2001, pet2001_state )
830   // basic machine hardware
831   MCFG_CPU_ADD(M6502_TAG, M6502, XTAL_8MHz/8)
832   MCFG_CPU_PROGRAM_MAP(pet2001_mem)
833
834   // video hardware
835   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
836   MCFG_SCREEN_REFRESH_RATE(60)
837   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
838   MCFG_SCREEN_SIZE(320, 200)
839   MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
840   MCFG_SCREEN_UPDATE_DRIVER(pet2001_state, screen_update)
841   MCFG_TIMER_DRIVER_ADD_PERIODIC("sync_timer", pet2001_state, sync_tick, attotime::from_hz(120))
842
843   // devices
844   MCFG_VIA6522_ADD(M6522_TAG, XTAL_8MHz/8, via_intf)
845   MCFG_PIA6821_ADD(M6520_1_TAG, pia1_intf)
846   MCFG_PIA6821_ADD(M6520_2_TAG, pia2_intf)
847   MCFG_CBM_IEEE488_ADD(ieee488_intf, "c4040")
848   MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
849   MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT2_TAG, datassette2_intf, cbm_datassette_devices, NULL, NULL)
850   //MCFG_QUICKLOAD_ADD("quickload", cbm_pet, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
851   //MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL_8MHz/8, pet_expansion_cards, NULL, NULL)
852   //MCFG_PET_USER_PORT_ADD(PET_USER_PORT_TAG, user_intf, pet_user_port_cards, NULL, NULL)
853
854   // internal RAM
855   MCFG_RAM_ADD(RAM_TAG)
856   MCFG_RAM_DEFAULT_SIZE("4K")
857   MCFG_RAM_EXTRA_OPTIONS("8K")
858
859   // software lists
860   MCFG_SOFTWARE_LIST_ADD("rom_list", "pet_rom")
861   MCFG_SOFTWARE_LIST_ADD("flop_list", "pet_flop")
862MACHINE_CONFIG_END
863
864
865//-------------------------------------------------
866//  MACHINE_CONFIG( pet2001n )
867//-------------------------------------------------
868
869static MACHINE_CONFIG_DERIVED( pet2001n, pet2001 )
870   MCFG_RAM_MODIFY(RAM_TAG)
871   MCFG_RAM_DEFAULT_SIZE("8K")
872   MCFG_RAM_EXTRA_OPTIONS("16K,32K")
873MACHINE_CONFIG_END
874
875
876//-------------------------------------------------
877//  MACHINE_CONFIG( pet2001b )
878//-------------------------------------------------
879
880static MACHINE_CONFIG_DERIVED_CLASS( pet2001b, pet2001, pet2001b_state )
881   MCFG_DEVICE_REMOVE(M6520_1_TAG)
882   MCFG_PIA6821_ADD(M6520_1_TAG, pet2001b_pia1_intf)
883
884   MCFG_RAM_MODIFY(RAM_TAG)
885   MCFG_RAM_DEFAULT_SIZE("8K")
886   MCFG_RAM_EXTRA_OPTIONS("16K,32K")
887MACHINE_CONFIG_END
888
889
890
891//**************************************************************************
892//  ROMS
893//**************************************************************************
894
895//-------------------------------------------------
896//  ROM( pet2001 )
897//-------------------------------------------------
898
899ROM_START( pet2001 )
900   ROM_REGION( 0x4000, M6502_TAG, 0 )
901   ROM_DEFAULT_BIOS( "basic1r" )
902   ROM_SYSTEM_BIOS( 0, "basic1o", "Original" )
903   ROMX_LOAD( "901447-01.h1", 0x0000, 0x0800, CRC(a055e33a) SHA1(831db40324113ee996c434d38b4add3fd1f820bd), ROM_BIOS(1) )
904   ROM_SYSTEM_BIOS( 1, "basic1r", "Revised" )
905   ROMX_LOAD( "901447-09.h1", 0x0000, 0x0800, CRC(03cf16d0) SHA1(1330580c0614d3556a389da4649488ba04a60908), ROM_BIOS(2) )
906   ROM_LOAD( "901447-02.h5", 0x0800, 0x0800, CRC(69fd8a8f) SHA1(70c0f4fa67a70995b168668c957c3fcf2c8641bd) )
907   ROM_LOAD( "901447-03.h2", 0x1000, 0x0800, CRC(d349f2d4) SHA1(4bf2c20c51a63d213886957485ebef336bb803d0) )
908   ROM_LOAD( "901447-04.h6", 0x1800, 0x0800, CRC(850544eb) SHA1(d293972d529023d8fd1f493149e4777b5c253a69) )
909   ROM_LOAD( "901447-05.h3", 0x2000, 0x0800, CRC(9e1c5cea) SHA1(f02f5fb492ba93dbbd390f24c10f7a832dec432a) )
910   ROM_LOAD( "901447-06.h4", 0x3000, 0x0800, CRC(661a814a) SHA1(960717282878e7de893d87242ddf9d1512be162e) )
911   ROM_LOAD( "901447-07.h7", 0x3800, 0x0800, CRC(c4f47ad1) SHA1(d440f2510bc52e20c3d6bc8b9ded9cea7f462a9c) )
912
913   ROM_REGION( 0x800, "gfx1", 0 )
914   ROM_LOAD( "901447-08.a2", 0x000, 0x800, CRC(54f32f45) SHA1(3e067cc621e4beafca2b90cb8f6dba975df2855b) )
915ROM_END
916
917
918//-------------------------------------------------
919//  ROM( pet2001n )
920//-------------------------------------------------
921
922ROM_START( pet2001n )
923   ROM_REGION( 0x4000, M6502_TAG, 0 )
924   ROM_LOAD( "901465-01.ud6", 0x0000, 0x1000, CRC(63a7fe4a) SHA1(3622111f486d0e137022523657394befa92bde44) )   // BASIC 2
925   ROM_LOAD( "901465-02.ud7", 0x1000, 0x1000, CRC(ae4cb035) SHA1(1bc0ebf27c9bb62ad71bca40313e874234cab6ac) )   // BASIC 2
926   ROM_LOAD( "901447-24.ud8", 0x2000, 0x0800, CRC(e459ab32) SHA1(5e5502ce32f5a7e387d65efe058916282041e54b) )   // Screen Editor (40 columns, no CRTC, Normal Keyb)
927   ROM_LOAD( "901465-03.ud9", 0x3000, 0x1000, CRC(f02238e2) SHA1(38742bdf449f629bcba6276ef24d3daeb7da6e84) )   // Kernal
928
929   ROM_REGION( 0x800, "gfx1", 0 )
930   ROM_LOAD( "901447-10.uf10", 0x000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )   // Character Generator
931ROM_END
932
933
934//-------------------------------------------------
935//  ROM( pet2001b )
936//-------------------------------------------------
937
938ROM_START( pet2001b )
939   ROM_REGION( 0x4000, M6502_TAG, 0 )
940   ROM_LOAD( "901465-01.ud6", 0x0000, 0x1000, CRC(63a7fe4a) SHA1(3622111f486d0e137022523657394befa92bde44) )   // BASIC 2
941   ROM_LOAD( "901465-02.ud7", 0x1000, 0x1000, CRC(ae4cb035) SHA1(1bc0ebf27c9bb62ad71bca40313e874234cab6ac) )   // BASIC 2
942   ROM_LOAD( "901474-01.ud8", 0x2000, 0x0800, CRC(05db957e) SHA1(174ace3a8c0348cd21d39cc864e2adc58b0101a9) )   // Screen Editor (40 columns, no CRTC, Business Keyb)
943   ROM_LOAD( "901465-03.ud9", 0x3000, 0x1000, CRC(f02238e2) SHA1(38742bdf449f629bcba6276ef24d3daeb7da6e84) )   // Kernal
944
945   ROM_REGION( 0x800, "gfx1", 0 )
946   ROM_LOAD( "901447-10.uf10", 0x000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )   // Character Generator
947ROM_END
948
949
950
951//**************************************************************************
952//  SYSTEM DRIVERS
953//**************************************************************************
954
955//    YEAR  NAME    PARENT  COMPAT  MACHINE     INPUT   INIT                        COMPANY                        FULLNAME                                     FLAGS
956COMP( 1977, pet2001,  0,        0,        pet2001,       pet, driver_device,      0,     "Commodore Business Machines",  "PET 2001", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
957COMP( 1979, pet2001n, pet2001,  0,        pet2001n,      pet, driver_device,      0,     "Commodore Business Machines",  "PET 2001-N", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
958COMP( 1979, pet2001b, pet2001,  0,        pet2001b,     petb, driver_device,      0,     "Commodore Business Machines",  "PET 2001-B", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
Property changes on: trunk/src/mess/drivers/pet2001.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/mess/drivers/pet.c
r20635r20636
730730static MACHINE_CONFIG_DERIVED( petb, pet )
731731   MCFG_PIA6821_MODIFY( "pia_0", petb_pia0 )
732732MACHINE_CONFIG_END
733
733#if 0
734734static MACHINE_CONFIG_DERIVED( pet2001, pet_general )
735735   MCFG_QUICKLOAD_ADD("quickload", cbm_pet1, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
736736   MCFG_FRAGMENT_ADD(pet_cartslot)
r20635r20636
743743   /* IEEE bus */
744744   MCFG_CBM_IEEE488_ADD(ieee488_intf, "c4040")
745745MACHINE_CONFIG_END
746#endif
746747
747
748748static MACHINE_CONFIG_DERIVED( pet40, pet )
749749   MCFG_CPU_MODIFY( "maincpu" )
750750   MCFG_CPU_PROGRAM_MAP( pet40_mem)
r20635r20636
11621162
11631163/* YEAR    NAME      PARENT    COMPAT    MACHINE   INPUT     INIT      COMPANY                             FULLNAME */
11641164
1165COMP(1977, pet2001,  0,        0,        pet2001,  pet, pet_state,      pet2001, "Commodore Business Machines",  "PET 2001", GAME_NOT_WORKING | GAME_NO_SOUND)
1166COMP(1979, pet2001n, pet2001,  0,        pet,      pet, pet_state,      pet,     "Commodore Business Machines",  "PET 2001-N", GAME_NOT_WORKING | GAME_NO_SOUND)
1167COMP(1979, pet2001b, pet2001,  0,        petb,     petb, pet_state,     pet,     "Commodore Business Machines",  "PET 2001-B", GAME_NOT_WORKING | GAME_NO_SOUND)
11681165COMP(1979, cbm30,    pet2001,  0,        pet,      pet, pet_state,      pet,     "Commodore Business Machines",  "CBM 30xx", GAME_NOT_WORKING | GAME_NO_SOUND)
11691166COMP(1979, cbm30b,   pet2001,  0,        petb,     petb, pet_state,     pet,     "Commodore Business Machines",  "CBM 30xx (Business keyboard)", GAME_NOT_WORKING | GAME_NO_SOUND)
11701167COMP(1979, cbm30nor, pet2001,  0,        petb,     petb, pet_state,     pet,     "Commodore Business Machines",  "CBM 30xx (Norway, Business keyboard)", GAME_NOT_WORKING | GAME_NO_SOUND)
trunk/src/mess/mess.mak
r20635r20636
824824   $(MESS_VIDEO)/hd44352.o     \
825825
826826$(MESSOBJ)/cbm.a:               \
827   $(MESS_DRIVERS)/pet2001.o   \
827828   $(MESS_VIDEO)/pet.o         \
828829   $(MESS_DRIVERS)/pet.o       \
829830   $(MESS_MACHINE)/pet.o       \

Previous 199869 Revisions Next


© 1997-2024 The MAME Team