1 /**
2 * cromemco-d+7a.c
3 *
4 * Emulation of the Cromemco D+7A I/O
5 *
6 * Copyright (C) 2020 by David McNaughton
7 *
8 * History:
9 * 14-JAN-20 1.0 Initial Release
10 */
11 #include <stdlib.h>
12 #include <stdio.h>
13 #include "sim.h"
14 #include "simglb.h"
15
16 #ifdef HAS_NETSERVER
17 #include "netsrv.h"
18 #endif
19 // #define LOG_LOCAL_LEVEL LOG_DEBUG
20 #include "log.h"
21
22 static const char *TAG = "D+7AIO";
23
24 #define PORT_COUNT 8
25
26 BYTE inPort[PORT_COUNT];
27 BYTE outPort[PORT_COUNT];
28
cromemco_d7a_callback(BYTE * data)29 void cromemco_d7a_callback(BYTE *data) {
30
31 int i;
32 inPort[0] = *data++;
33 for (i=1; i < PORT_COUNT; i++) {
34 inPort[i] = (*data++) - 128;
35 }
36 }
37
cromemco_d7a_init(void)38 void cromemco_d7a_init(void) {
39
40 inPort[0] = 0xFF;
41
42 #ifdef HAS_NETSERVER
43 net_device_service(DEV_D7AIO, cromemco_d7a_callback);
44 #endif
45
46 }
47
cromemco_d7a_out(BYTE port,BYTE data)48 void cromemco_d7a_out(BYTE port, BYTE data)
49 {
50 outPort[port] = data;
51
52 LOGD(TAG, "Output %d on port %d", data, port);
53
54 #ifdef HAS_NETSERVER
55 // if (net_device_alive(DEV_D7AIO)) {
56 net_device_send(DEV_D7AIO, (char *)&data, 1);
57 // }
58 #endif
59 }
60
cromemco_d7a_D_out(BYTE data)61 void cromemco_d7a_D_out(BYTE data) { cromemco_d7a_out(0, data); }
cromemco_d7a_A1_out(BYTE data)62 void cromemco_d7a_A1_out(BYTE data) { cromemco_d7a_out(1, data); }
cromemco_d7a_A2_out(BYTE data)63 void cromemco_d7a_A2_out(BYTE data) { cromemco_d7a_out(2, data); }
cromemco_d7a_A3_out(BYTE data)64 void cromemco_d7a_A3_out(BYTE data) { cromemco_d7a_out(3, data); }
cromemco_d7a_A4_out(BYTE data)65 void cromemco_d7a_A4_out(BYTE data) { cromemco_d7a_out(4, data); }
cromemco_d7a_A5_out(BYTE data)66 void cromemco_d7a_A5_out(BYTE data) { cromemco_d7a_out(5, data); }
cromemco_d7a_A6_out(BYTE data)67 void cromemco_d7a_A6_out(BYTE data) { cromemco_d7a_out(6, data); }
cromemco_d7a_A7_out(BYTE data)68 void cromemco_d7a_A7_out(BYTE data) { cromemco_d7a_out(7, data); }
69
cromemco_d7a_in(BYTE port)70 BYTE cromemco_d7a_in(BYTE port)
71 {
72 return inPort[port];
73 }
74
cromemco_d7a_D_in(void)75 BYTE cromemco_d7a_D_in(void) { return cromemco_d7a_in(0); };
cromemco_d7a_A1_in(void)76 BYTE cromemco_d7a_A1_in(void) { return cromemco_d7a_in(1); };
cromemco_d7a_A2_in(void)77 BYTE cromemco_d7a_A2_in(void) { return cromemco_d7a_in(2); };
cromemco_d7a_A3_in(void)78 BYTE cromemco_d7a_A3_in(void) { return cromemco_d7a_in(3); };
cromemco_d7a_A4_in(void)79 BYTE cromemco_d7a_A4_in(void) { return cromemco_d7a_in(4); };
cromemco_d7a_A5_in(void)80 BYTE cromemco_d7a_A5_in(void) { return cromemco_d7a_in(5); };
cromemco_d7a_A6_in(void)81 BYTE cromemco_d7a_A6_in(void) { return cromemco_d7a_in(6); };
cromemco_d7a_A7_in(void)82 BYTE cromemco_d7a_A7_in(void) { return cromemco_d7a_in(7); };
83