|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Serial Line Emulation
5: *
6: * (c) 1996 Stefan Reinauer
7: */
8:
9: #include "sysconfig.h"
10: #include "sysdeps.h"
11:
12: #include "config.h"
13: #include "options.h"
14: #include "memory.h"
15: #include "custom.h"
16: #include "newcpu.h"
17:
18: void serial_init(void);
19: void serial_exit(void);
20:
21: UWORD SERDATR(void);
22: void SERPER(UWORD w);
23: void SERDAT(UWORD w);
24:
25: int sersend;
26: int serrecv;
27: int sd = -1;
28:
29: UWORD serdat;
30:
31: void SERPER(UWORD w)
32: {
33: if (!use_serial)
34: return;
35:
36: #ifndef __DOS__
37: if (w&0x8000) fprintf (stdout, "SERPER: 9 Bit Transmission not implemented\n");
38: fprintf (stdout, "serial port baudrate set to ");
39: switch (w & 0x7fff)
40: {
41: case 0x2e9b: fprintf (stdout, " 300\n"); return;
42: case 0x0ba6: fprintf (stdout, " 1200\n"); return;
43: case 0x02e9: fprintf (stdout, " 4800\n"); return;
44: case 0x0174: fprintf (stdout, " 9600\n"); return;
45: case 0x00b9: fprintf (stdout, "19200\n"); return;
46: case 0x005c: fprintf (stdout, "38400\n"); return;
47: default:
48: fprintf(stdout,"%d (approx.)\n",
49: (unsigned int)(3579546.471/(double)((w&0x7fff)+1))); return;
50: }
51: #else
52: if (w&0x8000) fprintf (stderr, "SERPER: 9 Bit Transmission not implemented\n");
53: fprintf (stderr, "serial port baudrate set to ");
54: switch (w & 0x7fff)
55: {
56: case 0x2e9b: fprintf (stderr, " 300\n"); return;
57: case 0x0ba6: fprintf (stderr, " 1200\n"); return;
58: case 0x02e9: fprintf (stderr, " 4800\n"); return;
59: case 0x0174: fprintf (stderr, " 9600\n"); return;
60: case 0x00b9: fprintf (stderr, "19200\n"); return;
61: case 0x005c: fprintf (stderr, "38400\n"); return;
62: default:
63: fprintf(stderr,"%d (approx.)\n",
64: (unsigned int)(3579546.471/(double)((w&0x7fff)+1))); return;
65: }
66: #endif
67: }
68:
69: void SERDAT(UWORD w)
70: {
71: char z;
72:
73: if (!use_serial)
74: return;
75:
76: fprintf(stderr,"SERDAT: wrote 0x%04x\n",w);
77: z=(char)(w&0xff);
78: if (sd>0) {
79: write (sd,&z,1);
80: }
81: return;
82: }
83:
84: UWORD SERDATR(void)
85: {
86: char z;
87:
88: if (!use_serial)
89: return;
90:
91: if ((read (sd, &z,1))==1) {
92: serdat=0x6100;
93: intreq|=0x0800;
94: serdat+=(int)z;
95: #ifndef __DOS__
96: fprintf (stdout,"SERDATR: received 0x%02x\n",(int)z);
97: #else
98: fprintf (stderr,"SERDATR: received 0x%02x\n",(int)z);
99: #endif
100: }
101: return serdat;
102: }
103:
104: void serial_init(void)
105: {
106: if (!use_serial)
107: return;
108:
109: #ifndef __DOS__
110: if ((sd=open(sername,O_RDWR|O_NONBLOCK))<0)
111: fprintf (stderr,"Error: Could not open Device %s\n",sername);
112: #else
113: if ((sd=open(sername,O_RDWR|O_NONBLOCK|O_BINARY))<0)
114: fprintf (stderr,"Error: Could not open Device %s\n",sername);
115: #endif
116: serdat=0x2000;
117: return;
118: }
119:
120: void serial_exit(void)
121: {
122: if (sd >= 0)
123: close(sd);
124: return;
125: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.