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