trunk/src/mame/drivers/osborne1.c
r249964 | r249965 | |
47 | 47 | ***************************************************************************/ |
48 | 48 | |
49 | 49 | #include "includes/osborne1.h" |
| 50 | #include "bus/rs232/rs232.h" |
50 | 51 | |
51 | 52 | |
52 | 53 | #define MAIN_CLOCK 15974400 |
r249964 | r249965 | |
167 | 168 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) |
168 | 169 | |
169 | 170 | PORT_START("CNF") |
| 171 | PORT_CONFNAME(0x06, 0x00, "Serial Speed") |
| 172 | PORT_CONFSETTING(0x00, "300/1200") |
| 173 | PORT_CONFSETTING(0x02, "600/1200") |
| 174 | PORT_CONFSETTING(0x04, "1200/4800") |
| 175 | PORT_CONFSETTING(0x06, "2400/9600") |
170 | 176 | PORT_CONFNAME(0x01, 0x00, "Video Output") |
171 | 177 | PORT_CONFSETTING(0x00, "Standard") |
172 | 178 | PORT_CONFSETTING(0x01, "SCREEN-PAC") |
r249964 | r249965 | |
235 | 241 | MCFG_PIA_CB2_HANDLER(DEVWRITELINE(IEEE488_TAG, ieee488_device, ren_w)) |
236 | 242 | MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, ieee_pia_irq_a_func)) |
237 | 243 | |
238 | | MCFG_DEVICE_ADD( "pia_1", PIA6821, 0) |
| 244 | MCFG_DEVICE_ADD("pia_1", PIA6821, 0) |
239 | 245 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(osborne1_state, video_pia_port_a_w)) |
240 | 246 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(osborne1_state, video_pia_port_b_w)) |
241 | 247 | MCFG_PIA_CB2_HANDLER(WRITELINE(osborne1_state, video_pia_out_cb2_dummy)) |
242 | 248 | MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, video_pia_irq_a_func)) |
243 | 249 | |
| 250 | MCFG_DEVICE_ADD("acia", ACIA6850, 0) |
| 251 | MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) |
| 252 | MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) |
| 253 | MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(osborne1_state, serial_acia_irq_func)) |
| 254 | |
| 255 | MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL) |
| 256 | MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxd)) |
| 257 | MCFG_RS232_DCD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_dcd)) |
| 258 | MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts)) |
| 259 | MCFG_RS232_RI_HANDLER(DEVWRITELINE("pia_1", pia6821_device, ca2_w)) |
| 260 | |
244 | 261 | MCFG_DEVICE_ADD("mb8877", MB8877, MAIN_CLOCK/16) |
245 | 262 | MCFG_WD_FDC_FORCE_READY |
246 | 263 | MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats) |
r249964 | r249965 | |
250 | 267 | MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia_0", pia6821_device, ca2_w)) |
251 | 268 | MCFG_SOFTWARE_LIST_ADD("flop_list","osborne1") |
252 | 269 | |
253 | | /* internal ram */ |
| 270 | // internal ram |
254 | 271 | MCFG_RAM_ADD(RAM_TAG) |
255 | | MCFG_RAM_DEFAULT_SIZE("68K") /* 64KB Main RAM and 4Kbit video attribute RAM */ |
| 272 | MCFG_RAM_DEFAULT_SIZE("68K") // 64bB main RAM and 4kbit video attribute RAM |
256 | 273 | MACHINE_CONFIG_END |
257 | 274 | |
258 | 275 | |
trunk/src/mame/includes/osborne1.h
r249964 | r249965 | |
24 | 24 | enum |
25 | 25 | { |
26 | 26 | TIMER_VIDEO, |
| 27 | TIMER_ACIA_RXC_TXC, |
27 | 28 | TIMER_SETUP |
28 | 29 | }; |
29 | 30 | |
30 | | osborne1_state(const machine_config &mconfig, device_type type, const char *tag) |
31 | | : driver_device(mconfig, type, tag), |
| 31 | osborne1_state(const machine_config &mconfig, device_type type, const char *tag) : |
| 32 | driver_device(mconfig, type, tag), |
32 | 33 | m_maincpu(*this, "maincpu"), |
33 | 34 | m_pia0(*this, "pia_0"), |
34 | 35 | m_pia1(*this, "pia_1"), |
| 36 | m_acia(*this, "acia"), |
35 | 37 | m_fdc(*this, "mb8877"), |
36 | 38 | m_beep(*this, "beeper"), |
37 | 39 | m_ram(*this, RAM_TAG), |
38 | 40 | m_ieee(*this, IEEE488_TAG), |
39 | 41 | m_floppy0(*this, "mb8877:0:525ssdd"), |
40 | 42 | m_floppy1(*this, "mb8877:1:525ssdd"), |
| 43 | m_video_timer(NULL), |
41 | 44 | m_keyb_row0(*this, "ROW0"), |
42 | 45 | m_keyb_row1(*this, "ROW1"), |
43 | 46 | m_keyb_row2(*this, "ROW2"), |
r249964 | r249965 | |
48 | 51 | m_keyb_row7(*this, "ROW7"), |
49 | 52 | m_btn_reset(*this, "RESET"), |
50 | 53 | m_cnf(*this, "CNF"), |
| 54 | m_region_maincpu(*this, "maincpu"), |
51 | 55 | m_bank_0xxx(*this, "bank_0xxx"), |
52 | 56 | m_bank_1xxx(*this, "bank_1xxx"), |
53 | 57 | m_bank_fxxx(*this, "bank_fxxx"), |
54 | | m_region_maincpu(*this, "maincpu") { } |
| 58 | m_acia_rxc_txc_timer(NULL) |
| 59 | { } |
55 | 60 | |
56 | | virtual void video_start(); |
57 | 61 | |
58 | | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
59 | | |
60 | | bitmap_ind16 m_bitmap; |
61 | | |
62 | | required_device<cpu_device> m_maincpu; |
63 | | required_device<pia6821_device> m_pia0; |
64 | | required_device<pia6821_device> m_pia1; |
65 | | required_device<mb8877_t> m_fdc; |
66 | | required_device<beep_device> m_beep; |
67 | | required_device<ram_device> m_ram; |
68 | | required_device<ieee488_device> m_ieee; |
69 | | required_device<floppy_image_device> m_floppy0; |
70 | | required_device<floppy_image_device> m_floppy1; |
71 | | |
72 | 62 | DECLARE_WRITE8_MEMBER(bank_0xxx_w); |
73 | 63 | DECLARE_WRITE8_MEMBER(bank_1xxx_w); |
74 | 64 | DECLARE_READ8_MEMBER(bank_2xxx_3xxx_r); |
r249964 | r249965 | |
87 | 77 | DECLARE_WRITE_LINE_MEMBER(video_pia_out_cb2_dummy); |
88 | 78 | DECLARE_WRITE_LINE_MEMBER(video_pia_irq_a_func); |
89 | 79 | |
| 80 | DECLARE_WRITE_LINE_MEMBER(serial_acia_irq_func); |
| 81 | |
| 82 | DECLARE_DRIVER_INIT(osborne1); |
| 83 | virtual void machine_reset(); |
| 84 | virtual void video_start(); |
| 85 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 86 | |
| 87 | TIMER_CALLBACK_MEMBER(video_callback); |
| 88 | TIMER_CALLBACK_MEMBER(setup_callback); |
| 89 | |
| 90 | bitmap_ind16 m_bitmap; |
| 91 | |
| 92 | required_device<cpu_device> m_maincpu; |
| 93 | required_device<pia6821_device> m_pia0; |
| 94 | required_device<pia6821_device> m_pia1; |
| 95 | required_device<acia6850_device> m_acia; |
| 96 | required_device<mb8877_t> m_fdc; |
| 97 | required_device<beep_device> m_beep; |
| 98 | required_device<ram_device> m_ram; |
| 99 | required_device<ieee488_device> m_ieee; |
| 100 | required_device<floppy_image_device> m_floppy0; |
| 101 | required_device<floppy_image_device> m_floppy1; |
| 102 | |
90 | 103 | /* video related */ |
91 | | UINT8 m_screen_pac; |
92 | 104 | UINT8 m_resolution; |
93 | 105 | UINT8 m_hc_left; |
94 | 106 | UINT8 m_new_start_x; |
r249964 | r249965 | |
96 | 108 | emu_timer *m_video_timer; |
97 | 109 | UINT8 *m_p_chargen; |
98 | 110 | bool m_beep_state; |
99 | | DECLARE_DRIVER_INIT(osborne1); |
100 | | virtual void machine_reset(); |
101 | | TIMER_CALLBACK_MEMBER(osborne1_video_callback); |
102 | | TIMER_CALLBACK_MEMBER(setup_osborne1); |
103 | 111 | |
104 | 112 | protected: |
105 | | required_ioport m_keyb_row0; |
106 | | required_ioport m_keyb_row1; |
107 | | required_ioport m_keyb_row2; |
108 | | required_ioport m_keyb_row3; |
109 | | required_ioport m_keyb_row4; |
110 | | required_ioport m_keyb_row5; |
111 | | required_ioport m_keyb_row6; |
112 | | required_ioport m_keyb_row7; |
113 | | required_ioport m_btn_reset; |
| 113 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
114 | 114 | |
115 | | required_ioport m_cnf; |
| 115 | bool set_rom_mode(UINT8 value); |
| 116 | bool set_bit_9(UINT8 value); |
| 117 | void update_irq(); |
| 118 | void update_acia_rxc_txc(); |
116 | 119 | |
117 | | required_memory_bank m_bank_0xxx; |
118 | | required_memory_bank m_bank_1xxx; |
119 | | required_memory_bank m_bank_fxxx; |
| 120 | // user inputs |
| 121 | required_ioport m_keyb_row0; |
| 122 | required_ioport m_keyb_row1; |
| 123 | required_ioport m_keyb_row2; |
| 124 | required_ioport m_keyb_row3; |
| 125 | required_ioport m_keyb_row4; |
| 126 | required_ioport m_keyb_row5; |
| 127 | required_ioport m_keyb_row6; |
| 128 | required_ioport m_keyb_row7; |
| 129 | required_ioport m_btn_reset; |
120 | 130 | |
121 | | required_memory_region m_region_maincpu; |
| 131 | // fake inputs for hardware configuration and things that need rewiring |
| 132 | required_ioport m_cnf; |
122 | 133 | |
| 134 | // pieces of memory |
| 135 | required_memory_region m_region_maincpu; |
| 136 | required_memory_bank m_bank_0xxx; |
| 137 | required_memory_bank m_bank_1xxx; |
| 138 | required_memory_bank m_bank_fxxx; |
| 139 | |
| 140 | // configuration (reloaded on reset) |
| 141 | UINT8 m_screen_pac; |
| 142 | UINT8 m_acia_rxc_txc_div; |
| 143 | UINT8 m_acia_rxc_txc_p_low; |
| 144 | UINT8 m_acia_rxc_txc_p_high; |
| 145 | |
123 | 146 | // bank switch control bits |
124 | | UINT8 m_ub4a_q; |
125 | | UINT8 m_ub6a_q; |
126 | | UINT8 m_rom_mode; |
127 | | UINT8 m_bit_9; |
| 147 | UINT8 m_ub4a_q; |
| 148 | UINT8 m_ub6a_q; |
| 149 | UINT8 m_rom_mode; |
| 150 | UINT8 m_bit_9; |
128 | 151 | |
129 | | bool set_rom_mode(UINT8 value); |
130 | | bool set_bit_9(UINT8 value); |
131 | | void update_irq(); |
132 | | |
133 | | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 152 | // serial state |
| 153 | int m_acia_irq_state; |
| 154 | int m_acia_rxc_txc_state; |
| 155 | emu_timer *m_acia_rxc_txc_timer; |
134 | 156 | }; |
135 | 157 | |
136 | 158 | #endif /* OSBORNE1_H_ */ |
trunk/src/mame/machine/osborne1.c
r249964 | r249965 | |
55 | 55 | data = m_pia0->read(space, offset & 0x03); |
56 | 56 | break; |
57 | 57 | case 0xA00: /* Serial */ |
| 58 | if (offset & 0x01) data = m_acia->data_r(space, 0); |
| 59 | else data = m_acia->status_r(space, 0); |
58 | 60 | break; |
59 | 61 | case 0xC00: /* Video PIA */ |
60 | 62 | data = m_pia1->read(space, offset & 0x03); |
r249964 | r249965 | |
77 | 79 | if ((offset & 0x900) == 0x900) // IEEE488 PIA |
78 | 80 | m_pia0->write(space, offset & 0x03, data); |
79 | 81 | if ((offset & 0xA00) == 0xA00) // Serial |
80 | | /* not implemented */; |
| 82 | { |
| 83 | if (offset & 0x01) m_acia->data_w(space, 0, data); |
| 84 | else m_acia->control_w(space, 0, data); |
| 85 | } |
81 | 86 | if ((offset & 0xC00) == 0x400) // SCREEN-PAC |
82 | 87 | { |
83 | 88 | m_resolution = data & 0x01; |
r249964 | r249965 | |
195 | 200 | } |
196 | 201 | |
197 | 202 | |
198 | | WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy ) |
199 | | { |
200 | | } |
201 | | |
202 | 203 | WRITE8_MEMBER( osborne1_state::video_pia_port_a_w ) |
203 | 204 | { |
204 | 205 | m_fdc->dden_w(BIT(data, 0)); |
r249964 | r249965 | |
235 | 236 | //logerror("Video pia port b write: %02X\n", data ); |
236 | 237 | } |
237 | 238 | |
| 239 | WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy ) |
| 240 | { |
| 241 | } |
| 242 | |
238 | 243 | WRITE_LINE_MEMBER( osborne1_state::video_pia_irq_a_func ) |
239 | 244 | { |
240 | 245 | update_irq(); |
241 | 246 | } |
242 | 247 | |
243 | 248 | |
244 | | //static const struct aica6850_interface osborne1_6850_config = |
245 | | //{ |
246 | | // 10, /* tx_clock */ |
247 | | // 10, /* rx_clock */ |
248 | | // NULL, /* rx_pin */ |
249 | | // NULL, /* tx_pin */ |
250 | | // NULL, /* cts_pin */ |
251 | | // NULL, /* rts_pin */ |
252 | | // NULL, /* dcd_pin */ |
253 | | // NULL /* int_callback */ |
254 | | //}; |
| 249 | WRITE_LINE_MEMBER( osborne1_state::serial_acia_irq_func ) |
| 250 | { |
| 251 | m_acia_irq_state = state; |
| 252 | update_irq(); |
| 253 | } |
255 | 254 | |
256 | 255 | |
257 | | void osborne1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 256 | DRIVER_INIT_MEMBER( osborne1_state, osborne1 ) |
258 | 257 | { |
259 | | switch (id) |
| 258 | m_bank_0xxx->configure_entries(0, 1, m_ram->pointer(), 0); |
| 259 | m_bank_0xxx->configure_entries(1, 1, m_region_maincpu->base(), 0); |
| 260 | m_bank_1xxx->configure_entries(0, 1, m_ram->pointer() + 0x1000, 0); |
| 261 | m_bank_1xxx->configure_entries(1, 1, m_region_maincpu->base(), 0); |
| 262 | m_bank_fxxx->configure_entries(0, 1, m_ram->pointer() + 0xF000, 0); |
| 263 | m_bank_fxxx->configure_entries(1, 1, m_ram->pointer() + 0x10000, 0); |
| 264 | |
| 265 | m_video_timer = timer_alloc(TIMER_VIDEO); |
| 266 | m_video_timer->adjust(machine().first_screen()->time_until_pos(1, 0)); |
| 267 | |
| 268 | m_acia_rxc_txc_timer = timer_alloc(TIMER_ACIA_RXC_TXC); |
| 269 | |
| 270 | timer_set(attotime::zero, TIMER_SETUP); |
| 271 | } |
| 272 | |
| 273 | void osborne1_state::machine_reset() |
| 274 | { |
| 275 | // Refresh configuration |
| 276 | m_screen_pac = 0 != (m_cnf->read() & 0x01); |
| 277 | switch (m_cnf->read() & 0x06) |
260 | 278 | { |
261 | | case TIMER_VIDEO: |
262 | | osborne1_video_callback(ptr, param); |
| 279 | case 0x00: |
| 280 | m_acia_rxc_txc_div = 16; |
| 281 | m_acia_rxc_txc_p_low = 23; |
| 282 | m_acia_rxc_txc_p_high = 29; |
263 | 283 | break; |
264 | | case TIMER_SETUP: |
265 | | setup_osborne1(ptr, param); |
| 284 | case 0x02: |
| 285 | m_acia_rxc_txc_div = 16; |
| 286 | m_acia_rxc_txc_p_low = 9; |
| 287 | m_acia_rxc_txc_p_high = 15; |
266 | 288 | break; |
267 | | default: |
268 | | assert_always(FALSE, "Unknown id in osborne1_state::device_timer"); |
| 289 | case 0x04: |
| 290 | m_acia_rxc_txc_div = 16; |
| 291 | m_acia_rxc_txc_p_low = 5; |
| 292 | m_acia_rxc_txc_p_high = 8; |
| 293 | break; |
| 294 | case 0x06: |
| 295 | m_acia_rxc_txc_div = 8; |
| 296 | m_acia_rxc_txc_p_low = 5; |
| 297 | m_acia_rxc_txc_p_high = 8; |
| 298 | break; |
269 | 299 | } |
| 300 | |
| 301 | // Initialise memory configuration |
| 302 | m_rom_mode = 0; |
| 303 | m_bit_9 = 1; |
| 304 | set_rom_mode(1); |
| 305 | set_bit_9(0); |
| 306 | |
| 307 | // Reset serial state |
| 308 | m_acia_irq_state = 0; |
| 309 | m_acia_rxc_txc_state = 0; |
| 310 | update_acia_rxc_txc(); |
| 311 | |
| 312 | m_resolution = 0; |
| 313 | m_hc_left = 0; |
| 314 | m_p_chargen = memregion( "chargen" )->base(); |
| 315 | |
| 316 | for (unsigned i = 0; i < 0x1000; i++) |
| 317 | m_ram->pointer()[0x10000 + i] |= 0x7F; |
270 | 318 | } |
271 | 319 | |
| 320 | void osborne1_state::video_start() |
| 321 | { |
| 322 | machine().first_screen()->register_screen_bitmap(m_bitmap); |
| 323 | } |
272 | 324 | |
273 | | TIMER_CALLBACK_MEMBER(osborne1_state::osborne1_video_callback) |
| 325 | UINT32 osborne1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
274 | 326 | { |
| 327 | copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); |
| 328 | return 0; |
| 329 | } |
| 330 | |
| 331 | |
| 332 | TIMER_CALLBACK_MEMBER(osborne1_state::video_callback) |
| 333 | { |
275 | 334 | int const y = machine().first_screen()->vpos(); |
276 | 335 | UINT8 ra = 0; |
277 | 336 | |
r249964 | r249965 | |
330 | 389 | m_video_timer->adjust(machine().first_screen()->time_until_pos(y + 1, 0)); |
331 | 390 | } |
332 | 391 | |
333 | | TIMER_CALLBACK_MEMBER(osborne1_state::setup_osborne1) |
| 392 | TIMER_CALLBACK_MEMBER(osborne1_state::setup_callback) |
334 | 393 | { |
335 | 394 | m_beep->set_state( 0 ); |
336 | 395 | m_beep->set_frequency( 300 /* 60 * 240 / 2 */ ); |
337 | 396 | m_pia1->ca1_w(0); |
338 | 397 | } |
339 | 398 | |
340 | | void osborne1_state::machine_reset() |
341 | | { |
342 | | // Initialize memory configuration |
343 | | m_rom_mode = 0; |
344 | | m_bit_9 = 1; |
345 | | set_rom_mode(1); |
346 | | set_bit_9(0); |
347 | 399 | |
348 | | m_screen_pac = 0 != (m_cnf->read() & 0x01); |
349 | | m_resolution = 0; |
350 | | m_hc_left = 0; |
351 | | m_p_chargen = memregion( "chargen" )->base(); |
352 | | |
353 | | memset(m_ram->pointer() + 0x10000, 0xFF, 0x1000); |
354 | | } |
355 | | |
356 | | |
357 | | DRIVER_INIT_MEMBER(osborne1_state,osborne1) |
| 400 | void osborne1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
358 | 401 | { |
359 | | /* Configure the 6850 ACIA */ |
360 | | // acia6850_config( 0, &osborne1_6850_config ); |
361 | | m_video_timer = timer_alloc(TIMER_VIDEO); |
362 | | m_video_timer->adjust(machine().first_screen()->time_until_pos(1, 0)); |
363 | | |
364 | | timer_set(attotime::zero, TIMER_SETUP); |
| 402 | switch (id) |
| 403 | { |
| 404 | case TIMER_VIDEO: |
| 405 | video_callback(ptr, param); |
| 406 | break; |
| 407 | case TIMER_ACIA_RXC_TXC: |
| 408 | m_acia_rxc_txc_state = m_acia_rxc_txc_state ? 0 : 1; |
| 409 | update_acia_rxc_txc(); |
| 410 | break; |
| 411 | case TIMER_SETUP: |
| 412 | setup_callback(ptr, param); |
| 413 | break; |
| 414 | default: |
| 415 | assert_always(FALSE, "Unknown id in osborne1_state::device_timer"); |
| 416 | } |
365 | 417 | } |
366 | 418 | |
367 | 419 | |
368 | | void osborne1_state::video_start() |
369 | | { |
370 | | machine().first_screen()->register_screen_bitmap(m_bitmap); |
371 | | } |
372 | | |
373 | | |
374 | | UINT32 osborne1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
375 | | { |
376 | | copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); |
377 | | return 0; |
378 | | } |
379 | | |
380 | | |
381 | 420 | bool osborne1_state::set_rom_mode(UINT8 value) |
382 | 421 | { |
383 | 422 | if (value != m_rom_mode) |
384 | 423 | { |
385 | 424 | m_rom_mode = value; |
386 | | if (m_rom_mode) |
387 | | { |
388 | | m_bank_0xxx->set_base(m_region_maincpu->base()); |
389 | | m_bank_1xxx->set_base(m_region_maincpu->base()); |
390 | | } |
391 | | else |
392 | | { |
393 | | m_bank_0xxx->set_base(m_ram->pointer()); |
394 | | m_bank_1xxx->set_base(m_ram->pointer() + 0x1000); |
395 | | } |
| 425 | m_bank_0xxx->set_entry(m_rom_mode); |
| 426 | m_bank_1xxx->set_entry(m_rom_mode); |
396 | 427 | return true; |
397 | 428 | } |
398 | 429 | else |
r249964 | r249965 | |
406 | 437 | if (value != m_bit_9) |
407 | 438 | { |
408 | 439 | m_bit_9 = value; |
409 | | m_bank_fxxx->set_base(m_ram->pointer() + (m_bit_9 ? 0x10000 : 0xF000)); |
| 440 | m_bank_fxxx->set_entry(m_bit_9); |
410 | 441 | return true; |
411 | 442 | } |
412 | 443 | else |
r249964 | r249965 | |
421 | 452 | m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF0); |
422 | 453 | else if (m_pia1->irq_a_state()) |
423 | 454 | m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF8); |
| 455 | else if (m_acia_irq_state) |
| 456 | m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xFC); |
424 | 457 | else |
425 | 458 | m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, CLEAR_LINE, 0xFE); |
426 | 459 | } |
| 460 | |
| 461 | void osborne1_state::update_acia_rxc_txc() |
| 462 | { |
| 463 | m_acia->write_rxc(m_acia_rxc_txc_state); |
| 464 | m_acia->write_txc(m_acia_rxc_txc_state); |
| 465 | attoseconds_t const dividend = (ATTOSECONDS_PER_SECOND / 100) * (m_acia_rxc_txc_state ? m_acia_rxc_txc_p_high : m_acia_rxc_txc_p_low); |
| 466 | attoseconds_t const divisor = (15974400 / 100) / m_acia_rxc_txc_div; |
| 467 | m_acia_rxc_txc_timer->adjust(attotime(0, dividend / divisor)); |
| 468 | } |