blob: d658019589179d38614d5dbff37fa60b41b8a23d [file] [log] [blame] [raw]
/* 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_ */