| /* 3b2_ports.h: AT&T 3B2 Model 400 "PORTS" feature card | |
| Copyright (c) 2018, Seth J. Morabito | |
| 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 THE AUTHORS OR COPYRIGHT HOLDERS | |
| 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 the author shall | |
| not be used in advertising or otherwise to promote the sale, use or | |
| other dealings in this Software without prior written authorization | |
| from the author. | |
| */ | |
| /* | |
| * PORTS is an intelligent feature card for the 3B2 that supports four | |
| * serial lines and one Centronics parallel port. | |
| * | |
| * The PORTS card is based on the Common I/O (CIO) platform. It uses | |
| * two SCN2681A DUARTs to supply the four serial lines, and uses the | |
| * SCN2681A parallel I/O pins for the Centronics parallel port. | |
| * | |
| * This file implements the required logic for the PORTS CIO | |
| * interface. The SCN2681A functionality is implemented in the file | |
| * 3b2_duart.c, and is used by both this feature card and the System | |
| * Board console/contty functionality. | |
| */ | |
| #ifndef _3B2_PORTS_H_ | |
| #define _3B2_PORTS_H_ | |
| #include "3b2_defs.h" | |
| #include "3b2_io.h" | |
| #define PORTS_ID 0x0003 | |
| #define PORTS_IPL 10 | |
| #define PORTS_VERSION 1 | |
| #define DEF_PORTS_CARDS 1 | |
| #define MAX_PORTS_CARDS 12 | |
| #define PORTS_LINES 4 | |
| #define PORTS_RCV_QUEUE 5 | |
| /* | |
| * Sub-field values for the PPC_DEVICE request entry; these are placed | |
| * in app_data.bt[0] in the PPC_DEVICE application field. The prefix | |
| * DR indicates that this is a code for use in "device" request | |
| * entries only. | |
| */ | |
| #define DR_ENA 1 /* enable a device */ | |
| #define DR_DIS 2 /* disable a device */ | |
| #define DR_ABR 3 /* abort reception on a device */ | |
| #define DR_ABX 4 /* abort transmission on a device */ | |
| #define DR_BRK 5 /* transmit "break" on a device */ | |
| #define DR_SUS 6 /* suspend xmit on a device */ | |
| #define DR_RES 7 /* resume xmit on a device */ | |
| #define DR_BLK 8 /* transmit STOP character */ | |
| #define DR_UNB 9 /* transmit START character */ | |
| /* | |
| * Sub-field values for the PPC_DEVICE completion entry; these appear | |
| * in app_data.bt[0] in the PPC_DEVICE application field. These are | |
| * mutually exclusive and cannot be combined. The prefix DC indicates | |
| * that this is a code for use in "device" completion entries only. | |
| */ | |
| #define DC_NORM 0x00 /* command executed as requested */ | |
| #define DC_DEV 0x01 /* bad device number */ | |
| #define DC_NON 0x02 /* bad sub-code on request */ | |
| #define DC_FAIL 0x03 /* failed to read express entry */ | |
| /* | |
| * Sub-field values for the PPC_RECV completion entry; these appear in | |
| * app_data.bt[0] in the PPC_RECV application field. These are NOT | |
| * mutually exclusive and may appear in combination. The prefix RC | |
| * indicates that this is a code for use in "read" completion entries | |
| * only. | |
| */ | |
| #define RC_DSR 0x01 /* disruption of service */ | |
| #define RC_FLU 0x02 /* buffer flushed */ | |
| #define RC_TMR 0x04 /* inter-character timer expired */ | |
| #define RC_BQO 0x08 /* PPC buffer queue overflow */ | |
| #define RC_UAO 0x10 /* uart overrun */ | |
| #define RC_PAR 0x20 /* parity error */ | |
| #define RC_FRA 0x40 /* framing error */ | |
| #define RC_BRK 0x80 /* break received */ | |
| /* | |
| * The following codes are included on the DISC (disconnect) command. | |
| * They are "or"ed into the app_data.bt[1] application field in a | |
| * request. These codes are NOT mutually exclusive and can be used in | |
| * any combination. | |
| */ | |
| #define GR_DTR 0x01 | |
| #define GR_CREAD 0x02 | |
| /* | |
| * Sub-field values for the PPC_XMIT and PPC_OPTIONS completion | |
| * entries; these appear in app_data.bt[0] in the application fields. | |
| * These are NOT mutually exclusive and may appear in combination. | |
| * The prefix GC indicates that this is a code for use in "general" | |
| * completion entries only. | |
| */ | |
| #define GC_DSR 0x01 /* disruption of service */ | |
| #define GC_FLU 0x02 /* buffer flushed */ | |
| /* | |
| * Sub-field values for the PPC_ASYNC completion entry; these appear | |
| * in app_data.bt[0] in the PPC_ASYNC application field. These are | |
| * mutually exclusive and cannot be combined. The prefix AC indicates | |
| * that this is a code for use in "asynchronous" completion entries | |
| * only. | |
| */ | |
| #define AC_CON 0x01 /* connection detected */ | |
| #define AC_DIS 0x02 /* disconnection detected */ | |
| #define AC_BRK 0x03 /* asynchronous "break" */ | |
| #define AC_FLU 0x04 /* xmit flush complete */ | |
| /* Line Discipline flags (input and output) */ | |
| #define IGNBRK 0x0001 | |
| #define BRKINT 0x0002 | |
| #define IGNPAR 0x0004 | |
| #define PARMRK 0x0008 | |
| #define INPCK 0x0010 | |
| #define ISTRIP 0x0020 | |
| #define INLCR 0x0040 | |
| #define IGNCR 0x0080 | |
| #define ICRNL 0x0100 | |
| #define IUCLC 0x0200 | |
| #define IXON 0x0400 | |
| #define IXANY 0x0800 | |
| #define OPOST 0x0001 | |
| #define OLCUC 0x0002 | |
| #define ONLCR 0x0004 | |
| #define OCRNL 0x0008 | |
| #define ONOCR 0x0010 | |
| #define ONLRET 0x0020 | |
| #define OFILL 0x0040 | |
| #define OFDEL 0x0080 | |
| #define ONLDLY 0x0100 | |
| #define OCRDLY 0x0600 | |
| #define OTABDLY 0x1800 | |
| #define OBSDLY 0x2000 | |
| #define OVTDLY 0x4000 | |
| #define OFFDLY 0x8000 | |
| /* Opcodes for PORTS card */ | |
| #define PPC_OPTIONS 32 /* GEN, COMP queues: set PPC options */ | |
| #define PPC_XMIT 33 /* GEN, COMP queues: transmit a buffer */ | |
| #define PPC_CONN 34 /* GEN, COMP queues: connect a device */ | |
| #define PPC_DISC 35 /* GEN, COMP queues: disconnect a device */ | |
| #define PPC_BRK 36 /* GEN, COMP queues: ioctl break */ | |
| #define PPC_DEVICE 40 /* EXP, ECOMP entries: device control command */ | |
| #define PPC_CLR 41 /* EXP, ECOMP entries: board clear */ | |
| #define PPC_RECV 50 /* RECV, COMP queues: receive request */ | |
| #define PPC_ASYNC 60 /* Asynchronous request */ | |
| #define CFW_CONFIG 70 /* GEN, COMP queues: set PPC port 0 hardware options */ | |
| #define CFW_IREAD 71 /* GEN, COMP queues: read immediate one to four bytes */ | |
| #define CFW_IWRITE 72 /* GEN, COMP queues: write immediate one to four bytes */ | |
| #define CFW_WRITE 73 /* GEN, COMP queues: write */ | |
| #define PPC_VERS 80 /* EXP, COMP queues: Version */ | |
| typedef struct { | |
| uint32 tx_addr; /* Address to next read from */ | |
| uint32 tx_req_addr; /* Original request address */ | |
| uint32 tx_chars; /* Number of chars left to transfer */ | |
| uint32 tx_req_chars; /* Original number of chars */ | |
| uint8 rlp; /* Last known load pointer */ | |
| uint16 iflag; /* Line Discipline: Input flags */ | |
| uint16 oflag; /* Line Discipline: Output flags */ | |
| t_bool crlf; /* Indicates we are in a CRLF output transform */ | |
| t_bool conn; /* TRUE if connected, FALSE otherwise */ | |
| } PORTS_LINE_STATE; | |
| typedef struct { | |
| uint16 line; /* line discipline */ | |
| uint16 pad1; | |
| uint16 iflag; /* input options word */ | |
| uint16 oflag; /* output options word */ | |
| uint16 cflag; /* hardware options */ | |
| uint16 lflag; /* line discipline options */ | |
| uint8 cerase; /* "erase" character */ | |
| uint8 ckill; /* "kill" character */ | |
| uint8 cinter; /* "interrupt" character */ | |
| uint8 cquit; /* "quit" character */ | |
| uint8 ceof; /* "end of file" character */ | |
| uint8 ceol; /* "end of line" character */ | |
| uint8 itime; /* inter character timer multiplier */ | |
| uint8 vtime; /* user-specified inter char timer */ | |
| uint8 vcount; /* user-specified maximum buffer char count */ | |
| uint8 pad2; | |
| uint16 pad3; | |
| } PORTS_OPTIONS; | |
| extern DEVICE ports_dev; | |
| t_stat ports_reset(DEVICE *dptr); | |
| t_stat ports_setnl(UNIT *uptr, int32 val, CONST char *cptr, void *desc); | |
| t_stat ports_show_cqueue(FILE *st, UNIT *uptr, int32 val, CONST void *desc); | |
| t_stat ports_show_rqueue(FILE *st, UNIT *uptr, int32 val, CONST void *desc); | |
| t_stat ports_rcv_svc(UNIT *uptr); | |
| t_stat ports_xmt_svc(UNIT *uptr); | |
| t_stat ports_cio_svc(UNIT *uptr); | |
| t_stat ports_attach(UNIT *uptr, CONST char *cptr); | |
| t_stat ports_detach(UNIT *uptr); | |
| void ports_sysgen(uint8 cid); | |
| void ports_express(uint8 cid); | |
| void ports_full(uint8 cid); | |
| #endif /* _3B2_PORTS_H_ */ |