src/mess/drivers/mephisto.c
| r886 | r887 | |
| 54 | 54 | |
| 55 | 55 | */ |
| 56 | 56 | |
| 57 | | |
| 58 | | |
| 59 | | |
| 60 | 57 | #include "driver.h" |
| 61 | | |
| 62 | | |
| 63 | 58 | #include "cpu/m6502/m6502.h" |
| 64 | 59 | #include "sound/dac.h" |
| 65 | 60 | #include "mephisto.lh" |
| 66 | 61 | |
| 67 | | static UINT8 irq; |
| 68 | | static UINT8 lcd_shift_reg[3]; |
| 69 | 62 | static UINT8 lcd_shift_counter; |
| 70 | | static UINT8 lcd_eor_val; |
| 71 | 63 | static UINT8 led_status; |
| 72 | | static UINT8 led7; |
| 73 | | static UINT8 beep; |
| 74 | | // static UINT8 key_array[15]; |
| 64 | static UINT8 *mephisto_ram; |
| 75 | 65 | |
| 66 | |
| 76 | 67 | static WRITE8_HANDLER ( write_lcd ) |
| 77 | | { |
| 78 | | // lcd_shift_reg[lcd_shift_counter]=data; |
| 79 | | lcd_shift_reg[lcd_shift_counter]=data ^ lcd_eor_val; |
| 80 | | if (lcd_shift_counter==0) |
| 81 | | { |
| 82 | | lcd_shift_counter=4; |
| 83 | | lcd_eor_val=lcd_eor_val ^ 0xff; |
| 84 | | logerror("LCD Shift: data %d\n ",data); |
| 85 | | } |
| 86 | | --lcd_shift_counter; |
| 87 | | |
| 68 | { |
| 69 | output_set_digit_value(lcd_shift_counter,data ^ mephisto_ram[0x109]); // 0x109 MM IV // 0x040 MM V |
| 70 | lcd_shift_counter--; |
| 71 | lcd_shift_counter&=3; |
| 88 | 72 | } |
| 89 | 73 | |
| 90 | 74 | static READ8_HANDLER(read_keys) |
| 91 | 75 | { |
| 92 | 76 | UINT8 data; |
| 93 | 77 | data=0xff; |
| 94 | | if (!led7)data=readinputport(offset+1); else data=readinputport(offset+8+1); |
| 95 | | logerror("Keyboard Offset = %d Data = %d led7 = %d\n",offset,data,led7); |
| 96 | | return (data ^0x80) | 0x7f; |
| 78 | if (((led_status & 0x80)==0x00))data=readinputport(offset); else data=readinputport(offset+8); |
| 79 | logerror("Keyboard Offset = %d Data = %d\n ",offset,data); |
| 80 | return data| 0x7f; |
| 97 | 81 | } |
| 98 | 82 | |
| 99 | 83 | static READ8_HANDLER(read_board) |
| r886 | r887 | |
| 104 | 88 | static WRITE8_HANDLER ( write_led ) |
| 105 | 89 | { |
| 106 | 90 | |
| 107 | | |
| 108 | | // if (data==0){ led_status=led_status & (255-pow(2,offset)); else led_status=led_status|pow(2,offset);} |
| 109 | | |
| 110 | | if (offset==0){ if (data==0) led_status=led_status & 254; else led_status=led_status|1;} |
| 111 | | if (offset==1){ if (data==0) led_status=led_status & 253; else led_status=led_status|2;} |
| 112 | | if (offset==2){ if (data==0) led_status=led_status & 251; else led_status=led_status|4;} |
| 113 | | if (offset==3){ if (data==0) led_status=led_status & 247; else led_status=led_status|8;} |
| 114 | | if (offset==4){ if (data==0) led_status=led_status & 239; else led_status=led_status|16;} |
| 115 | | if (offset==5){ if (data==0) led_status=led_status & 223; else led_status=led_status|32;} |
| 116 | | if (offset==6){ beep=data;} |
| 117 | | if (offset==7){ led7=data;} |
| 91 | data &= 0x80; |
| 92 | if (data==0)led_status &= 255-(1<<offset) ; else led_status|=1<<offset; |
| 93 | if (offset<6)output_set_led_value(offset, led_status&1<<offset?1:0); |
| 118 | 94 | logerror("LEDs Offset = %d Data = %d\n",offset,data); |
| 119 | 95 | } |
| 120 | 96 | |
| 121 | 97 | |
| 122 | 98 | |
| 123 | 99 | static ADDRESS_MAP_START(mephisto_mem , ADDRESS_SPACE_PROGRAM, 8) |
| 124 | | AM_RANGE( 0x0000, 0x1fff) AM_RAM // |
| 100 | AM_RANGE( 0x0000, 0x1fff) AM_RAM AM_BASE(&mephisto_ram)// |
| 125 | 101 | AM_RANGE( 0x2000, 0x2000) AM_WRITE( write_lcd) |
| 126 | 102 | AM_RANGE( 0x2c00, 0x2c07) AM_READ( read_keys) |
| 127 | 103 | // AM_RANGE( 0x2c00, 0x2c07) AM_RAM |
| r886 | r887 | |
| 138 | 114 | |
| 139 | 115 | |
| 140 | 116 | INPUT_PORTS_START( mephisto ) |
| 141 | | PORT_START_TAG("keyboard_1") |
| 117 | // PORT_START_TAG("keyboard_1") |
| 142 | 118 | PORT_START //Port $2c00 |
| 143 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CLEAR") PORT_CODE(KEYCODE_1) |
| 119 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CLEAR") PORT_CODE(KEYCODE_1) |
| 144 | 120 | PORT_START //Port $2c01 |
| 145 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("POS") PORT_CODE(KEYCODE_2) |
| 121 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("POS") PORT_CODE(KEYCODE_2) |
| 146 | 122 | PORT_START //Port $2c02 |
| 147 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("MEM") PORT_CODE(KEYCODE_3) |
| 123 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MEM") PORT_CODE(KEYCODE_3) |
| 148 | 124 | PORT_START //Port $2c03 |
| 149 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("INFO") PORT_CODE(KEYCODE_4) |
| 125 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("INFO") PORT_CODE(KEYCODE_4) |
| 150 | 126 | PORT_START //Port $2c04 |
| 151 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LEV") PORT_CODE(KEYCODE_5) |
| 127 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LEV") PORT_CODE(KEYCODE_5) |
| 152 | 128 | PORT_START //Port $2c05 |
| 153 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER) |
| 129 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER) |
| 154 | 130 | PORT_START //Port $2c06 |
| 155 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) |
| 131 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) |
| 156 | 132 | PORT_START //Port $2c07 |
| 157 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) |
| 158 | | PORT_START_TAG("keyboard_2") |
| 133 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) |
| 134 | // PORT_START_TAG("keyboard_2") |
| 159 | 135 | PORT_START //Port $2c08 |
| 160 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) |
| 136 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) |
| 161 | 137 | PORT_START //Port $2c09 |
| 162 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) |
| 138 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) |
| 163 | 139 | PORT_START //Port $2c0a |
| 164 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) |
| 140 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) |
| 165 | 141 | PORT_START //Port $2c0b |
| 166 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) |
| 142 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) |
| 167 | 143 | PORT_START //Port $2c0c |
| 168 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) |
| 144 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) |
| 169 | 145 | PORT_START //Port $2c0d |
| 170 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) |
| 146 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) |
| 171 | 147 | PORT_START //Port $2c0e |
| 172 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) |
| 148 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) |
| 173 | 149 | PORT_START //Port $2c0f |
| 174 | | PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) |
| 150 | PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) |
| 175 | 151 | INPUT_PORTS_END |
| 176 | 152 | |
| 177 | 153 | |
| 178 | | |
| 179 | | |
| 180 | | static TIMER_CALLBACK( update_leds ) |
| 181 | | { |
| 182 | | int i; |
| 183 | | output_set_led_value(0, led_status&1?1:0); |
| 184 | | output_set_led_value(1, led_status&2?1:0); |
| 185 | | output_set_led_value(2, led_status&4?1:0); |
| 186 | | output_set_led_value(3, led_status&8?1:0); |
| 187 | | output_set_led_value(4, led_status&16?1:0); |
| 188 | | output_set_led_value(5, led_status&32?1:0); |
| 189 | | for (i=0; i<4; i++) output_set_digit_value(i, lcd_shift_reg[i]); |
| 190 | | //for (i=0;i<16;i++) key_array[i]=readinputport(i); |
| 191 | | |
| 192 | | } |
| 193 | | |
| 194 | | |
| 195 | | |
| 196 | | |
| 197 | 154 | static TIMER_CALLBACK( update_nmi ) |
| 198 | 155 | { |
| 199 | | irq=irq ^1; |
| 200 | 156 | //cpunum_set_input_line(0, INPUT_LINE_NMI,irq ? ASSERT_LINE: CLEAR_LINE ); |
| 201 | 157 | cpunum_set_input_line(0, INPUT_LINE_NMI,PULSE_LINE); |
| 202 | | DAC_data_w(0,beep&1?128:0); |
| 158 | DAC_data_w(0,led_status&64?128:0); |
| 203 | 159 | } |
| 204 | 160 | |
| 205 | 161 | static MACHINE_START( mephisto ) |
| 206 | 162 | { |
| 207 | 163 | lcd_shift_counter=3; |
| 208 | | lcd_eor_val=0; |
| 209 | | irq=0; |
| 210 | | mame_timer_pulse(MAME_TIME_IN_HZ(60), 0, update_leds); |
| 164 | // mame_timer_pulse(MAME_TIME_IN_HZ(60), 0, update_leds); |
| 211 | 165 | mame_timer_pulse(MAME_TIME_IN_HZ(600), 0, update_nmi); |
| 212 | | cpunum_set_input_line(0, M65C02_IRQ_LINE,CLEAR_LINE); |
| 166 | // cpunum_set_input_line(0, M65C02_IRQ_LINE,CLEAR_LINE); |
| 213 | 167 | } |
| 214 | 168 | |
| 215 | 169 | |
| 216 | 170 | static MACHINE_RESET( mephisto ) |
| 217 | 171 | { |
| 218 | | lcd_eor_val=0; |
| 219 | 172 | lcd_shift_counter=3; |
| 220 | 173 | } |
| 221 | 174 | |
| r886 | r887 | |
| 227 | 180 | MDRV_SCREEN_REFRESH_RATE(60) |
| 228 | 181 | MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) |
| 229 | 182 | MDRV_INTERLEAVE(1) |
| 230 | | |
| 231 | 183 | MDRV_MACHINE_START( mephisto ) |
| 232 | 184 | MDRV_MACHINE_RESET( mephisto ) |
| 233 | | |
| 234 | 185 | /* video hardware */ |
| 235 | 186 | MDRV_DEFAULT_LAYOUT(layout_mephisto) |
| 236 | | |
| 237 | 187 | /* sound hardware */ |
| 238 | 188 | MDRV_SPEAKER_STANDARD_MONO("mono") |
| 239 | 189 | |