]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Serial port undocumented OVRUN behavior emulated. Fast CPU mode + loopback serial...
authorToni Wilen <twilen@winuae.net>
Sun, 26 May 2024 06:20:06 +0000 (09:20 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 26 May 2024 06:20:06 +0000 (09:20 +0300)
custom.cpp
include/serial.h
od-win32/serial_win32.cpp

index 413de22515b8827fb593c043150535a6dd02ab65..8aff5baf486c09a1c2651404d3aac9bdc36062bd 100644 (file)
@@ -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;
 }
index a9f80c6752b7f769bd99dc3c7f1c0f0b96134e4d..a0e974b032f67cdb42ceb5bdceec57ff0de034fc 100644 (file)
@@ -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;
index e47e4ddc061c1cd8d827e371b9966ad55e57d580..df90a377d848fe6869f324cfee17c991b92b1985 100644 (file)
@@ -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)