| /* 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); |
| |
| static t_stat ports_show_queue_common(FILE *st, UNIT *uptr, int32 val, |
| CONST void *desc, t_bool rq); |
| |
| #endif /* _3B2_PORTS_H_ */ |