~ubuntu-branches/ubuntu/raring/mame/raring-proposed

« back to all changes in this revision

Viewing changes to mess/src/mess/drivers/busicom.c

  • Committer: Package Import Robot
  • Author(s): Jordi Mallach, Jordi Mallach, Emmanuel Kasper
  • Date: 2011-12-19 22:56:27 UTC
  • mfrom: (0.1.2)
  • Revision ID: package-import@ubuntu.com-20111219225627-ub5oga1oys4ogqzm
Tags: 0.144-1
[ Jordi Mallach ]
* Fix syntax errors in DEP5 copyright file (lintian).
* Use a versioned copyright Format specification field.
* Update Vcs-* URLs.
* Move transitional packages to the new metapackages section, and make
  them priority extra.
* Remove references to GNU/Linux and MESS sources from copyright.
* Add build variables for s390x.
* Use .xz tarballs as it cuts 4MB for the upstream sources.
* Add nplayers.ini as a patch. Update copyright file to add CC-BY-SA-3.0.

[ Emmanuel Kasper ]
* New upstream release. Closes: #651538.
* Add Free Desktop compliant png icons of various sizes taken from
  the hydroxygen iconset
* Mess is now built from a new source package, to avoid possible source
  incompatibilities between mame and the mess overlay.
* Mame-tools are not built from the mame source package anymore, but
  from the mess source package

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************************
2
 
 
3
 
        Busicom 141-PF
4
 
 
5
 
        04/08/2009 Initial driver by Miodrag Milanovic
6
 
 
7
 
****************************************************************************/
8
 
 
9
 
#include "emu.h"
10
 
#include "cpu/i4004/i4004.h"
11
 
#include "includes/busicom.h"
12
 
 
13
 
 
14
 
static UINT8 get_bit_selected(UINT32 val,int num)
15
 
{
16
 
        int i;
17
 
        for(i=0;i<num;i++) {
18
 
                if (BIT(val,i)==0) return i;
19
 
        }
20
 
        return 0;
21
 
}
22
 
static READ8_HANDLER(keyboard_r)
23
 
{
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)]);
27
 
}
28
 
 
29
 
static READ8_HANDLER(printer_r)
30
 
{
31
 
        busicom_state *state = space->machine().driver_data<busicom_state>();
32
 
        UINT8 retVal = 0;
33
 
        if (state->m_drum_index==0) retVal |= 1;
34
 
        retVal |= input_port_read(space->machine(),"PAPERADV") & 1 ? 8 : 0;
35
 
        return retVal;
36
 
}
37
 
 
38
 
 
39
 
static WRITE8_HANDLER(shifter_w)
40
 
{
41
 
        busicom_state *state = space->machine().driver_data<busicom_state>();
42
 
        if (BIT(data,0)) {
43
 
                state->m_keyboard_shifter <<= 1;
44
 
                state->m_keyboard_shifter |= BIT(data,1);
45
 
        }
46
 
        if (BIT(data,2)) {
47
 
                state->m_printer_shifter <<= 1;
48
 
                state->m_printer_shifter |= BIT(data,1);
49
 
        }
50
 
}
51
 
 
52
 
static WRITE8_HANDLER(printer_w)
53
 
{
54
 
        busicom_state *state = space->machine().driver_data<busicom_state>();
55
 
        int i,j;
56
 
        if (BIT(data,0)) {
57
 
                logerror("color : %02x %02x %d\n",BIT(data,0),data,state->m_drum_index);
58
 
                state->m_printer_line_color[10] = 1;
59
 
 
60
 
        }
61
 
        if (BIT(data,1)) {
62
 
                for(i=3;i<18;i++) {
63
 
                        if(BIT(state->m_printer_shifter,i)) {
64
 
                                state->m_printer_line[10][i-3] = state->m_drum_index + 1;
65
 
                        }
66
 
                }
67
 
                if(BIT(state->m_printer_shifter,0)) {
68
 
                        state->m_printer_line[10][15] = state->m_drum_index + 13 + 1;
69
 
                }
70
 
                if(BIT(state->m_printer_shifter,1)) {
71
 
                        state->m_printer_line[10][16] = state->m_drum_index + 26 + 1;
72
 
                }
73
 
        }
74
 
        if (BIT(data,3)) {
75
 
 
76
 
                for(j=0;j<10;j++) {
77
 
                        for(i=0;i<17;i++) {
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];
80
 
                        }
81
 
                }
82
 
                for(i=0;i<17;i++) {
83
 
                        state->m_printer_line[10][i] = 0;
84
 
                }
85
 
                state->m_printer_line_color[10] = 0;
86
 
 
87
 
        }
