trunk/src/mess/machine/victor9kb.c
| r23522 | r23523 | |
| 251 | 251 | m_ya(*this, "YA"), |
| 252 | 252 | m_yb(*this, "YB"), |
| 253 | 253 | m_yc(*this, "YC"), |
| 254 | m_write_kbrdy(*this), |
| 254 | 255 | m_y(0), |
| 255 | 256 | m_kbrdy(1), |
| 256 | 257 | m_kbdata(1), |
| r23522 | r23523 | |
| 258 | 259 | { |
| 259 | 260 | } |
| 260 | 261 | |
| 261 | | //------------------------------------------------- |
| 262 | | // device_config_complete - perform any |
| 263 | | // operations now that the configuration is |
| 264 | | // complete |
| 265 | | //------------------------------------------------- |
| 266 | 262 | |
| 267 | | void victor9k_keyboard_device::device_config_complete() |
| 268 | | { |
| 269 | | // inherit a copy of the static data |
| 270 | | const victor9k_keyboard_interface *intf = reinterpret_cast<const victor9k_keyboard_interface *>(static_config()); |
| 271 | | if (intf != NULL) |
| 272 | | *static_cast<victor9k_keyboard_interface *>(this) = *intf; |
| 273 | | |
| 274 | | // or initialize to defaults if none provided |
| 275 | | else |
| 276 | | { |
| 277 | | memset(&m_out_kbrdy_cb, 0, sizeof(m_out_kbrdy_cb)); |
| 278 | | } |
| 279 | | } |
| 280 | | |
| 281 | 263 | //------------------------------------------------- |
| 282 | 264 | // device_start - device-specific startup |
| 283 | 265 | //------------------------------------------------- |
| r23522 | r23523 | |
| 285 | 267 | void victor9k_keyboard_device::device_start() |
| 286 | 268 | { |
| 287 | 269 | // resolve callbacks |
| 288 | | m_out_kbrdy_func.resolve(m_out_kbrdy_cb, *this); |
| 270 | m_write_kbrdy.resolve_safe(); |
| 289 | 271 | |
| 290 | 272 | // state saving |
| 291 | 273 | save_item(NAME(m_y)); |
| r23522 | r23523 | |
| 400 | 382 | if (m_kbrdy != kbrdy) |
| 401 | 383 | { |
| 402 | 384 | m_kbrdy = kbrdy; |
| 403 | | m_out_kbrdy_func(m_kbrdy); |
| 385 | m_write_kbrdy(m_kbrdy); |
| 404 | 386 | } |
| 405 | 387 | |
| 406 | 388 | m_kbdata = BIT(data, 3); |
trunk/src/mess/machine/victor9kb.h
| r23522 | r23523 | |
| 30 | 30 | // INTERFACE CONFIGURATION MACROS |
| 31 | 31 | //************************************************************************** |
| 32 | 32 | |
| 33 | | #define MCFG_VICTOR9K_KEYBOARD_ADD(_config) \ |
| 33 | #define MCFG_VICTOR9K_KEYBOARD_ADD(_kbrdy) \ |
| 34 | 34 | MCFG_DEVICE_ADD(VICTOR9K_KEYBOARD_TAG, VICTOR9K_KEYBOARD, 0) \ |
| 35 | | MCFG_DEVICE_CONFIG(_config) |
| 35 | downcast<victor9k_keyboard_device *>(device)->set_kbrdy_callback(DEVCB2_##_kbrdy); \ |
| 36 | 36 | |
| 37 | 37 | |
| 38 | | #define VICTOR9K_KEYBOARD_INTERFACE(_name) \ |
| 39 | | const victor9k_keyboard_interface (_name) = |
| 40 | 38 | |
| 41 | | |
| 42 | | |
| 43 | 39 | //************************************************************************** |
| 44 | 40 | // TYPE DEFINITIONS |
| 45 | 41 | //************************************************************************** |
| 46 | 42 | |
| 47 | | // ======================> victor9k_keyboard_interface |
| 48 | | |
| 49 | | struct victor9k_keyboard_interface |
| 50 | | { |
| 51 | | devcb_write_line m_out_kbrdy_cb; |
| 52 | | }; |
| 53 | | |
| 54 | | |
| 55 | 43 | // ======================> victor9k_keyboard_device |
| 56 | 44 | |
| 57 | | class victor9k_keyboard_device : public device_t, |
| 58 | | public victor9k_keyboard_interface |
| 45 | class victor9k_keyboard_device : public device_t |
| 59 | 46 | { |
| 60 | 47 | public: |
| 61 | 48 | // construction/destruction |
| 62 | 49 | victor9k_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 63 | 50 | |
| 51 | template<class _kbrdy> void set_kbrdy_callback(_kbrdy kbrdy) { m_write_kbrdy.set_callback(kbrdy); } |
| 52 | |
| 64 | 53 | // optional information overrides |
| 65 | 54 | virtual const rom_entry *device_rom_region() const; |
| 66 | 55 | virtual machine_config_constructor device_mconfig_additions() const; |
| r23522 | r23523 | |
| 80 | 69 | // device-level overrides |
| 81 | 70 | virtual void device_start(); |
| 82 | 71 | virtual void device_reset(); |
| 83 | | virtual void device_config_complete(); |
| 84 | 72 | |
| 85 | 73 | private: |
| 86 | | devcb_resolved_write_line m_out_kbrdy_func; |
| 87 | | |
| 88 | 74 | required_device<cpu_device> m_maincpu; |
| 89 | 75 | required_ioport m_y0; |
| 90 | 76 | required_ioport m_y1; |
| r23522 | r23523 | |
| 100 | 86 | required_ioport m_yb; |
| 101 | 87 | required_ioport m_yc; |
| 102 | 88 | |
| 89 | devcb2_write_line m_write_kbrdy; |
| 90 | |
| 103 | 91 | UINT8 m_y; |
| 104 | 92 | int m_kbrdy; |
| 105 | 93 | int m_kbdata; |
trunk/src/mess/includes/victor9k.h
| r23522 | r23523 | |
| 74 | 74 | m_kb(*this, VICTOR9K_KEYBOARD_TAG), |
| 75 | 75 | m_rs232a(*this, RS232_A_TAG), |
| 76 | 76 | m_rs232b(*this, RS232_B_TAG), |
| 77 | | m_video_ram(*this, "video_ram") |
| 77 | m_video_ram(*this, "video_ram"), |
| 78 | m_da(0), |
| 79 | m_da0(0), |
| 80 | m_da1(0), |
| 81 | m_sel0(0), |
| 82 | m_sel1(0), |
| 83 | m_tach0(0), |
| 84 | m_tach1(0), |
| 85 | m_rdy0(0), |
| 86 | m_rdy1(0), |
| 87 | m_ds0(1), |
| 88 | m_ds1(1), |
| 89 | m_lms(0), |
| 90 | m_brdy(1), |
| 91 | m_sync(1), |
| 92 | m_gcrerr(0) |
| 78 | 93 | { } |
| 79 | 94 | |
| 80 | 95 | required_device<cpu_device> m_maincpu; |
| r23522 | r23523 | |
| 125 | 140 | |
| 126 | 141 | DECLARE_WRITE8_MEMBER( via4_pa_w ); |
| 127 | 142 | DECLARE_WRITE8_MEMBER( via4_pb_w ); |
| 143 | DECLARE_READ_LINE_MEMBER( ds0_r ); |
| 144 | DECLARE_READ_LINE_MEMBER( ds1_r ); |
| 128 | 145 | DECLARE_WRITE_LINE_MEMBER( mode_w ); |
| 129 | 146 | DECLARE_WRITE_LINE_MEMBER( via4_irq_w ); |
| 130 | 147 | |
| r23522 | r23523 | |
| 147 | 164 | |
| 148 | 165 | DECLARE_WRITE_LINE_MEMBER( ssda_irq_w ); |
| 149 | 166 | |
| 167 | void ready0_cb(floppy_image_device *, int device); |
| 168 | int load0_cb(floppy_image_device *device); |
| 169 | void unload0_cb(floppy_image_device *device); |
| 170 | void ready1_cb(floppy_image_device *, int device); |
| 171 | int load1_cb(floppy_image_device *device); |
| 172 | void unload1_cb(floppy_image_device *device); |
| 173 | |
| 150 | 174 | enum |
| 151 | 175 | { |
| 152 | 176 | LED_A = 0, |
| r23522 | r23523 | |
| 177 | 201 | int m_tach1; |
| 178 | 202 | int m_rdy0; |
| 179 | 203 | int m_rdy1; |
| 204 | int m_ds0; |
| 205 | int m_ds1; |
| 180 | 206 | UINT8 m_lms; /* motor speed */ |
| 181 | 207 | int m_st[2]; /* stepper phase */ |
| 182 | 208 | int m_stp[2]; /* stepper enable */ |
trunk/src/mess/drivers/victor9k.c
| r23522 | r23523 | |
| 86 | 86 | |
| 87 | 87 | |
| 88 | 88 | //------------------------------------------------- |
| 89 | // floppy_p2_r - |
| 90 | //------------------------------------------------- |
| 91 | |
| 92 | READ8_MEMBER( victor9k_state::floppy_p2_r ) |
| 93 | { |
| 94 | /* |
| 95 | |
| 96 | bit description |
| 97 | |
| 98 | 0 |
| 99 | 1 |
| 100 | 2 |
| 101 | 3 |
| 102 | 4 |
| 103 | 5 |
| 104 | 6 RDY0 |
| 105 | 7 RDY1 |
| 106 | |
| 107 | */ |
| 108 | |
| 109 | UINT8 data = 0; |
| 110 | |
| 111 | data |= m_rdy0 << 6; |
| 112 | data |= m_rdy1 << 7; |
| 113 | |
| 114 | return data; |
| 115 | } |
| 116 | |
| 117 | |
| 118 | //------------------------------------------------- |
| 89 | 119 | // floppy_p2_w - |
| 90 | 120 | //------------------------------------------------- |
| 91 | 121 | |
| r23522 | r23523 | |
| 101 | 131 | 3 STOP1 |
| 102 | 132 | 4 SEL1 |
| 103 | 133 | 5 SEL0 |
| 104 | | 6 RDY0 |
| 105 | | 7 RDY1 |
| 134 | 6 |
| 135 | 7 |
| 106 | 136 | |
| 107 | 137 | */ |
| 108 | 138 | |
| r23522 | r23523 | |
| 130 | 160 | } |
| 131 | 161 | |
| 132 | 162 | m_sel1 = sel1; |
| 133 | | |
| 134 | | m_rdy0 = BIT(data, 6); |
| 135 | | m_via5->write_ca2(m_rdy0); |
| 136 | | |
| 137 | | m_rdy1 = BIT(data, 7); |
| 138 | | m_via5->write_cb2(m_rdy1); |
| 139 | 163 | } |
| 140 | 164 | |
| 141 | 165 | |
| r23522 | r23523 | |
| 202 | 226 | //------------------------------------------------- |
| 203 | 227 | |
| 204 | 228 | static ADDRESS_MAP_START( floppy_io, AS_IO, 8, victor9k_state ) |
| 205 | | AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(floppy_p1_r) |
| 206 | | AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(floppy_p2_w) |
| 229 | AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(floppy_p1_r) AM_WRITENOP |
| 230 | AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(floppy_p2_r, floppy_p2_w) |
| 207 | 231 | AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(tach0_r) |
| 208 | 232 | AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(tach1_r) |
| 209 | 233 | AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_WRITE(da_w) |
| r23522 | r23523 | |
| 784 | 808 | m_st[1] = data >> 4; |
| 785 | 809 | } |
| 786 | 810 | |
| 811 | READ_LINE_MEMBER( victor9k_state::ds0_r ) |
| 812 | { |
| 813 | return m_ds0; |
| 814 | } |
| 815 | |
| 816 | READ_LINE_MEMBER( victor9k_state::ds1_r ) |
| 817 | { |
| 818 | return m_ds1; |
| 819 | } |
| 820 | |
| 787 | 821 | WRITE_LINE_MEMBER( victor9k_state::mode_w ) |
| 788 | 822 | { |
| 789 | 823 | } |
| r23522 | r23523 | |
| 799 | 833 | { |
| 800 | 834 | DEVCB_NULL, |
| 801 | 835 | DEVCB_NULL, |
| 802 | | DEVCB_NULL, // DS0 |
| 803 | | DEVCB_NULL, // DS1 |
| 836 | DEVCB_DRIVER_LINE_MEMBER(victor9k_state, ds0_r), |
| 837 | DEVCB_DRIVER_LINE_MEMBER(victor9k_state, ds1_r), |
| 804 | 838 | DEVCB_NULL, |
| 805 | 839 | DEVCB_NULL, |
| 806 | 840 | |
| r23522 | r23523 | |
| 993 | 1027 | data |= m_rdy1 << 1; |
| 994 | 1028 | |
| 995 | 1029 | // door B sense |
| 1030 | data |= m_ds1 << 3; |
| 996 | 1031 | |
| 997 | 1032 | // door A sense |
| 1033 | data |= m_ds0 << 4; |
| 998 | 1034 | |
| 999 | 1035 | // single/double sided |
| 1000 | 1036 | data |= (m_drive ? m_floppy1->twosid_r() : m_floppy0->twosid_r()) << 5; |
| r23522 | r23523 | |
| 1070 | 1106 | }; |
| 1071 | 1107 | |
| 1072 | 1108 | |
| 1073 | | |
| 1074 | 1109 | //------------------------------------------------- |
| 1075 | 1110 | // VICTOR9K_KEYBOARD_INTERFACE( kb_intf ) |
| 1076 | 1111 | //------------------------------------------------- |
| r23522 | r23523 | |
| 1082 | 1117 | m_pic->ir6_w(state ? CLEAR_LINE : ASSERT_LINE); |
| 1083 | 1118 | } |
| 1084 | 1119 | |
| 1085 | | static VICTOR9K_KEYBOARD_INTERFACE( kb_intf ) |
| 1086 | | { |
| 1087 | | DEVCB_DRIVER_LINE_MEMBER(victor9k_state, kbrdy_w) |
| 1088 | | }; |
| 1089 | 1120 | |
| 1090 | | |
| 1091 | 1121 | //------------------------------------------------- |
| 1092 | 1122 | // SLOT_INTERFACE( victor9k_floppies ) |
| 1093 | 1123 | //------------------------------------------------- |
| 1094 | 1124 | |
| 1125 | void victor9k_state::ready0_cb(floppy_image_device *device, int state) |
| 1126 | { |
| 1127 | m_rdy0 = state; |
| 1128 | |
| 1129 | m_via5->write_ca2(m_rdy0); |
| 1130 | } |
| 1131 | |
| 1132 | int victor9k_state::load0_cb(floppy_image_device *device) |
| 1133 | { |
| 1134 | m_ds0 = 0; |
| 1135 | |
| 1136 | m_via4->write_ca1(m_ds0); |
| 1137 | |
| 1138 | return IMAGE_INIT_PASS; |
| 1139 | } |
| 1140 | |
| 1141 | void victor9k_state::unload0_cb(floppy_image_device *device) |
| 1142 | { |
| 1143 | m_ds0 = 1; |
| 1144 | |
| 1145 | m_via4->write_ca1(m_ds0); |
| 1146 | } |
| 1147 | |
| 1148 | void victor9k_state::ready1_cb(floppy_image_device *device, int state) |
| 1149 | { |
| 1150 | m_rdy1 = state; |
| 1151 | |
| 1152 | m_via5->write_cb2(m_rdy1); |
| 1153 | } |
| 1154 | |
| 1155 | int victor9k_state::load1_cb(floppy_image_device *device) |
| 1156 | { |
| 1157 | m_ds1 = 0; |
| 1158 | |
| 1159 | m_via4->write_cb1(m_ds1); |
| 1160 | |
| 1161 | return IMAGE_INIT_PASS; |
| 1162 | } |
| 1163 | |
| 1164 | void victor9k_state::unload1_cb(floppy_image_device *device) |
| 1165 | { |
| 1166 | m_ds1 = 1; |
| 1167 | |
| 1168 | m_via4->write_cb1(m_ds1); |
| 1169 | } |
| 1170 | |
| 1095 | 1171 | static SLOT_INTERFACE_START( victor9k_floppies ) |
| 1096 | 1172 | SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) |
| 1097 | 1173 | SLOT_INTERFACE_END |
| r23522 | r23523 | |
| 1139 | 1215 | // set interrupt callback |
| 1140 | 1216 | m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(victor9k_state::victor9k_irq_callback),this)); |
| 1141 | 1217 | |
| 1218 | // set floppy callbacks |
| 1219 | m_floppy0->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor9k_state::ready0_cb), this)); |
| 1220 | m_floppy0->setup_load_cb(floppy_image_device::load_cb(FUNC(victor9k_state::load0_cb), this)); |
| 1221 | m_floppy0->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor9k_state::unload0_cb), this)); |
| 1222 | m_floppy1->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor9k_state::ready1_cb), this)); |
| 1223 | m_floppy1->setup_load_cb(floppy_image_device::load_cb(FUNC(victor9k_state::load1_cb), this)); |
| 1224 | m_floppy1->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor9k_state::unload1_cb), this)); |
| 1225 | |
| 1142 | 1226 | // memory banking |
| 1143 | 1227 | address_space &program = m_maincpu->space(AS_PROGRAM); |
| 1144 | 1228 | program.install_ram(0x00000, m_ram->size() - 1, m_ram->pointer()); |
| 1145 | 1229 | } |
| 1146 | 1230 | |
| 1147 | 1231 | |
| 1232 | |
| 1148 | 1233 | //************************************************************************** |
| 1149 | 1234 | // MACHINE CONFIGURATION |
| 1150 | 1235 | //************************************************************************** |
| r23522 | r23523 | |
| 1197 | 1282 | MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":1", victor9k_floppies, "525qd", floppy_image_device::default_floppy_formats) |
| 1198 | 1283 | MCFG_RS232_PORT_ADD(RS232_A_TAG, rs232a_intf, default_rs232_devices, NULL) |
| 1199 | 1284 | MCFG_RS232_PORT_ADD(RS232_B_TAG, rs232b_intf, default_rs232_devices, NULL) |
| 1200 | | MCFG_VICTOR9K_KEYBOARD_ADD(kb_intf) |
| 1285 | MCFG_VICTOR9K_KEYBOARD_ADD(WRITELINE(victor9k_state, kbrdy_w)) |
| 1201 | 1286 | |
| 1202 | 1287 | // internal ram |
| 1203 | 1288 | MCFG_RAM_ADD(RAM_TAG) |