blob: 78e37a66a650b4ce97d21effd7e77c78f4898192 [file] [log] [blame] [raw]
/* h316_imp.h- BBN ARPAnet IMP/TIP Definitions
Copyright (c) 2013, Robert Armstrong, bob@jfcl.com
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
ROBERT ARMSTRONG BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Robert Armstrong shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Robert Armstrong.
21-May-13 RLA New file.
*/
#ifdef VM_IMPTIP
#ifndef H316_IMP_H_
#define H316_IMP_H_ 0
#include "sim_defs.h"
// Common modem and host parameters ...
#define MI_NUM 5 // number of modem interfaces
#define HI_NUM 4 // number of host interfaces
#define MI_MAX_MSG 256 // longest possible modem message (words!)
#define HI_MAX_MSG 256 // longest possible host message (words!)
#define MI_RXPOLL 100 // RX polling delay for UDP messages
#define MI_TXBPS 56000UL // default TX speed (bits per second)
#define HI_POLL_DELAY 1000 // polling delay for messages
// Modem interface, line #1 ...
#define MI1 071 // IO address for modem interface #1
#define MI1_RX_DMC (DMC1-1+ 1) // DMC channel for modem 1 receive
#define MI1_TX_DMC (DMC1-1+ 6) // DMC channel for modem 1 transmit
#define INT_V_MI1RX (INT_V_EXTD+15) // modem 1 receive interrupt
#define INT_V_MI1TX (INT_V_EXTD+10) // modem 1 transmit interrupt
// Modem interface, line #2 ...
#define MI2 072 // IO address for modem interface #2
#define MI2_RX_DMC (DMC1-1+ 2) // DMC channel for modem 2 receive
#define MI2_TX_DMC (DMC1-1+ 7) // DMC channel for modem 2 transmit
#define INT_V_MI2RX (INT_V_EXTD+14) // modem 2 receive interrupt
#define INT_V_MI2TX (INT_V_EXTD+ 9) // modem 2 transmit interrupt
// Modem interface, line #3 ...
#define MI3 073 // IO address for modem interface #3
#define MI3_RX_DMC (DMC1-1+ 3) // DMC channel for modem 3 receive
#define MI3_TX_DMC (DMC1-1+ 8) // DMC channel for modem 3 transmit
#define INT_V_MI3RX (INT_V_EXTD+13) // modem 3 receive interrupt
#define INT_V_MI3TX (INT_V_EXTD+ 8) // modem 3 transmit interrupt
// Modem interface, line #4 ...
#define MI4 074 // IO address for modem interface #4
#define MI4_RX_DMC (DMC1-1+ 4) // DMC channel for modem 4 receive
#define MI4_TX_DMC (DMC1-1+ 9) // DMC channel for modem 4 transmit
#define INT_V_MI4RX (INT_V_EXTD+12) // modem 4 receive interrupt
#define INT_V_MI4TX (INT_V_EXTD+ 7) // modem 4 transmit interrupt
// Modem interface, line #5 ...
#define MI5 075 // IO address for modem interface #5
#define MI5_RX_DMC (DMC1-1+ 5) // DMC channel for modem 5 receive
#define MI5_TX_DMC (DMC1-1+10) // DMC channel for modem 5 transmit
#define INT_V_MI5RX (INT_V_EXTD+11) // modem 5 receive interrupt
#define INT_V_MI5TX (INT_V_EXTD+ 6) // modem 5 transmit interrupt
// Host interface, line #1 ...
#define HI1 070 // device address for host interface #1
#define HI1_RX_DMC (DMC1+13-1) // DMC channel for host 1 receive
#define HI1_TX_DMC (DMC1+11-1) // DMC channel for host 1 transmit
#define INT_V_HI1RX (INT_V_EXTD+ 3) // host 1 receive interrupt
#define INT_V_HI1TX (INT_V_EXTD+ 5) // host 1 transmit interrupt
// Host interface, line #2 ...
#define HI2 060 // device address for host interface #2
#define HI2_RX_DMC (DMC1-1+14) // DMC channel for host 2 receive
#define HI2_TX_DMC (DMC1-1+12) // DMC channel for host 2 transmit
#define INT_V_HI2RX (INT_V_EXTD+ 2) // host 2 receive interrupt
#define INT_V_HI2TX (INT_V_EXTD+ 4) // host 2 transmit interrupt
// Host interface, line #3 ...
#define HI3 051 // device address for host interface #3
#define HI3_RX_DMC (DMC1-1+16) // DMC channel for host 3 receive
#define HI3_TX_DMC (DMC1-1+15) // DMC channel for host 3 transmit
#define INT_V_HI3RX (INT_V_EXTD+ 6) // host 3 receive interrupt
#define INT_V_HI3TX (INT_V_EXTD+11) // host 3 transmit interrupt
// Host interface, line #4 ...
#define HI4 050 // device address for host interface #4
#define HI4_RX_DMC (DMC1-1+10) // DMC channel for host 4 receive
#define HI4_TX_DMC (DMC1-1+ 5) // DMC channel for host 4 transmit
#define INT_V_HI4RX (INT_V_EXTD+ 7) // host 4 receive interrupt
#define INT_V_HI4TX (INT_V_EXTD+12) // host 4 transmit interrupt
// IMP defaults ...
#define IMP 041 // IMP device IO address (41 & 42 actually!)
#define INT_V_TASK (INT_V_EXTD+ 0) // task switch interrupt number
#define IMP_STATION 1 // default station number
// RTC defaults ...
#define RTC 040 // real time clock IO address
#define INT_V_RTC (INT_V_EXTD+ 1) // RTC interrupt number
#define RTC_INTERVAL 20UL // default RTC interval (20us == 50kHz)
#define RTC_QUANTUM 32UL // default RTC quantum (32 ticks)
// WDT defaults ...
#define WDT 026 // watchdog timer IO address
#define WDT_VECTOR 000062 // WDT timeout vector
#define WDT_DELAY 0 // default WDT timeout (in milliseconds)
// Debugging flags ...
// In general, these bits are used as arguments for sim_debug(). Bits that
// begin with "IMP_DBG_xyz" are shared by more than one device (e.g. IMP_DBG_UDP)
// and must have unique bit assignments. Bits prefixed with a device name (e.g.
// "MI_DBG_xyz") apply to that device only.
#define IMP_DBG_WARN 0x0001 // all: print warnings
#define IMP_DBG_IOT 0x0002 // all: trace all program I/O instructions
#define IMP_DBG_UDP 0x0004 // all: trace UDP packets
#define MI_DBG_MSG 0x8000 // modem: decode and print all messages
#define WDT_DBG_LIGHTS 0x8000 // wdt: show status light changes
// Synonyms for DIB and UNIT fields ...
#define rxdmc chan // dib->rxdmc
#define txdmc chan2 // dib->txdmc
#define rxint inum // dib->rxint
#define txint inum2 // dib->txint
// Modem interface data block ....
// One of these is allocated to every modem interface to keep track of the
// current state, COM port, UDP connection , etc...
struct _MIDB {
// Receiver data ...
t_bool rxpending; // TRUE if a read is pending on this line
t_bool rxerror; // TRUE if any modem error detected
uint32 rxtotal; // total number of H316 words received
// Transmitter data ...
uint32 txtotal; // total number of H316 words transmitted
uint32 txdelay; // RTC ticks until TX done interrupt
// Other data ...
t_bool lloop; // line loop back enabled
t_bool iloop; // interface loop back enabled
int32 link; // h316_udp link number
uint32 bps; // simulated line speed or COM port baud rate
};
typedef struct _MIDB MIDB;
// Host interface data block ...
// One of these is allocated to every host interface ...
struct _HIDB {
// Receiver (HOST -> IMP) data ...
uint32 rxtotal; // total host messages received
// Transmitter (IMP -> HOST) data ...
uint32 txtotal; // total host messages sent
// Other data ...
t_bool lloop; // local loop back enabled
t_bool enabled; // TRUE if the host is enabled
t_bool error; // TRUE for any host error
t_bool ready; // TRUE if the host is ready
t_bool full; // TRUE if the host buffer is full
t_bool eom; // TRUE when end of message is reached
};
typedef struct _HIDB HIDB;
// I can't believe Bob managed to live without these, but I can't!
#ifndef LOBYTE // these are in winsock.h too!
#define LOBYTE(x) ((uint8) ( (x) & 0xFF))
#define HIBYTE(x) ((uint8) (((x) >> 8) & 0xFF))
#define MKWORD(h,l) ((uint16) ( (((h)&0xFF) << 8) | ((l)&0xFF) ))
#define LOWORD(x) ((uint16) ( (x) & 0xFFFF))
#define HIWORD(x) ((uint16) (((x) >> 16) & 0xFFFF))
#define MKLONG(h,l) ((uint32) ( (((h)&0xFFFF) << 16) | ((l)&0xFFFF) ))
#endif
// Prototypes for the RTC module ...
// I really hate sharing things like this, but it's the only way to get the
// modem transmitter timing exactly right!
extern uint32 rtc_interval;
extern t_stat mi_tx_service (uint32 quantum);
// Prototypes for UDP modem/host interface emulation routines ...
#define NOLINK (-1)
t_stat udp_create (DEVICE *pdtr, char *premote, int32 *plink);
t_stat udp_release (DEVICE *dptr, int32 link);
t_stat udp_send (DEVICE *pdtr, int32 link, uint16 *pdata, uint16 count);
t_stat udp_set_link_loopback (DEVICE *dptr, int32 link, t_bool enable_loopback);
int32 udp_receive (DEVICE *dptr, int32 link, uint16 *pdata, uint16 maxbufg);
#endif // #ifndef _H316_IMP_H_
#endif // #ifdef VM_IMPTIP