trunk/src/mess/machine/hp48.c
r32453 | r32454 | |
58 | 58 | |
59 | 59 | |
60 | 60 | |
61 | | #ifdef CHARDEV |
62 | | #include "devices/chardev.h" |
63 | | #endif |
64 | 61 | |
65 | 62 | |
66 | 63 | /*************************************************************************** |
r32453 | r32454 | |
135 | 132 | /* protocol action */ |
136 | 133 | //if ( xmodem && xmodem->exists() ) xmodem_receive_byte( &xmodem->device(), param ); |
137 | 134 | //else if ( kermit && kermit->exists() ) kermit_receive_byte( &kermit->device(), param ); |
138 | | //#ifdef CHARDEV |
139 | | // else chardev_out( m_chardev, param ); |
140 | | //#endif |
141 | 135 | } |
142 | 136 | |
143 | 137 | /* CPU initiates a send event */ |
r32453 | r32454 | |
156 | 150 | } |
157 | 151 | |
158 | 152 | |
159 | | #ifdef CHARDEV |
160 | 153 | |
161 | | TIMER_CALLBACK_MEMBER(hp48_state::hp48_chardev_byte_recv_cb) |
162 | | { |
163 | | UINT8 data = chardev_in( m_chardev ); |
164 | 154 | |
165 | | LOG_SERIAL(( "%f hp48_chardev_byte_recv_cb: end of receive, data=%02x\n", |
166 | | machine().time().as_double(), data )); |
167 | | |
168 | | m_io[0x14] = data & 0xf; /* receive zone */ |
169 | | m_io[0x15] = data >> 4; |
170 | | m_io[0x11] &= ~2; /* clear byte receiving */ |
171 | | m_io[0x11] |= 1; /* set byte received */ |
172 | | |
173 | | /* interrupt */ |
174 | | if ( m_io[0x10] & 2 ) |
175 | | { |
176 | | hp48_pulse_irq( SATURN_IRQ_LINE ); |
177 | | } |
178 | | } |
179 | | |
180 | | void hp48_state::hp48_chardev_start_recv_byte( chardev_err status ) |
181 | | { |
182 | | if ( status != CHARDEV_OK ) return; |
183 | | |
184 | | LOG_SERIAL(( "%f hp48_chardev_start_recv_byte: start receiving\n", |
185 | | machine().time().as_double() )); |
186 | | |
187 | | m_io[0x11] |= 2; /* set byte receiving */ |
188 | | |
189 | | /* interrupt */ |
190 | | if ( m_io[0x10] & 1 ) |
191 | | { |
192 | | hp48_pulse_irq( SATURN_IRQ_LINE ); |
193 | | } |
194 | | |
195 | | /* schedule end of reception */ |
196 | | machine().scheduler().timer_set( RS232_DELAY, timer_expired_delegate(FUNC(hp48_state::hp48_chardev_byte_recv_cb),this)); |
197 | | } |
198 | | |
199 | | void hp48_state::hp48_chardev_ready_to_send( ) |
200 | | { |
201 | | m_io[0x12] &= ~3; |
202 | | |
203 | | /* interrupt */ |
204 | | if ( m_io[0x10] & 4 ) |
205 | | { |
206 | | hp48_pulse_irq( SATURN_IRQ_LINE ); |
207 | | } |
208 | | } |
209 | | |
210 | | static const chardev_interface hp48_chardev_iface = |
211 | | { hp48_chardev_start_recv_byte, hp48_chardev_ready_to_send }; |
212 | | |
213 | | #endif |
214 | | |
215 | | |
216 | 155 | /* ------ Saturn's IN / OUT registers ---------- */ |
217 | 156 | |
218 | 157 | |
r32453 | r32454 | |
1199 | 1138 | machine().save().register_postload( save_prepost_delegate(FUNC(hp48_state::hp48_update_annunciators), this )); |
1200 | 1139 | machine().save().register_postload( save_prepost_delegate(FUNC(hp48_state::hp48_apply_modules), this )); |
1201 | 1140 | |
1202 | | #ifdef CHARDEV |
1203 | | /* direct I/O */ |
1204 | | m_chardev = chardev_open_pty( machine(), &hp48_chardev_iface ); |
1205 | | #endif |
1206 | 1141 | } |
1207 | 1142 | |
1208 | 1143 | |
trunk/src/mess/machine/thomson.c
r32453 | r32454 | |
1018 | 1018 | (using, e.g., character device special files on some UNIX). |
1019 | 1019 | */ |
1020 | 1020 | |
1021 | | #ifdef CHARDEV |
1022 | | |
1023 | | #include "devices/chardev.h" |
1024 | | |
1025 | 1021 | /* Features an EF 6850 ACIA |
1026 | 1022 | |
1027 | 1023 | MIDI protocol is a serial asynchronous protocol |
r32453 | r32454 | |
1038 | 1034 | */ |
1039 | 1035 | |
1040 | 1036 | |
1041 | | static UINT8 to7_midi_status; /* 6850 status word */ |
1042 | | static UINT8 to7_midi_overrun; /* pending overrun */ |
1043 | | static UINT8 to7_midi_intr; /* enabled interrupts */ |
1044 | | |
1045 | | static chardev* to7_midi_chardev; |
1046 | | |
1047 | | |
1048 | | |
1049 | | void thomson_state::to7_midi_update_irq ( ) |
1050 | | { |
1051 | | if ( (to7_midi_intr & 4) && (to7_midi_status & ACIA_6850_RDRF) ) |
1052 | | to7_midi_status |= ACIA_6850_irq; /* byte received interrupt */ |
1053 | | |
1054 | | if ( (to7_midi_intr & 4) && (to7_midi_status & ACIA_6850_OVRN) ) |
1055 | | to7_midi_status |= ACIA_6850_irq; /* overrun interrupt */ |
1056 | | |
1057 | | if ( (to7_midi_intr & 3) == 1 && (to7_midi_status & ACIA_6850_TDRE) ) |
1058 | | to7_midi_status |= ACIA_6850_irq; /* ready to transmit interrupt */ |
1059 | | |
1060 | | thom_irq_4( machine, to7_midi_status & ACIA_6850_irq ); |
1061 | | } |
1062 | | |
1063 | | |
1064 | | |
1065 | | void thomson_state::to7_midi_byte_received_cb( chardev_err s ) |
1066 | | { |
1067 | | to7_midi_status |= ACIA_6850_RDRF; |
1068 | | if ( s == CHARDEV_OVERFLOW ) |
1069 | | to7_midi_overrun = 1; |
1070 | | to7_midi_update_irq( machine ); |
1071 | | } |
1072 | | |
1073 | | |
1074 | | |
1075 | | void thomson_state::to7_midi_ready_to_send_cb( ) |
1076 | | { |
1077 | | to7_midi_status |= ACIA_6850_TDRE; |
1078 | | to7_midi_update_irq( machine ); |
1079 | | } |
1080 | | |
1081 | | |
1082 | | |
1083 | 1037 | READ8_MEMBER( thomson_state::to7_midi_r ) |
1084 | 1038 | { |
1085 | | /* ACIA 6850 registers */ |
1086 | | |
1087 | | switch ( offset ) |
1088 | | { |
1089 | | case 0: /* get status */ |
1090 | | /* bit 0: data received */ |
1091 | | /* bit 1: ready to transmit data */ |
1092 | | /* bit 2: data carrier detect (ignored) */ |
1093 | | /* bit 3: clear to send (ignored) */ |
1094 | | /* bit 4: framing error (ignored) */ |
1095 | | /* bit 5: overrun */ |
1096 | | /* bit 6: parity error (ignored) */ |
1097 | | /* bit 7: interrupt */ |
1098 | | LOG_MIDI(( "%s %f to7_midi_r: status $%02X (rdrf=%i, tdre=%i, ovrn=%i, irq=%i)\n", |
1099 | | space.machine().describe_context(), space.machine().time().as_double(), to7_midi_status, |
1100 | | (to7_midi_status & ACIA_6850_RDRF) ? 1 : 0, |
1101 | | (to7_midi_status & ACIA_6850_TDRE) ? 1 : 0, |
1102 | | (to7_midi_status & ACIA_6850_OVRN) ? 1 : 0, |
1103 | | (to7_midi_status & ACIA_6850_irq) ? 1 : 0 )); |
1104 | | return to7_midi_status; |
1105 | | |
1106 | | |
1107 | | case 1: /* get input data */ |
1108 | | { |
1109 | | UINT8 data = chardev_in( to7_midi_chardev ); |
1110 | | if ( !space.debugger_access() ) |
1111 | | { |
1112 | | to7_midi_status &= ~(ACIA_6850_irq | ACIA_6850_RDRF); |
1113 | | if ( to7_midi_overrun ) |
1114 | | to7_midi_status |= ACIA_6850_OVRN; |
1115 | | else |
1116 | | to7_midi_status &= ~ACIA_6850_OVRN; |
1117 | | to7_midi_overrun = 0; |
1118 | | LOG_MIDI(( "%s %f to7_midi_r: read data $%02X\n", |
1119 | | space.machine().describe_context(), space.machine().time().as_double(), data )); |
1120 | | to7_midi_update_irq(); |
1121 | | } |
1122 | | return data; |
1123 | | } |
1124 | | |
1125 | | |
1126 | | default: |
1127 | | logerror( "%s to7_midi_r: invalid offset %i\n", |
1128 | | space.machine().describe_context(), offset ); |
1129 | | return 0; |
1130 | | } |
1131 | | } |
1132 | | |
1133 | | |
1134 | | |
1135 | | WRITE8_MEMBER( thomson_state::to7_midi_w ) |
1136 | | { |
1137 | | /* ACIA 6850 registers */ |
1138 | | |
1139 | | switch ( offset ) |
1140 | | { |
1141 | | case 0: /* set control */ |
1142 | | /* bits 0-1: clock divide (ignored) or reset */ |
1143 | | if ( (data & 3) == 3 ) |
1144 | | { |
1145 | | /* reset */ |
1146 | | LOG_MIDI(( "%s %f to7_midi_w: reset (data=$%02X)\n", space.machine().describe_context(), space.machine().time().as_double(), data )); |
1147 | | to7_midi_overrun = 0; |
1148 | | to7_midi_status = 2; |
1149 | | to7_midi_intr = 0; |
1150 | | chardev_reset( to7_midi_chardev ); |
1151 | | } |
1152 | | else |
1153 | | { |
1154 | | /* bits 2-4: parity */ |
1155 | | /* bits 5-6: interrupt on transmit */ |
1156 | | /* bit 7: interrupt on receive */ |
1157 | | to7_midi_intr = data >> 5; |
1158 | | { |
1159 | | static const int bits[8] = { 7,7,7,7,8,8,8,8 }; |
1160 | | static const int stop[8] = { 2,2,1,1,2,1,1,1 }; |
1161 | | static const char parity[8] = { 'e','o','e','o','-','-','e','o' }; |
1162 | | LOG_MIDI(( "%s %f to7_midi_w: set control to $%02X (bits=%i, stop=%i, parity=%c, intr in=%i out=%i)\n", |
1163 | | space.machine().describe_context(), space.machine().time().as_double(), |
1164 | | data, |
1165 | | bits[ (data >> 2) & 7 ], |
1166 | | stop[ (data >> 2) & 7 ], |
1167 | | parity[ (data >> 2) & 7 ], |
1168 | | to7_midi_intr >> 2, |
1169 | | (to7_midi_intr & 3) ? 1 : 0)); |
1170 | | } |
1171 | | } |
1172 | | to7_midi_update_irq( ); |
1173 | | break; |
1174 | | |
1175 | | |
1176 | | case 1: /* output data */ |
1177 | | LOG_MIDI(( "%s %f to7_midi_w: write data $%02X\n", space.machine().describe_context(), space.machine().time().as_double(), data )); |
1178 | | if ( data == 0x55 ) |
1179 | | /* cable-detect: shortcut */ |
1180 | | chardev_fake_in( to7_midi_chardev, 0x55 ); |
1181 | | else |
1182 | | { |
1183 | | /* send to MIDI */ |
1184 | | to7_midi_status &= ~(ACIA_6850_irq | ACIA_6850_TDRE); |
1185 | | chardev_out( to7_midi_chardev, data ); |
1186 | | } |
1187 | | break; |
1188 | | |
1189 | | |
1190 | | default: |
1191 | | logerror( "%s to7_midi_w: invalid offset %i (data=$%02X) \n", space.machine().describe_context(), offset, data ); |
1192 | | } |
1193 | | } |
1194 | | |
1195 | | |
1196 | | |
1197 | | static const chardev_interface to7_midi_interface = |
1198 | | { |
1199 | | to7_midi_byte_received_cb, |
1200 | | to7_midi_ready_to_send_cb, |
1201 | | }; |
1202 | | |
1203 | | |
1204 | | |
1205 | | void thomson_state::to7_midi_reset( ) |
1206 | | { |
1207 | | LOG (( "to7_midi_reset called\n" )); |
1208 | | to7_midi_overrun = 0; |
1209 | | to7_midi_status = 0; |
1210 | | to7_midi_intr = 0; |
1211 | | chardev_reset( to7_midi_chardev ); |
1212 | | } |
1213 | | |
1214 | | |
1215 | | |
1216 | | void thomson_state::to7_midi_init( ) |
1217 | | { |
1218 | | LOG (( "to7_midi_init\n" )); |
1219 | | to7_midi_chardev = chardev_open( &machine, "/dev/snd/midiC0D0", "/dev/snd/midiC0D1", &to7_midi_interface ); |
1220 | | save_item(NAME(to7_midi_status ); |
1221 | | save_item(NAME(to7_midi_overrun ); |
1222 | | save_item(NAME(to7_midi_intr ); |
1223 | | } |
1224 | | |
1225 | | |
1226 | | |
1227 | | #else |
1228 | | |
1229 | | |
1230 | | |
1231 | | READ8_MEMBER( thomson_state::to7_midi_r ) |
1232 | | { |
1233 | 1039 | logerror( "to7_midi_r: not implemented\n" ); |
1234 | 1040 | return 0; |
1235 | 1041 | } |
r32453 | r32454 | |
1257 | 1063 | |
1258 | 1064 | |
1259 | 1065 | |
1260 | | #endif |
1261 | | |
1262 | | |
1263 | | |
1264 | 1066 | /* ------------ init / reset ------------ */ |
1265 | 1067 | |
1266 | 1068 | |
trunk/src/mess/drivers/rainbow.c
r32453 | r32454 | |
196 | 196 | // WORKAROUNDS: |
197 | 197 | // (1) FORCE LOGO: - not valid for 100-A ROM - |
198 | 198 | //#define FORCE_RAINBOW_B_LOGO |
199 | | // (2) KEYBOARD_WORKAROUND : also requires FORCE...LOGO ! |
200 | | //#define KEYBOARD_WORKAROUND |
201 | | //#define KBD_DELAY 8500 |
202 | 199 | |
203 | 200 | // ---------------------------------------------------------------------------------------------- |
204 | 201 | #include "emu.h" |
r32453 | r32454 | |
226 | 223 | public: |
227 | 224 | rainbow_state(const machine_config &mconfig, device_type type, const char *tag) : |
228 | 225 | driver_device(mconfig, type, tag), |
229 | | #ifdef KEYBOARD_WORKAROUND |
230 | | #include "m_kbd1.c" // KEYBOARD_WORKAROUND |
231 | | #endif |
232 | 226 | m_inp1(*this, "W13"), |
233 | 227 | m_inp2(*this, "W14"), |
234 | 228 | m_inp3(*this, "W15"), |
r32453 | r32454 | |
291 | 285 | |
292 | 286 | DECLARE_WRITE_LINE_MEMBER(irq_hi_w); |
293 | 287 | |
294 | | #ifdef KEYBOARD_WORKAROUND |
295 | | #include "port9x_Ax.c" // KEYBOARD_WORKAROUND |
296 | | #endif |
297 | 288 | UINT32 screen_update_rainbow(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
298 | 289 | INTERRUPT_GEN_MEMBER(vblank_irq); |
299 | 290 | DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock); |
r32453 | r32454 | |
317 | 308 | IRQ_8088_MAX |
318 | 309 | }; |
319 | 310 | |
320 | | #ifdef KEYBOARD_WORKAROUND |
321 | | #include "m_kbd2.c" // KEYBOARD_WORKAROUND |
322 | | #endif |
323 | 311 | required_ioport m_inp1; |
324 | 312 | required_ioport m_inp2; |
325 | 313 | required_ioport m_inp3; |
r32453 | r32454 | |
430 | 418 | rom[0xf437b] = 0xeb; |
431 | 419 | #endif |
432 | 420 | |
433 | | #ifdef KEYBOARD_WORKAROUND |
434 | | #include "rainbow_keyboard0.c" |
435 | | #endif |
436 | 421 | } |
437 | 422 | |
438 | 423 | static ADDRESS_MAP_START( rainbow8088_map, AS_PROGRAM, 8, rainbow_state) |
r32453 | r32454 | |
534 | 519 | // =========================================================== |
535 | 520 | // 0x70 -> 0x7f ***** EXTENDED COMM. OPTION / Option Select 4. |
536 | 521 | // =========================================================== |
537 | | #ifdef KEYBOARD_WORKAROUND |
538 | | #include "am_range_9x_Ax.c" // KEYBOARD_WORKAROUND |
539 | | #endif |
540 | 522 | ADDRESS_MAP_END |
541 | 523 | |
542 | 524 | static ADDRESS_MAP_START(rainbowz80_mem, AS_PROGRAM, 8, rainbow_state) |
r32453 | r32454 | |
559 | 541 | /* DIP switches */ |
560 | 542 | static INPUT_PORTS_START( rainbow100b_in ) |
561 | 543 | |
562 | | #ifdef KEYBOARD_WORKAROUND |
563 | | #include "rainbow_ipt.c" |
564 | | #endif |
565 | 544 | PORT_START("MONITOR TYPE") |
566 | 545 | PORT_DIPNAME( 0x03, 0x03, "MONOCHROME MONITOR") |
567 | 546 | PORT_DIPSETTING(0x01, "WHITE") |
r32453 | r32454 | |
695 | 674 | |
696 | 675 | } |
697 | 676 | |
698 | | #ifdef KEYBOARD_WORKAROUND |
699 | | #include "rainbow_keyboard2.c" |
700 | | #endif |
701 | 677 | |
702 | 678 | UINT32 rainbow_state::screen_update_rainbow(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
703 | 679 | { |