1
/***************************************************************************
5
04/08/2009 Initial driver by Miodrag Milanovic
7
****************************************************************************/
10
#include "cpu/i4004/i4004.h"
11
#include "includes/busicom.h"
14
static UINT8 get_bit_selected(UINT32 val,int num)
18
if (BIT(val,i)==0) return i;
22
static READ8_HANDLER(keyboard_r)
24
busicom_state *state = space->machine().driver_data<busicom_state>();
25
static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8" , "LINE9"};
26
return input_port_read(space->machine(),keynames[get_bit_selected(state->m_keyboard_shifter & 0x3ff,10)]);
29
static READ8_HANDLER(printer_r)
31
busicom_state *state = space->machine().driver_data<busicom_state>();
33
if (state->m_drum_index==0) retVal |= 1;
34
retVal |= input_port_read(space->machine(),"PAPERADV") & 1 ? 8 : 0;
39
static WRITE8_HANDLER(shifter_w)
41
busicom_state *state = space->machine().driver_data<busicom_state>();
43
state->m_keyboard_shifter <<= 1;
44
state->m_keyboard_shifter |= BIT(data,1);
47
state->m_printer_shifter <<= 1;
48
state->m_printer_shifter |= BIT(data,1);
52
static WRITE8_HANDLER(printer_w)
54
busicom_state *state = space->machine().driver_data<busicom_state>();
57
logerror("color : %02x %02x %d\n",BIT(data,0),data,state->m_drum_index);
58
state->m_printer_line_color[10] = 1;
63
if(BIT(state->m_printer_shifter,i)) {
64
state->m_printer_line[10][i-3] = state->m_drum_index + 1;
67
if(BIT(state->m_printer_shifter,0)) {
68
state->m_printer_line[10][15] = state->m_drum_index + 13 + 1;
70
if(BIT(state->m_printer_shifter,1)) {
71
state->m_printer_line[10][16] = state->m_drum_index + 26 + 1;
78
state->m_printer_line[j][i] = state->m_printer_line[j+1][i];
79
state->m_printer_line_color[j] = state->m_printer_line_color[j+1];
83
state->m_printer_line[10][i] = 0;
85
state->m_printer_line_color[10] = 0;
89
static WRITE8_HANDLER(status_w)
92
UINT8 mem_lamp = BIT(data,0);
93
UINT8 over_lamp = BIT(data,1);
94
UINT8 minus_lamp = BIT(data,2);
96
//logerror("status %c %c %c\n",mem_lamp ? 'M':'x',over_lamp ? 'O':'x',minus_lamp ? '-':'x');
99
static WRITE8_HANDLER(printer_ctrl_w)
103
static ADDRESS_MAP_START(busicom_rom, AS_PROGRAM, 8)
104
ADDRESS_MAP_UNMAP_HIGH
105
AM_RANGE(0x0000, 0x04FF) AM_ROM
108
static ADDRESS_MAP_START(busicom_mem, AS_DATA, 8)
109
ADDRESS_MAP_UNMAP_HIGH
110
AM_RANGE(0x0000, 0x07F) AM_RAM
113
static ADDRESS_MAP_START( busicom_io , AS_IO, 8)
114
ADDRESS_MAP_UNMAP_HIGH
115
AM_RANGE(0x00, 0x00) AM_WRITE(shifter_w) // ROM0 I/O
116
AM_RANGE(0x01, 0x01) AM_READWRITE(keyboard_r,printer_ctrl_w) // ROM1 I/O
117
AM_RANGE(0x02, 0x02) AM_READ(printer_r) // ROM2 I/O
118
AM_RANGE(0x10, 0x10) AM_WRITE(printer_w) // RAM0 output
119
AM_RANGE(0x11, 0x11) AM_WRITE(status_w) // RAM1 output
123
static INPUT_PORTS_START( busicom )
125
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CM") PORT_CODE(KEYCODE_1)
126
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RM") PORT_CODE(KEYCODE_2)
127
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M-") PORT_CODE(KEYCODE_3)
128
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M+") PORT_CODE(KEYCODE_4)
130
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SQRT") PORT_CODE(KEYCODE_S)
131
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("%") PORT_CODE(KEYCODE_5)
132
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M=-") PORT_CODE(KEYCODE_6)
133
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M=+") PORT_CODE(KEYCODE_7)
135
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("diamond") PORT_CODE(KEYCODE_D)
136
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH_PAD)
137
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_ASTERISK)
138
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("=") PORT_CODE(KEYCODE_ENTER_PAD)
140
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS_PAD)
141
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("+") PORT_CODE(KEYCODE_PLUS_PAD)
142
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("diamond 2") PORT_CODE(KEYCODE_TILDE)
143
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("000") PORT_CODE(KEYCODE_8)
145
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9_PAD)
146
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6_PAD)
147
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3_PAD)
148
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_DEL_PAD)
150
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8_PAD)
151
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5_PAD)
152
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2_PAD)
153
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("00") PORT_CODE(KEYCODE_9)
155
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7_PAD)
156
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4_PAD)
157
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1_PAD)
158
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0_PAD)
160
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Sign") PORT_CODE(KEYCODE_RALT) PORT_CODE(KEYCODE_LALT)
161
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("EX") PORT_CODE(KEYCODE_X)
162
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CE") PORT_CODE(KEYCODE_E)
163
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C)
165
PORT_CONFNAME( 0x0f, 0x00, "Digital point")
166
PORT_CONFSETTING( 0x00, "0" )
167
PORT_CONFSETTING( 0x01, "1" )
168
PORT_CONFSETTING( 0x02, "2" )
169
PORT_CONFSETTING( 0x03, "3" )
170
PORT_CONFSETTING( 0x04, "4" )
171
PORT_CONFSETTING( 0x05, "5" )
172
PORT_CONFSETTING( 0x06, "6" )
173
PORT_CONFSETTING( 0x08, "8" )
175
PORT_CONFNAME( 0x0f, 0x00, "Rounding")
176
PORT_CONFSETTING( 0x01, "/N" )
177
PORT_CONFSETTING( 0x00, "FL" )
178
PORT_CONFSETTING( 0x08, "5/4" )
179
PORT_START("PAPERADV")
180
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Paper adv.") PORT_CODE(KEYCODE_SPACE)
185
static TIMER_DEVICE_CALLBACK(timer_callback)
187
busicom_state *state = timer.machine().driver_data<busicom_state>();
189
if (state->m_timer==1) state->m_drum_index++;
190
if (state->m_drum_index==13) state->m_drum_index=0;
191
i4004_set_test(timer.machine().device("maincpu"),state->m_timer);
195
static MACHINE_START(busicom)
199
static MACHINE_RESET(busicom)
201
busicom_state *state = machine.driver_data<busicom_state>();
203
state->m_drum_index =0;
204
state->m_keyboard_shifter = 0;
205
state->m_printer_shifter = 0;
209
state->m_printer_line[j][i] = 0;
210
state->m_printer_line_color[j] = 0;
216
static const char layout_busicom [] = "busicom";
218
static MACHINE_CONFIG_START( busicom, busicom_state )
219
/* basic machine hardware */
220
MCFG_CPU_ADD("maincpu",I4004, 750000)
221
MCFG_CPU_PROGRAM_MAP(busicom_rom)
222
MCFG_CPU_DATA_MAP(busicom_mem)
223
MCFG_CPU_IO_MAP(busicom_io)
225
MCFG_MACHINE_RESET(busicom)
226
MCFG_MACHINE_START(busicom)
229
MCFG_SCREEN_ADD("screen", RASTER)
230
MCFG_SCREEN_REFRESH_RATE(50)
231
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
232
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
233
MCFG_SCREEN_SIZE(40*17, 44*11)
234
MCFG_SCREEN_VISIBLE_AREA(0, 40*17-1, 0, 44*11-1)
235
MCFG_SCREEN_UPDATE(busicom)
237
MCFG_PALETTE_LENGTH(16)
238
MCFG_PALETTE_INIT(busicom)
240
MCFG_VIDEO_START(busicom)
242
MCFG_TIMER_ADD_PERIODIC("busicom_timer", timer_callback, attotime::from_msec(28*2))
247
ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASEFF )
248
ROM_LOAD( "busicom.l01", 0x0000, 0x0100, CRC(51ae2513) SHA1(5cb4097a3945db35af4ed64b629b20b08fc9824f))
249
ROM_LOAD( "busicom.l02", 0x0100, 0x0100, CRC(a05411ad) SHA1(81503a99a0d34fa29bf1245de0a44af2f174abdd))
250
ROM_LOAD( "busicom.l05", 0x0200, 0x0100, CRC(6120addf) SHA1(4b7ec183613630120b3c313c782122713d4327c5))
251
ROM_LOAD( "busicom.l07", 0x0300, 0x0100, CRC(84a90daa) SHA1(e2931753b0fd35144cb5a9d73fcae8e104e5e3ed))
252
ROM_LOAD( "busicom.l11", 0x0400, 0x0100, CRC(4d2b2942) SHA1(9a59db76eff084369797735ec19da8cbc70d0d39))
257
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
258
COMP( 1974, busicom, 0, 0, busicom, busicom, 0, "Business Computer Corporation", "Busicom 141-PF", GAME_NOT_WORKING | GAME_NO_SOUND)