88
 
}
89
 
static WRITE8_HANDLER(status_w)
90
 
{
91
 
#if 0
92
 
        UINT8 mem_lamp = BIT(data,0);
93
 
        UINT8 over_lamp = BIT(data,1);
94
 
        UINT8 minus_lamp = BIT(data,2);
95
 
#endif
96
 
        //logerror("status %c %c %c\n",mem_lamp ? 'M':'x',over_lamp ? 'O':'x',minus_lamp ? '-':'x');
97
 
}
98
 
 
99
 
static WRITE8_HANDLER(printer_ctrl_w)
100
 
{
101
 
}
102
 
 
103
 
static ADDRESS_MAP_START(busicom_rom, AS_PROGRAM, 8)
104
 
        ADDRESS_MAP_UNMAP_HIGH
105
 
        AM_RANGE(0x0000, 0x04FF) AM_ROM
106
 
ADDRESS_MAP_END
107
 
 
108
 
static ADDRESS_MAP_START(busicom_mem, AS_DATA, 8)
109
 
        ADDRESS_MAP_UNMAP_HIGH
110
 
        AM_RANGE(0x0000, 0x07F) AM_RAM
111
 
ADDRESS_MAP_END
112
 
 
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
120
 
ADDRESS_MAP_END
121
 
 
122
 
/* Input ports */
123
 
static INPUT_PORTS_START( busicom )
124
 
        PORT_START("LINE0")
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)
129
 
        PORT_START("LINE1")
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)
134
 
        PORT_START("LINE2")
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)
139
 
        PORT_START("LINE3")
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)
144
 
        PORT_START("LINE4")
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)
149
 
        PORT_START("LINE5")
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)
154
 
        PORT_START("LINE6")
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)
159
 
        PORT_START("LINE7")
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)
164
 
        PORT_START("LINE8")
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" )
174
 
        PORT_START("LINE9")
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)
181
 
 
182
 
INPUT_PORTS_END
183
 
 
184
 
 
185
 
static TIMER_DEVICE_CALLBACK(timer_callback)
186
 
{
187
 
        busicom_state *state = timer.machine().driver_data<busicom_state>();
188
 
        state->m_timer ^=1;
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);
192
 
 
193
 
}
194
 
 
195
 
static MACHINE_START(busicom)
196
 
{
197
 
}
198
 
 
199
 
static MACHINE_RESET(busicom)
200
 
{
201
 
        busicom_state *state = machine.driver_data<busicom_state>();
202
 
        int i,j;
203
 
        state->m_drum_index =0;
204
 
        state->m_keyboard_shifter = 0;
205
 
        state->m_printer_shifter = 0;
206
 
 
207
 
        for(i=0;i<17;i++) {
208
 
                for(j=0;j<11;j++) {
209
 
                        state->m_printer_line[j][i] = 0;
210
 
                        state->m_printer_line_color[j] = 0;
211
 
                }
212
 
        }
213
 
 
214
 
}
215
 
 
216
 
static const char layout_busicom [] = "busicom";
217
 
 
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)
224
 
 
225
 
    MCFG_MACHINE_RESET(busicom)
226
 
        MCFG_MACHINE_START(busicom)
227
 
 
228
 
    /* video hardware */
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)
236
 
 
237
 
    MCFG_PALETTE_LENGTH(16)
238
 
    MCFG_PALETTE_INIT(busicom)
239
 
 
240
 
        MCFG_VIDEO_START(busicom)
241
 
 
242
 
        MCFG_TIMER_ADD_PERIODIC("busicom_timer", timer_callback, attotime::from_msec(28*2))
243
 
MACHINE_CONFIG_END
244
 
 
245
 
/* ROM definition */
246
 
ROM_START( busicom )
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))
253
 
ROM_END
254
 
 
255
 
/* Driver */
256
 
 
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)
259