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