@@ -56,23 +56,24 @@ r65c52_device::r65c52_device(const machine_config &mconfig, const char *tag, dev
56
56
}
57
57
58
58
const int r65c52_device::internal_divider[16 ] =
59
- {
60
- 4608 ,
61
- 2096 ,
62
- 1713 ,
63
- 1536 ,
64
- 768 ,
65
- 384 ,
66
- 192 ,
67
- 128 ,
68
- 96 ,
69
- 64 ,
70
- 48 ,
71
- 32 ,
72
- 24 ,
73
- 12 ,
74
- 6 ,
75
- 1 };
59
+ {
60
+ 4608 ,
61
+ 2096 ,
62
+ 1713 ,
63
+ 1536 ,
64
+ 768 ,
65
+ 384 ,
66
+ 192 ,
67
+ 128 ,
68
+ 96 ,
69
+ 64 ,
70
+ 48 ,
71
+ 32 ,
72
+ 24 ,
73
+ 12 ,
74
+ 6 ,
75
+ 1
76
+ };
76
77
77
78
void r65c52_device::device_add_mconfig (machine_config &config)
78
79
{
@@ -258,19 +259,8 @@ void r65c52_device::output_dtr(int idx, int dtr)
258
259
259
260
void r65c52_device::update_irq (int idx)
260
261
{
261
- bool irq = false ;
262
262
LOG (" R65C52: %x IER %x ISR %x\n " , idx + 1 , m_ier[idx], m_isr[idx]);
263
- for (int i = 0 ; i < 7 ; i++)
264
- {
265
- int ier_bit = BIT (m_ier[idx],i);
266
- int isr_bit = BIT (m_isr[idx],i);
267
-
268
- if ((ier_bit == isr_bit) && (ier_bit ==1 ))
269
- {
270
- irq = true ;
271
- }
272
- }
273
- output_irq (idx, irq);
263
+ output_irq (idx, (m_ier[idx] & m_isr[idx] & 0x7f ) ? 1 : 0 );
274
264
}
275
265
276
266
void r65c52_device::update_divider (int idx)
@@ -310,21 +300,27 @@ void r65c52_device::update_divider(int idx)
310
300
311
301
u8 r65c52_device::read_rdr (int idx)
312
302
{
313
- m_status[idx] &= ~(SR_BRK | SR_FRAMING_ERROR);
314
- m_isr[idx] &= ~(IRQ_PAR | IRQ_FOB | IRQ_RDRF);
315
- m_rdrf[idx] = false ;
316
- m_parity_err[idx] = false ;
317
- m_overrun[idx] = false ;
318
- update_irq (idx);
319
- LOG (" R65C52: %x RDR %x \n " , idx + 1 , m_rdr[idx]);
303
+ if (!machine ().side_effects_disabled ())
304
+ {
305
+ m_status[idx] &= ~(SR_BRK | SR_FRAMING_ERROR);
306
+ m_isr[idx] &= ~(IRQ_PAR | IRQ_FOB | IRQ_RDRF);
307
+ m_rdrf[idx] = false ;
308
+ m_parity_err[idx] = false ;
309
+ m_overrun[idx] = false ;
310
+ LOG (" R65C52: %x RDR %x \n " , idx + 1 , m_rdr[idx]);
311
+ update_irq (idx);
312
+ }
320
313
return m_rdr[idx];
321
314
}
322
315
323
316
u8 r65c52_device::read_status (int idx)
324
317
{
325
- LOG (" R65C52: %x STATUS %x \n " , idx + 1 , m_status[idx]);
326
- m_dtr[idx] = false ;
327
- m_rts[idx] = false ;
318
+ if (!machine ().side_effects_disabled ())
319
+ {
320
+ LOG (" R65C52: %x STATUS %x \n " , idx + 1 , m_status[idx]);
321
+ m_dtr[idx] = false ;
322
+ m_rts[idx] = false ;
323
+ }
328
324
return m_status[idx];
329
325
}
330
326
@@ -340,14 +336,17 @@ void r65c52_device::write_ier(int idx, u8 data)
340
336
}
341
337
342
338
LOG (" R65C52: %x IER %x \n " , idx + 1 , m_ier[idx]);
339
+ update_irq (idx);
343
340
}
344
341
345
342
void r65c52_device::write_tdr (int idx, u8 data)
346
343
{
347
344
m_tdr[idx] = data;
348
345
m_tdre[idx] = false ;
349
346
m_isr[idx] &= ~IRQ_TDRE;
347
+
350
348
LOG (" R65C52: %x TDR %x \n " , idx + 1 , m_tdr[idx]);
349
+ update_irq (idx);
351
350
}
352
351
353
352
void r65c52_device::write_control (int idx, u8 data)
@@ -416,15 +415,14 @@ void r65c52_device::write_compare(int idx, u8 data)
416
415
417
416
u8 r65c52_device::read_isr (int idx)
418
417
{
418
+ u8 isr = m_isr[idx];
419
419
420
420
if (m_status[idx] & SR_BRK || m_status[idx] & SR_FRAMING_ERROR || m_overrun[idx])
421
421
{
422
- m_isr[idx] |= IRQ_FOB;
422
+ isr |= IRQ_FOB;
423
423
}
424
424
425
- u8 isr = m_isr[idx];
426
-
427
- if (isr != 0 )
425
+ if ((isr & 0x7f ) != 0 )
428
426
{
429
427
isr |= 0x80 ;
430
428
}
@@ -440,9 +438,14 @@ u8 r65c52_device::read_isr(int idx)
440
438
isr &= ~0x80 ;
441
439
}
442
440
443
- m_isr[idx] &= ~(IRQ_CTS | IRQ_DCD | IRQ_DSR | IRQ_FOB);
441
+ isr &= ~(IRQ_CTS | IRQ_DCD | IRQ_DSR | IRQ_FOB);
444
442
445
- LOG (" R65C52: %x ISR %x \n " , idx + 1 , m_isr[idx]);
443
+ if (!machine ().side_effects_disabled ())
444
+ {
445
+ m_isr[idx] = isr;
446
+ LOG (" R65C52: %x ISR %x \n " , idx + 1 , m_isr[idx]);
447
+ update_irq (idx);
448
+ }
446
449
447
450
return isr;
448
451
}
0 commit comments