diff options
| author | John Wilbert M. Villamor <lameguy64@gmail.com> | 2019-11-22 09:11:12 +0800 |
|---|---|---|
| committer | John Wilbert M. Villamor <lameguy64@gmail.com> | 2019-11-22 09:11:12 +0800 |
| commit | ea46d05aed0343c20d8fdfaa0e67d54d51e8e2a0 (patch) | |
| tree | 43e2a53f4e5f7f55b075cfc9d6dc7a652a7b0837 /libpsn00b/psxsio | |
| parent | d80d92e13330d527ddb94420b19f9e21bf0e74eb (diff) | |
| download | psn00bsdk-ea46d05aed0343c20d8fdfaa0e67d54d51e8e2a0.tar.gz | |
Added long awaited CD-ROM library and loads of fixes, see changelog for details
Diffstat (limited to 'libpsn00b/psxsio')
| -rw-r--r-- | libpsn00b/psxsio/siocons.c | 76 |
1 files changed, 70 insertions, 6 deletions
diff --git a/libpsn00b/psxsio/siocons.c b/libpsn00b/psxsio/siocons.c index cd99d68..76bf8be 100644 --- a/libpsn00b/psxsio/siocons.c +++ b/libpsn00b/psxsio/siocons.c @@ -1,9 +1,25 @@ #include <stdio.h> +#include <string.h> #include <psxapi.h> #include <psxgpu.h> #include <psxsio.h> +#define SIO_BUFF_LEN 32 + +static volatile int _sio_key_pending; + +static volatile int _sio_buff_rpos; +static volatile int _sio_buff_wpos; +static volatile char _sio_buff[SIO_BUFF_LEN]; + static void _sio_init() { + + _sio_key_pending = 0; + + memset((void*)_sio_buff, 0, SIO_BUFF_LEN); + _sio_buff_rpos = 0; + _sio_buff_wpos = 0; + } static int _sio_open(FCB *fcb, const char* file, int mode) { @@ -29,9 +45,25 @@ static int _sio_inout(FCB *fcb, int cmd) { } else if (cmd == 1) { // Read - for(i=0; i<fcb->trns_len; i++) { + /*for(i=0; i<fcb->trns_len; i++) { while(!(_sio_control(0, 0, 0) & SR_RXRDY)); ((char*)fcb->trns_addr)[i] = _sio_control(0, 4, 0); + }*/ + + + + for(i=0; i<fcb->trns_len; i++) { + + while( _sio_key_pending == 0 ); + + ((char*)fcb->trns_addr)[i] = _sio_buff[_sio_buff_rpos]; + _sio_key_pending--; + _sio_buff_rpos++; + if( _sio_buff_rpos >= SIO_BUFF_LEN ) + { + _sio_buff_rpos = 0; + } + } return fcb->trns_len; @@ -48,6 +80,29 @@ static int _sio_close(int h) { } +static void _sio_tty_cb(void) +{ + _sio_key_pending++; + + // Get received byte + if( _sio_key_pending < SIO_BUFF_LEN ) + { + _sio_buff[_sio_buff_wpos] = _sio_control(0, 4, 0); + _sio_buff_wpos++; + if( _sio_buff_wpos >= SIO_BUFF_LEN ) + { + _sio_buff_wpos = 0; + } + } + else + { + _sio_control(0, 4, 0); + } + + // Acknowledge SIO IRQ + _sio_control(2, 1, 0); +} + static DCB _sio_dcb = { "tty", 0x3, @@ -74,15 +129,12 @@ static DCB _sio_dcb = { volatile void (*_sio_callback)(void) = NULL; -extern void _sio_irq_handler(void); - - void AddSIO(int baud) { _sio_control(2, 0, 0); _sio_control(1, 2, MR_SB_01|MR_CHLEN_8|0x02); _sio_control(1, 3, baud); - _sio_control(1, 1, CR_RXEN|CR_TXEN); + _sio_control(1, 1, CR_RXEN|CR_TXEN|CR_RXIEN); close(0); close(1); @@ -90,6 +142,8 @@ void AddSIO(int baud) { DelDev(_sio_dcb.name); AddDev(&_sio_dcb); + Sio1Callback(_sio_tty_cb); + open(_sio_dcb.name, 2); open(_sio_dcb.name, 1); @@ -97,12 +151,17 @@ void AddSIO(int baud) { void DelSIO(void) { + Sio1Callback(NULL); + // Reset serial interface _sio_control(2, 0, 0); // Remove TTY device DelDev(_sio_dcb.name); + // Add dummy TTY device + AddDummyTty(); + } void WaitSIO(void) { @@ -134,4 +193,9 @@ void *Sio1Callback(void (*func)()) { return old_isr; -}
\ No newline at end of file +} + +int kbhit() +{ + return(_sio_key_pending>0); +} |
