diff options
Diffstat (limited to 'src/nio.c')
| -rw-r--r-- | src/nio.c | 265 |
1 files changed, 87 insertions, 178 deletions
@@ -2,201 +2,110 @@ * N: I/O */ -#include "nio.h" -#include "sio.h" +/* "stripped down" version that harcodes some parameters! Don't + use this as example code for writing your own fujinet app! */ + #include <atari.h> #include <stddef.h> +#include "nio.h" +#include "sio.h" +#include "config.h" #define TIMEOUT 0x1f /* approx 30 seconds */ -unsigned char nunit(char* devicespec) -{ - unsigned char unit=1; - - // Set unit to 1 unless explicitly specified. - if (devicespec[1]==':') - unit=1; - else if (devicespec[2]==':') - unit=devicespec[1]-0x30; // convert from alpha to integer. - else - unit=1; - - return unit; +#define UNIT 1 /* only support one FujiNet connection! */ + +/* 0 = no translation (used to use 3, CRLF) */ +#define TRANS 0 + +static char get_status(void) { + if(OS.dcb.dstats != SUCCESS) { + // something went wrong + // do we need to return extended status? + if(OS.dcb.dstats == DERROR) { + nstatus(); + return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. + } + } + return OS.dcb.dstats; // Return SIO error or success } -unsigned char nopen(char* devicespec, unsigned char trans) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; // Fuji Device Identifier - OS.dcb.dunit = unit; // Unit number integer 1 through 4 - OS.dcb.dcomnd = 'O'; // Open - OS.dcb.dstats = DWRITE; // sending to to SIO device - OS.dcb.dbuf = devicespec; // eg: N:TCP// - OS.dcb.dtimlo = TIMEOUT; // approximately 30 second timeout - OS.dcb.dbyt = 256; // max size of our device spec - OS.dcb.daux1 = OUPDATE; // Read and write - OS.dcb.daux2 = trans; // CR/LF translation - siov(); - - if (OS.dcb.dstats!=SUCCESS) - { - // something went wrong - // do we need to return extended status? - if (OS.dcb.dstats==DERROR) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. - } - } - return OS.dcb.dstats; // Return SIO error or success +static void set_defaults(void) { + OS.dcb.ddevic = DFUJI; // Fuji Device Identifier + OS.dcb.dunit = UNIT; // Unit number integer 1 through 4 + OS.dcb.dtimlo = TIMEOUT; // approximately 30 second timeout } -unsigned char nclose(char* devicespec) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; - OS.dcb.dunit = unit; - OS.dcb.dcomnd = 'C'; // Close - OS.dcb.dstats = 0x00; - OS.dcb.dbuf = NULL; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = 0; - OS.dcb.daux = 0; - siov(); - - if (OS.dcb.dstats!=SUCCESS) - { - // something went wrong - // do we need to return extended status? - if (OS.dcb.dstats==DERROR) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. - } - } - return OS.dcb.dstats; // Return SIO error or success. +char nopen(void) { + set_defaults(); + OS.dcb.dcomnd = 'O'; // Open + OS.dcb.dstats = DWRITE; // sending to to SIO device + OS.dcb.dbuf = conf->url; // eg: N:TCP// + OS.dcb.dbyt = 256; // max size of our device spec + OS.dcb.daux1 = OUPDATE; // Read and write + OS.dcb.daux2 = TRANS; // CR/LF translation + siov(); + + return get_status(); } -unsigned char nstatus(char* devicespec) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; - OS.dcb.dunit = unit; - OS.dcb.dcomnd = 'S'; // status - OS.dcb.dstats = DREAD; - OS.dcb.dbuf = OS.dvstat; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = sizeof(OS.dvstat); - OS.dcb.daux = 0; - siov(); - - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status -} +char nclose(void) { + set_defaults(); + OS.dcb.dcomnd = 'C'; // Close + OS.dcb.dstats = 0x00; + OS.dcb.dbuf = NULL; + OS.dcb.dbyt = 0; + OS.dcb.daux = 0; + siov(); -unsigned char nread(char* devicespec, unsigned char* buf, unsigned short len) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; - OS.dcb.dunit = unit; - OS.dcb.dcomnd = 'R'; // read - OS.dcb.dstats = DREAD; - OS.dcb.dbuf = buf; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = OS.dcb.daux = len; // Set the buffer size AND daux with length - siov(); - - if (OS.dcb.dstats!=SUCCESS) - { - // something went wrong - // do we need to return extended status? - if (OS.dcb.dstats==DERROR) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. - } - } - return OS.dcb.dstats; // Return SIO error or success. + return get_status(); } -unsigned char nwrite(char* devicespec, unsigned char* buf, unsigned short len) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; - OS.dcb.dunit = unit; - OS.dcb.dcomnd = 'W'; // write - OS.dcb.dstats = DWRITE; - OS.dcb.dbuf = buf; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = OS.dcb.daux = len; - siov(); - - if (OS.dcb.dstats!=SUCCESS) - { - // something went wrong - // do we need to return extended status? - if (OS.dcb.dstats==DERROR) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. - } - } - return OS.dcb.dstats; // Return SIO error or success. +char nstatus(void) { + set_defaults(); + OS.dcb.dcomnd = 'S'; // status + OS.dcb.dstats = DREAD; + OS.dcb.dbuf = OS.dvstat; + OS.dcb.dbyt = sizeof(OS.dvstat); + OS.dcb.daux = 0; + siov(); + + return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status } -/* https://fujinet.online/wiki/?p=SIO-Command-%24FF-Reset-FujiNet */ -unsigned char nreset(void) { - OS.dcb.ddevic = 0x70; - OS.dcb.dunit = 1; - OS.dcb.dcomnd = 0xff; /* reset */ - OS.dcb.dstats = DWRITE; - OS.dcb.dbuf = 0; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = 0; - OS.dcb.daux = 0; - siov(); - - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status +char nread(char *buf, unsigned short len) { + set_defaults(); + OS.dcb.dcomnd = 'R'; // read + OS.dcb.dstats = DREAD; + OS.dcb.dbuf = buf; + OS.dcb.dbyt = OS.dcb.daux = len; // Set the buffer size AND daux with length + siov(); + + return get_status(); } +char nwrite(char *buf, unsigned short len) { + set_defaults(); + OS.dcb.dcomnd = 'W'; // write + OS.dcb.dstats = DWRITE; + OS.dcb.dbuf = buf; + OS.dcb.dbyt = OS.dcb.daux = len; + siov(); + + return get_status(); +} -/* IRC doesn't need this */ -#if 0 -unsigned char nlogin(char* devicespec, char *login, char *password) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic=0x71; - OS.dcb.dunit=unit; - OS.dcb.dcomnd=0xFD; - OS.dcb.dstats=0x80; - OS.dcb.dbuf=login; - OS.dcb.dtimlo=0x1f; - OS.dcb.dbyt=256; - OS.dcb.daux=0; - siov(); - - if (OS.dcb.dstats!=1) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return ext err - } - - OS.dcb.dcomnd=0xFE; - OS.dcb.dstats=0x80; - OS.dcb.dbuf=password; - siov(); - - if (OS.dcb.dstats!=1) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return ext err - } - - return OS.dcb.dstats; +/* https://fujinet.online/wiki/?p=SIO-Command-%24FF-Reset-FujiNet */ +char nreset(void) { + set_defaults(); + OS.dcb.ddevic = 0x70; + OS.dcb.dcomnd = 0xff; /* reset */ + OS.dcb.dstats = DWRITE; + OS.dcb.dbuf = 0; + OS.dcb.dbyt = 0; + OS.dcb.daux = 0; + siov(); + + return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status } -#endif + |
