Previous 199869 Revisions Next

r31398 Wednesday 23rd July, 2014 at 10:12:46 UTC by hap
(MESS)
Systems Promoted from GAME_NOT_WORKING:
---------------------------------------
TI-74 BASICALC [hap]
[hash]ti74_cart.xml*
[src/mess/drivers]cc40.c ti74.c
[src/mess/layout]ti74.lay

trunk/hash/ti74_cart.xml
r0r31398
1<?xml version="1.0"?>
2<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
3
4<softwarelist name="ti74_cart" description="TI-74 cartridges">
5
6<!--
7
8    Not dumped yet:
9    - Chemical Engineering
10    - Finance
11    - Mathematics
12    - Statistics
13
14    Not included in list:
15    - 8KB RAM, battery backed
16
17-->
18
19
20   <software name="pascal">
21      <description>Learn Pascal</description>
22      <year>1985</year>
23      <publisher>Texas Instruments</publisher>
24      <info name="usage" value="Load with RUN &quot;PASCAL&quot;" />
25      <part name="cart" interface="ti74_cart">
26         <dataarea name="rom" size="0x8000">
27            <rom name="pascal.bin" size="0x8000" crc="e4135cff" sha1="eab92188fb19545f677ede926c2c0b6af26b7e25" offset="0" />
28         </dataarea>
29      </part>
30   </software>
31
32</softwarelist>
Property changes on: trunk/hash/ti74_cart.xml
Added: svn:eol-style
   + native
Added: svn:mime-type
   + text/xml
