aboutsummaryrefslogtreecommitdiff
path: root/src/nio.c
blob: 9deae3c1abbad6647aed93cbc1920333d8d78b34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
 * N: I/O
 */

/* "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 */

#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
}

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
}

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();
}

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();

	return get_status();
}

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
}

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();
}

/* 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
}