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