From: Toni Wilen Date: Sun, 26 May 2024 06:20:06 +0000 (+0300) Subject: Serial port undocumented OVRUN behavior emulated. Fast CPU mode + loopback serial... X-Git-Tag: 5300~2 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=f3502277816760ad8fc0e36ca21dab0c485ca26f;p=francis%2Fwinuae.git Serial port undocumented OVRUN behavior emulated. Fast CPU mode + loopback serial port mode fix. --- diff --git a/custom.cpp b/custom.cpp index 413de225..8aff5baf 100644 --- a/custom.cpp +++ b/custom.cpp @@ -8917,8 +8917,8 @@ static void rethink_intreq(void) static void intreq_checks(uae_u16 oldreq, uae_u16 newreq) { - if ((oldreq & 0x0800) && !(newreq & 0x0800)) { - serial_rbf_clear(); + if ((oldreq & 0x0800) != (newreq & 0x0800)) { + serial_rbf_change((newreq & 0x0800) ? 1 : 0); } } @@ -8927,17 +8927,12 @@ static void event_doint_delay_do_ext(uae_u32 v) uae_u16 old = intreq2; setclr(&intreq, (1 << v) | 0x8000); setclr(&intreq2, (1 << v) | 0x8000); - intreq_checks(old, intreq2); doint(); } static void event_send_interrupt_do_ext(uae_u32 v) { - //uae_u16 old = intreq; - //setclr(&intreq, (1 << v) | 0x8000); - //intreq_checks(old); - event2_newevent_xx(-1, 1 * CYCLE_UNIT, v, event_doint_delay_do_ext); } @@ -8958,7 +8953,6 @@ static void event_doint_delay_do_intreq(uae_u32 v) { uae_u16 old = intreq2; setclr(&intreq2, v); - intreq_checks(old, intreq2); doint(); } @@ -9027,6 +9021,7 @@ bool INTREQ_0(uae_u16 v) if (old != intreq) { doint_delay_intreq(v); + intreq_checks(old, intreq); } return true; } diff --git a/include/serial.h b/include/serial.h index a9f80c67..a0e974b0 100644 --- a/include/serial.h +++ b/include/serial.h @@ -21,10 +21,10 @@ extern uae_u16 SERDATR (void); extern void SERPER (uae_u16 w); extern void SERDAT (uae_u16 w); -extern uae_u8 serial_writestatus (uae_u8, uae_u8); -extern uae_u8 serial_readstatus (uae_u8, uae_u8); -extern void serial_uartbreak (int); -extern void serial_rbf_clear (void); +extern uae_u8 serial_writestatus(uae_u8, uae_u8); +extern uae_u8 serial_readstatus(uae_u8, uae_u8); +extern void serial_uartbreak(int); +extern void serial_rbf_change(bool); extern uae_u16 serdat; extern int doreadser, serstat; diff --git a/od-win32/serial_win32.cpp b/od-win32/serial_win32.cpp index e47e4ddc..df90a377 100644 --- a/od-win32/serial_win32.cpp +++ b/od-win32/serial_win32.cpp @@ -798,6 +798,13 @@ static void serdatcopy(void) } event2_newevent_x_replace(per, 0, sersend_ce); + + } else { + + if (serloop_enabled) { + sersend_serloop(0); + } + } checksend(); @@ -1010,9 +1017,9 @@ void SERDAT(uae_u16 w) } } -void serial_rbf_clear(void) +void serial_rbf_change(bool set) { - ovrun = 0; + ovrun = set; } void serial_dtr_on(void)