1+ /*
2+
3+ MIT License
4+
5+ Copyright (c) 2020 PCSX-Redux authors
6+
7+ Permission is hereby granted, free of charge, to any person obtaining a copy
8+ of this software and associated documentation files (the "Software"), to deal
9+ in the Software without restriction, including without limitation the rights
10+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11+ copies of the Software, and to permit persons to whom the Software is
12+ furnished to do so, subject to the following conditions:
13+
14+ The above copyright notice and this permission notice shall be included in all
15+ copies or substantial portions of the Software.
16+
17+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23+ SOFTWARE.
24+
25+ */
26+
27+ #pragma once
28+
29+ #include <stdint.h>
30+ #include "common/hardware/irq.h"
31+
32+ struct SIOPort {
33+ uint8_t fifo ;
34+ uint8_t preview [3 ];
35+ uint16_t stat ;
36+ uint16_t padding ;
37+ uint16_t mode ;
38+ uint16_t ctrl ;
39+ uint16_t reserved ;
40+ uint16_t baudRate ;
41+ };
42+
43+ #define SIOS ((volatile struct SIOPort *)0x1f801040)
44+
45+ enum {
46+ SIO_CTRL_TXEN = (1 << 0 ), // Transmit Enable
47+ SIO_CTRL_DTR = (1 << 1 ), // Data Terminal Ready, aka Select (output)
48+ SIO_CTRL_RXE = (1 << 2 ), // Receive Enable
49+ SIO_CTRL_SBRK = (1 << 3 ), // Send Break character
50+ SIO_CTRL_ERRRES = (1 << 4 ), // Error Reset
51+ SIO_CTRL_RTS = (1 << 5 ), // Request to Send (output)
52+ SIO_CTRL_IR = (1 << 6 ), // Internal Reset, resets most SIO registers
53+ SIO_CTRL_RXIRQMODE = (1 << 8 ), // Receive IRQ Mode (0..3 = IRQ when RX FIFO contains 1,2,4,8 bytes)
54+ SIO_CTRL_TXIRQEN = (1 << 10 ), // Transmit IRQ Enable
55+ SIO_CTRL_RXIRQEN = (1 << 11 ), // Receive IRQ Enable
56+ SIO_CTRL_ACKIRQEN = (1 << 12 ), // Acknowledge IRQ Enable
57+ SIO_CTRL_PORTSEL = (1 << 13 ), // Port Select
58+ };
59+
60+ enum {
61+ SIO_STAT_TXRDY = (1 << 0 ), // TX buffer is empty
62+ SIO_STAT_RXRDY = (1 << 1 ), // RX buffer has data
63+ SIO_STAT_TXEMPTY = (1 << 2 ), // No data in TX buffer
64+ SIO_STAT_PE = (1 << 3 ), // Parity Error
65+ SIO_STAT_OE = (1 << 4 ), // Overrun Error
66+ SIO_STAT_FE = (1 << 5 ), // Framing Error
67+ SIO_STAT_SYNDET = (1 << 6 ), // Sync Detect
68+ SIO_STAT_ACK = (1 << 7 ), // ACK signal level (input)
69+ SIO_STAT_CTS = (1 << 8 ), // Clear to Send (output), unused on SIO0
70+ SIO_STAT_IRQ = (1 << 9 ), // Interrupt Request
71+ };
72+
73+ static inline uint8_t __attribute__((always_inline )) exchangeByte (uint8_t b ) {
74+ uint8_t ret = SIOS [0 ].fifo ; // may throw away
75+ SIOS [0 ].fifo = b ;
76+ SIOS [0 ].ctrl |= SIO_CTRL_ERRRES ;
77+ IREG = ~IRQ_CONTROLLER ;
78+ return ret ;
79+ }
0 commit comments