trunk/src/mess/layout/ti74.lay
r31397r31398
11<?xml version="1.0"?>
22<mamelayout version="2">
3
4   <element name="static_bg">
5      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
6   </element>
7
8<!-- define lcd indicators -->
9
10   <element name="ind_left" defstate="0">
11      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
12      <text string="&lt;" align="1" state="0">
13         <color red="0.494" green="0.501" blue="0.522" />
14      </text>
15      <text string="&lt;" align="1" state="1">
16         <color red="0.361" green="0.325" blue="0.345" />
17      </text>
18   </element>
19
20   <element name="ind_right" defstate="0">
21      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
22      <text string="&gt;" align="2" state="0">
23         <color red="0.494" green="0.501" blue="0.522" />
24      </text>
25      <text string="&gt;" align="2" state="1">
26         <color red="0.361" green="0.325" blue="0.345" />
27      </text>
28   </element>
29
30   <element name="ind_shift" defstate="0">
31      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
32      <text string="SHIFT" state="0">
33         <color red="0.494" green="0.501" blue="0.522" />
34      </text>
35      <text string="SHIFT" state="1">
36         <color red="0.361" green="0.325" blue="0.345" />
37      </text>
38   </element>
39
40   <element name="ind_ctl" defstate="0">
41      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
42      <text string="CTL" state="0">
43         <color red="0.494" green="0.501" blue="0.522" />
44      </text>
45      <text string="CTL" state="1">
46         <color red="0.361" green="0.325" blue="0.345" />
47      </text>
48   </element>
49
50   <element name="ind_fn" defstate="0">
51      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
52      <text string="FN" state="0">
53         <color red="0.494" green="0.501" blue="0.522" />
54      </text>
55      <text string="FN" state="1">
56         <color red="0.361" green="0.325" blue="0.345" />
57      </text>
58   </element>
59
60   <element name="ind_io" defstate="0">
61      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
62      <text string="I/O" state="0">
63         <color red="0.494" green="0.501" blue="0.522" />
64      </text>
65      <text string="I/O" state="1">
66         <color red="0.361" green="0.325" blue="0.345" />
67      </text>
68   </element>
69
70   <element name="ind_ucl" defstate="0">
71      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
72      <text string="UCL" state="0">
73         <color red="0.494" green="0.501" blue="0.522" />
74      </text>
75      <text string="UCL" state="1">
76         <color red="0.361" green="0.325" blue="0.345" />
77      </text>
78   </element>
79
80   <element name="ind_basic" defstate="0">
81      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
82      <text string="BASIC" state="0">
83         <color red="0.494" green="0.501" blue="0.522" />
84      </text>
85      <text string="BASIC" state="1">
86         <color red="0.361" green="0.325" blue="0.345" />
87      </text>
88   </element>
89
90   <element name="ind_calc" defstate="0">
91      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
92      <text string="CALC" state="0">
93         <color red="0.494" green="0.501" blue="0.522" />
94      </text>
95      <text string="CALC" state="1">
96         <color red="0.361" green="0.325" blue="0.345" />
97      </text>
98   </element>
99
100   <element name="ind_deg" defstate="0">
101      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
102      <text string="DEG" state="0">
103         <color red="0.494" green="0.501" blue="0.522" />
104      </text>
105      <text string="DEG" state="1">
106         <color red="0.361" green="0.325" blue="0.345" />
107      </text>
108   </element>
109
110   <element name="ind_rad" defstate="0">
111      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
112      <text string="RAD" state="0">
113         <color red="0.494" green="0.501" blue="0.522" />
114      </text>
115      <text string="RAD" state="1">
116         <color red="0.361" green="0.325" blue="0.345" />
117      </text>
118   </element>
119
120   <element name="ind_grad" defstate="0">
121      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
122      <text string="GRAD" state="0">
123         <color red="0.494" green="0.501" blue="0.522" />
124      </text>
125      <text string="GRAD" state="1">
126         <color red="0.361" green="0.325" blue="0.345" />
127      </text>
128   </element>
129
130   <element name="ind_stat" defstate="0">
131      <rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
132      <text string="STAT" state="0">
133         <color red="0.494" green="0.501" blue="0.522" />
134      </text>
135      <text string="STAT" state="1">
136         <color red="0.361" green="0.325" blue="0.345" />
137      </text>
138   </element>
139
140   <element name="ind_low" defstate="0">
141      <rect state="0"><color red="0.494" green="0.501" blue="0.522" /></rect>
142      <rect state="1"><color red="0.361" green="0.325" blue="0.345" /></rect>
143      <text string="LOW">
144         <color red="0.5412" green="0.57255" blue="0.5804" />
145      </text>
146   </element>
147
148
149
3150   <view name="Internal Layout">
151      <bounds left="0" top="0" right="189" bottom="28" />
152
4153      <screen index="0">
5         <bounds left="0" top="0" right="~scr0width~" bottom="~scr0height~" />
154         <bounds x="1" y="9" width="187" height="10" />
6155      </screen>
156
157<!-- draw background around lcd screen matrix part -->
158
159      <bezel element="static_bg">
160         <bounds left="0" top="0" right="188" bottom="9.25" />
161      </bezel>
162      <bezel element="static_bg">
163         <bounds left="0" top="0" right="1.25" bottom="28" />
164      </bezel>
165      <bezel element="static_bg">
166         <bounds left="187.75" top="0" right="189" bottom="28" />
167      </bezel>
168      <bezel element="static_bg">
169         <bounds left="0" top="18.75" right="188" bottom="28" />
170      </bezel>
171
172<!-- draw top row of lcd indicators -->
173
174      <bezel name="lamp10" element="ind_left">
175         <bounds x="1.5" y="1" width="20" height="5" />
176      </bezel>
177
178      <bezel name="lamp4" element="ind_right">
179         <bounds x="167.5" y="1" width="20" height="5" />
180      </bezel>
181
182      <bezel name="lamp11" element="ind_shift">
183         <bounds x="16" y="1" width="20" height="5" />
184      </bezel>
185      <bezel name="lamp12" element="ind_ctl">
186         <bounds x="43" y="1" width="20" height="5" />
187      </bezel>
188      <bezel name="lamp13" element="ind_fn">
189         <bounds x="70" y="1" width="20" height="5" />
190      </bezel>
191      <bezel name="lamp14" element="ind_io">
192         <bounds x="97" y="1" width="20" height="5" />
193      </bezel>
194      <bezel name="lamp2" element="ind_ucl">
195         <bounds x="124" y="1" width="20" height="5" />
196      </bezel>
197      <bezel name="lamp3" element="ind_low">
198         <bounds x="154" y="1" width="12" height="5" />
199      </bezel>
200
201<!-- draw bottom row of lcd indicators -->
202
203      <bezel name="lamp63" element="ind_basic">
204         <bounds x="16" y="22" width="20" height="5" />
205      </bezel>
206      <bezel name="lamp64" element="ind_calc">
207         <bounds x="43" y="22" width="20" height="5" />
208      </bezel>
209      <bezel name="lamp1" element="ind_deg">
210         <bounds x="70" y="22" width="20" height="5" />
211      </bezel>
212      <bezel name="lamp62" element="ind_rad">
213         <bounds x="97" y="22" width="20" height="5" />
214      </bezel>
215      <bezel name="lamp53" element="ind_grad">
216         <bounds x="124" y="22" width="20" height="5" />
217      </bezel>
218      <bezel name="lamp54" element="ind_stat">
219         <bounds x="151" y="22" width="20" height="5" />
220      </bezel>
221
7222   </view>
8223</mamelayout>
trunk/src/mess/drivers/ti74.c
r31397r31398
22// copyright-holders:hap
33/***************************************************************************
44
5  TI-74 BASICALC
5  Texas Instruments TI-74 BASICALC
6  hardware family: CC-40 -> TI-74 BASICALC -> TI-95 PROCALC
67
8          DOCK-BUS
9        --||||||||---
10    C  ==           |
11    a  ==           |
12    r  ==  HN61256  |
13    t  ==           ----------------------------
14        |                                      |
15  -------            C70009          4MHz      |
16  |        HM6264                    RC4193N   |
17  |                                            |
18  |                                            |
19  |                                            |
20  |                                            |
21  ---------------||||||||||||||||||||||||-------
22                 ||||||||||||||||||||||||
23  ---------------||||||||||||||||||||||||-------
24  |              *HD44100H   *HD44780A00       |
25  |                                            |
26  |                                            |
27  |                                            |
28  |                                            |
29  ----------                                   |
30           |-----------------------------------|
31           ||                                 ||
32           || LCD 1 line, 31 chars + 14 indic.||
33           ||                                 ||
34           |-----------------------------------|
35           -------------------------------------
736
37  IC1 HN61256PC93 - Hitachi DIP-28 32KB CMOS Mask PROM
38  IC2 C70009      - Texas Instruments TMS70C40 with some TI custom I/O mods, 54 pins (also seen labeled TMS70C46)
39                    running at max 4MHz. 128 bytes internal RAM, 4KB internal ROM
40  IC3 HM6264LP-15 - Hitachi 8KB SRAM (battery backed)
41  RC4193N         - Micropower Switching Regulator
42  HD44100H        - 60-pin QFP Hitachi HD44100 LCD Driver
43  HD44780A00      - 80-pin TFP Hitachi HD44780 LCD Controller
44
45  *               - indicates that it's on the other side of the PCB
46
47 
48  Overall, the hardware is very similar to TI CC-40. A lot has been shuffled around
49  to cut down on complexity (and probably for protection too).
50 
51  TI-74 is powered by 4 AAA batteries. These will also save internal RAM,
52  provided that the machine is turned off properly.
53 
54 
855  TODO:
9  - x
56  - control_r/w clock divider (currently always running full speed)
57  - external ram cartridge
58  - DOCK-BUS interface and peripherals
59    * CI-7 cassette interface
60    * PC-324 thermal printer
61    (+ old Hexbus devices can be connected via a converter cable)
1062
1163***************************************************************************/
1264
1365#include "emu.h"
1466#include "cpu/tms7000/tms7000.h"
1567#include "video/hd44780.h"
68#include "machine/nvram.h"
69#include "imagedev/cartslot.h"
1670
1771#include "ti74.lh"
1872
r31397r31398
2781
2882   required_device<tms70c46_device> m_maincpu;
2983
84   ioport_port *m_key_matrix[8];
85   emu_timer *m_poweron_timer;
86
87   UINT8 m_control;
88   UINT8 m_key_select;
89   UINT16 m_ext_address;
90   UINT8 m_power;
91
92   void update_lcd_indicator(UINT8 y, UINT8 x, int state);
93
94   DECLARE_READ8_MEMBER(control_r);
95   DECLARE_WRITE8_MEMBER(control_w);
96   DECLARE_READ8_MEMBER(keyboard_r);
97   DECLARE_WRITE8_MEMBER(keyboard_w);
98   DECLARE_WRITE8_MEMBER(bankswitch_w);
99   DECLARE_WRITE8_MEMBER(ext_address_w);
100
30101   virtual void machine_reset();
31102   virtual void machine_start();
32103   DECLARE_PALETTE_INIT(ti74);
104   DECLARE_DEVICE_IMAGE_LOAD_MEMBER(ti74_cartridge);
105   TIMER_CALLBACK_MEMBER(poweron_timer_cb);
33106};
34107
35108
109
36110/***************************************************************************
37111
112  File Handling
113
114***************************************************************************/
115
116DEVICE_IMAGE_LOAD_MEMBER(ti74_state, ti74_cartridge)
117{
118   UINT8* pos = memregion("user1")->base();
119   offs_t size;
120
121   if (image.software_entry() == NULL)
122      size = image.length();
123   else
124      size = image.get_software_region_length("rom");
125
126   // max size is 32KB
127   if (size > 0x8000)
128   {
129      image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
130      return IMAGE_INIT_FAIL;
131   }
132
133   if (image.software_entry() == NULL)
134   {
135      if (image.fread(pos, size) != size)
136      {
137         image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read file");
138         return IMAGE_INIT_FAIL;
139      }
140   }
141   else
142      memcpy(pos, image.get_software_region("rom"), size);
143
144   return IMAGE_INIT_PASS;
145}
146
147
148
149/***************************************************************************
150
38151  Video
39152
40153***************************************************************************/
r31397r31398
45158   palette.set_pen_color(1, rgb_t(92, 83, 88));
46159}
47160
161void ti74_state::update_lcd_indicator(UINT8 y, UINT8 x, int state)
162{
163   // reference _________________...
164   // output#  |10     11     12     13     14      2      3      4
165   // above    | <    SHIFT   CTL    FN     I/O    UCL    _LOW    >
166   // ---- raw lcd screen here ----
167   // under    |      BASIC   CALC   DEG    RAD    GRAD   STAT
168   // output#  |       63     64      1     62     53     54
169   output_set_lamp_value(y * 10 + x, state);
170}
48171
172static HD44780_PIXEL_UPDATE(ti74_pixel_update)
173{
174   if (line == 1 && pos == 15)
175   {
176      // the last char is used to control lcd indicators
177      ti74_state *driver_state = device.machine().driver_data<ti74_state>();
178      driver_state->update_lcd_indicator(y, x, state);
179   }
180   else if (line < 2 && pos < 16)
181   {
182      // internal: 2*16, external: 1*31 + indicators
183      bitmap.pix16(1 + y, 1 + line*16*6 + pos*6 + x) = state;
184   }
185}
49186
187
188
50189/***************************************************************************
51190
52191  I/O, Memory Maps
53192
54193***************************************************************************/
55194
195READ8_MEMBER(ti74_state::control_r)
196{
197   return m_control;
198}
199
200WRITE8_MEMBER(ti74_state::control_w)
201{
202   // ? clock divider related
203   m_control = data;
204}
205
206READ8_MEMBER(ti74_state::keyboard_r)
207{
208   UINT8 ret = 0;
209
210   // read selected keyboard rows
211   for (int i = 0; i < 8; i++)
212   {
213      if (m_key_select >> i & 1)
214         ret |= m_key_matrix[i]->read();
215   }
216   
217   return ret;
218}
219
220WRITE8_MEMBER(ti74_state::keyboard_w)
221{
222   // d(0-7): select keyboard column
223   m_key_select = data;
224}
225
226WRITE8_MEMBER(ti74_state::bankswitch_w)
227{
228   // d0-d1: system rom bankswitch
229   membank("sysbank")->set_entry(data & 3);
230   
231   // d2: power-on latch
232   if (~data & 4 && m_power)
233   {
234      m_power = 0;
235      m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); // stop running
236   }
237   
238   // other bits: N/C
239}
240
241WRITE8_MEMBER(ti74_state::ext_address_w)
242{
243   // set external memory addressbus (DOCK-BUS related)
244   if (offset)
245      m_ext_address = (m_ext_address & 0xff00) | data;
246   else
247      m_ext_address = (m_ext_address & 0x00ff) | data << 8;
248}
249
56250static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, ti74_state )
57251   ADDRESS_MAP_UNMAP_HIGH
252
253   AM_RANGE(0x010c, 0x010c) AM_WRITE(keyboard_w) AM_READNOP
254   AM_RANGE(0x010d, 0x010d) AM_NOP // ? DOCK-BUS related
255   AM_RANGE(0x010e, 0x010e) AM_NOP // ? DOCK-BUS related
256   AM_RANGE(0x010f, 0x010f) AM_NOP // ? DOCK-BUS related
257   AM_RANGE(0x0118, 0x0118) AM_READWRITE(control_r, control_w)
258
259   AM_RANGE(0x1000, 0x1001) AM_DEVREADWRITE("hd44780", hd44780_device, read, write)
260
261   AM_RANGE(0x2000, 0x3fff) AM_RAM AM_SHARE("6264.ic3")
262   AM_RANGE(0x4000, 0xbfff) AM_ROM AM_REGION("user1", 0)
263   AM_RANGE(0xc000, 0xdfff) AM_ROMBANK("sysbank")
58264ADDRESS_MAP_END
59265
266static ADDRESS_MAP_START( main_io_map, AS_IO, 8, ti74_state )
267   AM_RANGE(TMS7000_PORTA, TMS7000_PORTA) AM_READ(keyboard_r)
268   AM_RANGE(TMS7000_PORTB, TMS7000_PORTB) AM_WRITE(bankswitch_w)
269   AM_RANGE(TMS7000_PORTC, TMS7000_PORTD) AM_WRITE(ext_address_w)
270ADDRESS_MAP_END
60271
61272
273
62274/***************************************************************************
63275
64276  Inputs
r31397r31398
66278***************************************************************************/
67279
68280static INPUT_PORTS_START( ti74 )
281   // 8x8 keyboard matrix, RESET and ON buttons are not on it
282   // Unused entries are not connected, but some might have a purpose for factory testing
69283   PORT_START("IN0")
70   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
284   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
285   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
286   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
287   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME("LEFT")
288   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
289   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
290   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
291   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
292
293   PORT_START("IN1")
294   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('%')
295   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
296   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
297   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME("RIGHT")
298   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
299   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
300   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
301   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
302
303   PORT_START("IN2")
304   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CHAR('\'') PORT_NAME("SPACE  '")
305   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
306   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
307   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR('(') PORT_NAME("UP  (")
308   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
309   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
310   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
311   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
312
313   PORT_START("IN3")
314   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_CHAR('=') PORT_NAME("ENTER  =")
71315   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
72   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
73   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
316   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_NAME("CLR  UCL")
317   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(')') PORT_NAME("DOWN  )")
318   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_NAME("RUN")
319   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
320   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
321   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
322
323   PORT_START("IN4")
324   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('~') PORT_CHAR('?') PORT_NAME("+/-  ?")
325   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
326   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
327   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_NAME("7  DEL")
328   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_NAME("BREAK")
329   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
330   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
331   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
332
333   PORT_START("IN5")
334   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('<')
335   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
336   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('&')
337   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_NAME("8  INS")
338   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("MODE")
339   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
340   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
341   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
342
343   PORT_START("IN6")
344   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_CHAR('>')
345   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
346   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
347   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_NAME("9  PB")
348   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_NAME("OFF")
349   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
350   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
351   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
352
353   PORT_START("IN7")
354   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) PORT_NAME("+")
355   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-')
356   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) PORT_NAME("*")
357   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) PORT_NAME("/")
74358   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
75   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
76   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
77   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
359   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) PORT_NAME("FN")
360   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("CTL")
361   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("SHIFT")
78362INPUT_PORTS_END
79363
80364
r31397r31398
85369
86370***************************************************************************/
87371
372TIMER_CALLBACK_MEMBER(ti74_state::poweron_timer_cb)
373{
374   m_power = 1;
375   
376   // battery ok/low status is on int1 line!
377   m_maincpu->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE);
378}
379
88380void ti74_state::machine_reset()
89381{
382   address_space &space = m_maincpu->space(AS_PROGRAM);
383   bankswitch_w(space, 0, 0);
384   
385   // give the system some time to boot before switching poweron latch
386   m_power = 0;
387   m_maincpu->set_input_line(TMS7000_INT1_LINE, CLEAR_LINE);
388   m_poweron_timer->adjust(attotime::from_msec(10));
90389}
91390
92391void ti74_state::machine_start()
93392{
393   static const char *const tags[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7" };
394   for (int i = 0; i < 8; i++)
395      m_key_matrix[i] = ioport(tags[i]);
396
397   membank("sysbank")->configure_entries(0, 4, memregion("system")->base(), 0x2000);
398
399   m_poweron_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ti74_state::poweron_timer_cb), this));
400   m_poweron_timer->adjust(attotime::never);
401
402   // zerofill
403   m_control = 0;
404   m_key_select = 0;
405   m_ext_address = 0;
406   m_power = 0;
407
408   // register for savestates
409   save_item(NAME(m_control));
410   save_item(NAME(m_key_select));
411   save_item(NAME(m_ext_address));
412   save_item(NAME(m_power));
94413}
95414
96415static MACHINE_CONFIG_START( ti74, ti74_state )
r31397r31398
98417   /* basic machine hardware */
99418   MCFG_CPU_ADD("maincpu", TMS70C46, XTAL_4MHz)
100419   MCFG_CPU_PROGRAM_MAP(main_map)
420   MCFG_CPU_IO_MAP(main_io_map)
101421
422   MCFG_NVRAM_ADD_0FILL("6264.ic3")
423
102424   /* video hardware */
103425   MCFG_SCREEN_ADD("screen", LCD)
104426   MCFG_SCREEN_REFRESH_RATE(60) // arbitrary
105427   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
106   MCFG_SCREEN_SIZE(6*16, 9*2)
107   MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 9*2-1)
428   MCFG_SCREEN_SIZE(6*31+1, 9*1+1)
429   MCFG_SCREEN_VISIBLE_AREA(0, 6*31, 0, 9*1)
108430   MCFG_DEFAULT_LAYOUT(layout_ti74)
109431   MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
110432   MCFG_SCREEN_PALETTE("palette")
r31397r31398
112434   MCFG_PALETTE_ADD("palette", 2)
113435   MCFG_PALETTE_INIT_OWNER(ti74_state, ti74)
114436
115   MCFG_HD44780_ADD("hd44780")
116   MCFG_HD44780_LCD_SIZE(2, 16)
437   MCFG_HD44780_ADD("hd44780") // 270kHz
438   MCFG_HD44780_LCD_SIZE(2, 16) // internal: 2*16, external: 1*31 + indicators
439   MCFG_HD44780_PIXEL_UPDATE_CB(ti74_pixel_update)
440
441   /* cartridge */
442   MCFG_CARTSLOT_ADD("cart")
443   MCFG_CARTSLOT_EXTENSION_LIST("bin,rom")
444   MCFG_CARTSLOT_NOT_MANDATORY
445   MCFG_CARTSLOT_LOAD(ti74_state, ti74_cartridge)
446   MCFG_CARTSLOT_INTERFACE("ti74_cart")
447   MCFG_SOFTWARE_LIST_ADD("cart_list", "ti74_cart")
117448MACHINE_CONFIG_END
118449
119450
r31397r31398
126457
127458ROM_START( ti74 )
128459   ROM_REGION( 0x10000, "maincpu", 0 )
129   ROM_LOAD( "tms70c46.bin", 0xf000, 0x1000, CRC(55a2f7c0) SHA1(530e3de42f2e304c8f4805ad389f38a459ec4e33) ) // internal cpu rom
460   ROM_LOAD( "tms70c46.ic2", 0xf000, 0x1000, CRC(55a2f7c0) SHA1(530e3de42f2e304c8f4805ad389f38a459ec4e33) ) // internal cpu rom
130461
131462   ROM_REGION( 0x8000, "system", 0 )
132   ROM_LOAD( "ti74.bin",     0x0000, 0x8000, CRC(019aaa2f) SHA1(04a1e694a49d50602e45a7834846de4d9f7d587d) ) // system rom, banked
463   ROM_LOAD( "001060281-1.ic1", 0x0000, 0x8000, CRC(019aaa2f) SHA1(04a1e694a49d50602e45a7834846de4d9f7d587d) ) // system rom, banked
464
465   ROM_REGION( 0x8000, "user1", ROMREGION_ERASEFF ) // cartridge area
133466ROM_END
134467
135468
136COMP( 1985, ti74, 0, 0, ti74, ti74, driver_device, 0, "Texas Instruments", "TI-74 BASICALC", GAME_IS_SKELETON )
469COMP( 1985, ti74, 0, 0, ti74, ti74, driver_device, 0, "Texas Instruments", "TI-74 BASICALC", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
trunk/src/mess/drivers/cc40.c
r31397r31398
33/***************************************************************************
44
55  Texas Instruments Compact Computer 40 (aka CC-40)
6  hardware family: CC-40 -> CC-40+(unreleased) -> TI-74 BASICALC -> TI-95 PROCALC
67
78  ---------------------------------------------
89  | ---------------------------------------   |
910  | |                                     |   |
10  | | LCD 1 line, 31 chars + indicators   |   |
11  | | LCD 1 line, 31 chars + 18 indicators|   |
1112  | |                                     |   ---------------
1213  | ---------------------------------------                 |
1314  |                                                         |
r31397r31398
3839
3940  HM6116LP-4    - Hitachi 2KB SRAM (newer 18KB version has two HM6264 8KB chips)
4041  HN61256PC09   - Hitachi DIP-28 32KB CMOS Mask PROM
41  TMX70C20N2L   - Texas Instruments TMS70C20 CPU (128 bytes RAM, 2KB ROM) @ 2.5MHz - "X" implies prototype
42  TMX70C20N2L   - Texas Instruments TMS70C20 CPU (128 bytes RAM, 2KB ROM) @ 2.5MHz, 40 pins - "X" implies prototype
4243  AMI 1041036-1 - 68-pin QFP AMI Gate Array
4344  HD44100H      - 60-pin QFP Hitachi HD44100 LCD Driver
4445  HD44780A00    - 80-pin TFP Hitachi HD44780 LCD Controller
r31397r31398
5859  TODO:
5960  - some strange bugs with Games I cartridge, bad dump or emulation bug?
6061  - other RAM configurations (6KB(default), 18KB, external)
62  - understand bus_control_r/w
6163  - Hexbus interface and peripherals
6264    * HX-1000: color plotter
6365    * HX-1010: thermal printer
6466    * HX-3000: RS-232 interface
6567    * HX-3100: modem
6668    * HX-3200: Centronics printer interface
67  - HD44100 is not accessed by the CPU, is it connected to the HD44780?
68    Probably responsible for the LCD indicators, how?
6969
7070***************************************************************************/
7171
r31397r31398
101101   void update_lcd_indicator(UINT8 y, UINT8 x, int state);
102102
103103   DECLARE_READ8_MEMBER(bus_control_r);
104   DECLARE_WRITE8_MEMBER(bus_control_w);
104105   DECLARE_WRITE8_MEMBER(power_w);
105106   DECLARE_WRITE8_MEMBER(sound_w);
106107   DECLARE_READ8_MEMBER(battery_r);
r31397r31398
118119};
119120
120121
122
121123/***************************************************************************
122124
123125  File Handling
r31397r31398
135137      size = image.get_software_region_length("rom");
136138
137139   // max size is 4*32KB
138   if (size >= 0x20000)
140   if (size > 0x20000)
139141   {
140142      image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
141143      return IMAGE_INIT_FAIL;
r31397r31398
211213   return 0x4c;
212214}
213215
216WRITE8_MEMBER(cc40_state::bus_control_w)
217{
218   ;
219}
220
214221WRITE8_MEMBER(cc40_state::power_w)
215222{
216223   // d0: power-on hold latch
r31397r31398
299306static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, cc40_state )
300307   ADDRESS_MAP_UNMAP_HIGH
301308
302   AM_RANGE(0x0110, 0x0110) AM_READ(bus_control_r)
309   AM_RANGE(0x0110, 0x0110) AM_READWRITE(bus_control_r, bus_control_w)
303310   AM_RANGE(0x0111, 0x0111) AM_WRITE(power_w)
304311   AM_RANGE(0x0112, 0x0112) AM_NOP // hexbus data
305312   AM_RANGE(0x0113, 0x0113) AM_NOP // hexbus available

Previous 199869 Revisions Next


© 1997-2024 The MAME Team