1 /*
2 * h316_imp.h- BBN ARPAnet IMP/TIP Definitions
3 *
4 * vim: filetype=c:tabstop=4:ai:expandtab
5 * SPDX-License-Identifier: X11
6 * scspell-id: 50c5a696-f62f-11ec-99dc-80ee73e9b8e7
7 *
8 * ---------------------------------------------------------------------------
9 *
10 * Copyright (c) 2013 Robert Armstrong <bob@jfcl.com>
11 * Copyright (c) 2021-2022 The DPS8M Development Team
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining a
14 * copy of this software and associated documentation files (the "Software"),
15 * to deal in the Software without restriction, including without limitation
16 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 * and/or sell copies of the Software, and to permit persons to whom the
18 * Software is furnished to do so, subject to the following conditions:
19 *
20 * The above copyright notice and this permission notice shall be included in
21 * all copies or substantial portions of the Software.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 * ROBERT ARMSTRONG BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
27 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
28 * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 * SOFTWARE.
30 *
31 * Except as contained in this notice, the name of Robert Armstrong shall not
32 * be used in advertising or otherwise to promote the sale, use or other
33 * dealings in this Software without prior written authorization from Robert
34 * Armstrong.
35 *
36 * ---------------------------------------------------------------------------
37 */
38
39 #ifdef WITH_ABSI_DEV
40
41 // Common modem and host parameters ...
42 # define MI_NUM 5 // number of modem interfaces
43 # define HI_NUM 4 // number of host interfaces
44 # define MI_MAX_MSG 256 // longest possible modem message (words!)
45 # define HI_MAX_MSG 256 // longest possible host message (words!)
46 # define MI_RXPOLL 100 // RX polling delay for UDP messages
47 # define MI_TXBPS 56000UL // default TX speed (bits per second)
48 # define HI_POLL_DELAY 1000 // polling delay for messages
49
50 // Modem interface, line #1 ...
51 # define MI1 071 // IO address for modem interface #1
52 # define MI1_RX_DMC (DMC1-1+ 1) // DMC channel for modem 1 receive
53 # define MI1_TX_DMC (DMC1-1+ 6) // DMC channel for modem 1 transmit
54 # define INT_V_MI1RX (INT_V_EXTD+15) // modem 1 receive interrupt
55 # define INT_V_MI1TX (INT_V_EXTD+10) // modem 1 transmit interrupt
56
57 // Modem interface, line #2 ...
58 # define MI2 072 // IO address for modem interface #2
59 # define MI2_RX_DMC (DMC1-1+ 2) // DMC channel for modem 2 receive
60 # define MI2_TX_DMC (DMC1-1+ 7) // DMC channel for modem 2 transmit
61 # define INT_V_MI2RX (INT_V_EXTD+14) // modem 2 receive interrupt
62 # define INT_V_MI2TX (INT_V_EXTD+ 9) // modem 2 transmit interrupt
63
64 // Modem interface, line #3 ...
65 # define MI3 073 // IO address for modem interface #3
66 # define MI3_RX_DMC (DMC1-1+ 3) // DMC channel for modem 3 receive
67 # define MI3_TX_DMC (DMC1-1+ 8) // DMC channel for modem 3 transmit
68 # define INT_V_MI3RX (INT_V_EXTD+13) // modem 3 receive interrupt
69 # define INT_V_MI3TX (INT_V_EXTD+ 8) // modem 3 transmit interrupt
70
71 // Modem interface, line #4 ...
72 # define MI4 074 // IO address for modem interface #4
73 # define MI4_RX_DMC (DMC1-1+ 4) // DMC channel for modem 4 receive
74 # define MI4_TX_DMC (DMC1-1+ 9) // DMC channel for modem 4 transmit
75 # define INT_V_MI4RX (INT_V_EXTD+12) // modem 4 receive interrupt
76 # define INT_V_MI4TX (INT_V_EXTD+ 7) // modem 4 transmit interrupt
77
78 // Modem interface, line #5 ...
79 # define MI5 075 // IO address for modem interface #5
80 # define MI5_RX_DMC (DMC1-1+ 5) // DMC channel for modem 5 receive
81 # define MI5_TX_DMC (DMC1-1+10) // DMC channel for modem 5 transmit
82 # define INT_V_MI5RX (INT_V_EXTD+11) // modem 5 receive interrupt
83 # define INT_V_MI5TX (INT_V_EXTD+ 6) // modem 5 transmit interrupt
84
85 // Host interface, line #1 ...
86 # define HI1 070 // device address for host interface #1
87 # define HI1_RX_DMC (DMC1+13-1) // DMC channel for host 1 receive
88 # define HI1_TX_DMC (DMC1+11-1) // DMC channel for host 1 transmit
89 # define INT_V_HI1RX (INT_V_EXTD+ 3) // host 1 receive interrupt
90 # define INT_V_HI1TX (INT_V_EXTD+ 5) // host 1 transmit interrupt
91
92 // Host interface, line #2 ...
93 # define HI2 060 // device address for host interface #2
94 # define HI2_RX_DMC (DMC1-1+14) // DMC channel for host 2 receive
95 # define HI2_TX_DMC (DMC1-1+12) // DMC channel for host 2 transmit
96 # define INT_V_HI2RX (INT_V_EXTD+ 2) // host 2 receive interrupt
97 # define INT_V_HI2TX (INT_V_EXTD+ 4) // host 2 transmit interrupt
98
99 // Host interface, line #3 ...
100 # define HI3 051 // device address for host interface #3
101 # define HI3_RX_DMC (DMC1-1+16) // DMC channel for host 3 receive
102 # define HI3_TX_DMC (DMC1-1+15) // DMC channel for host 3 transmit
103 # define INT_V_HI3RX (INT_V_EXTD+ 6) // host 3 receive interrupt
104 # define INT_V_HI3TX (INT_V_EXTD+11) // host 3 transmit interrupt
105
106 // Host interface, line #4 ...
107 # define HI4 050 // device address for host interface #4
108 # define HI4_RX_DMC (DMC1-1+10) // DMC channel for host 4 receive
109 # define HI4_TX_DMC (DMC1-1+ 5) // DMC channel for host 4 transmit
110 # define INT_V_HI4RX (INT_V_EXTD+ 7) // host 4 receive interrupt
111 # define INT_V_HI4TX (INT_V_EXTD+12) // host 4 transmit interrupt
112
113 // IMP defaults ...
114 # define IMP 041 // IMP device IO address (41 & 42 actually!)
115 # define INT_V_TASK (INT_V_EXTD+ 0) // task switch interrupt number
116 # define IMP_STATION 1 // default station number
117
118 // RTC defaults ...
119 # define RTC 040 // real time clock IO address
120 # define INT_V_RTC (INT_V_EXTD+ 1) // RTC interrupt number
121 # define RTC_INTERVAL 20UL // default RTC interval (20us == 50kHz)
122 # define RTC_QUANTUM 32UL // default RTC quantum (32 ticks)
123
124 // WDT defaults ...
125 # define WDT 026 // watchdog timer IO address
126 # define WDT_VECTOR 000062 // WDT timeout vector
127 # define WDT_DELAY 0 // default WDT timeout (in milliseconds)
128
129 // Debugging flags ...
130 // In general, these bits are used as arguments for sim_debug(). Bits that
131 // begin with "IMP_DBG_xyz" are shared by more than one device (e.g. IMP_DBG_UDP)
132 // and must have unique bit assignments. Bits prefixed with a device name (e.g.
133 // "MI_DBG_xyz") apply to that device only.
134 # define IMP_DBG_WARN 0x0001 // all: print warnings
135 # define IMP_DBG_IOT 0x0002 // all: trace all program I/O instructions
136 # define IMP_DBG_UDP 0x0004 // all: trace UDP packets
137 # define MI_DBG_MSG 0x8000 // modem: decode and print all messages
138 # define WDT_DBG_LIGHTS 0x8000 // wdt: show status light changes
139
140 // Synonyms for DIB and UNIT fields ...
141 # define rxdmc chan // dib->rxdmc
142 # define txdmc chan2 // dib->txdmc
143 # define rxint inum // dib->rxint
144 # define txint inum2 // dib->txint
145
146 // Modem interface data block ....
147 // One of these is allocated to every modem interface to keep track of the
148 // current state, COM port, UDP connection , etc...
149 struct _MIDB {
150 // Receiver data ...
151 bool rxpending; // TRUE if a read is pending on this line
152 bool rxerror; // TRUE if any modem error detected
153 uint32_t rxtotal; // total number of H316 words received
154 // Transmitter data ...
155 uint32_t txtotal; // total number of H316 words transmitted
156 uint32_t txdelay; // RTC ticks until TX done interrupt
157 // Other data ...
158 bool lloop; // line loop back enabled
159 bool iloop; // interface loop back enabled
160 int32_t link; // h316_udp link number
161 uint32_t bps; // simulated line speed or COM port baud rate
162 };
163 typedef struct _MIDB MIDB;
164
165 // Host interface data block ...
166 // One of these is allocated to every host interface ...
167 struct _HIDB {
168 // Receiver (HOST -> IMP) data ...
169 uint32_t rxtotal; // total host messages received
170 // Transmitter (IMP -> HOST) data ...
171 uint32_t txtotal; // total host messages sent
172 // Other data ...
173 bool lloop; // local loop back enabled
174 bool enabled; // TRUE if the host is enabled
175 bool error; // TRUE for any host error
176 bool ready; // TRUE if the host is ready
177 bool full; // TRUE if the host buffer is full
178 bool eom; // TRUE when end of message is reached
179 };
180 typedef struct _HIDB HIDB;
181
182 // I can't believe Bob managed to live without these, but I can't!
183 # ifndef LOBYTE // these are in winsock.h too!
184 # define LOBYTE(x) ((uint8_t) ( (x) & 0xFF))
185 # define HIBYTE(x) ((uint8_t) (((x) >> 8) & 0xFF))
186 # define MKWORD(h,l) ((uint16_t) ( (((h)&0xFF) << 8) | ((l)&0xFF) ))
187 # define LOWORD(x) ((uint16_t) ( (x) & 0xFFFF))
188 # define HIWORD(x) ((uint16_t) (((x) >> 16) & 0xFFFF))
189 # define MKLONG(h,l) ((uint32_t) ( (((h)&0xFFFF) << 16) | ((l)&0xFFFF) ))
190 # endif
191
192 #endif /* ifdef WITH_ABSI_DEV */