146 lines
4.7 KiB
C
146 lines
4.7 KiB
C
/* 3b2_cpu.h: AT&T 3B2 Model 400 Hard Disk (uPD7261) Header
|
|
|
|
Copyright (c) 2017, 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.
|
|
*/
|
|
|
|
#ifndef __3B2_ID_H__
|
|
#define __3B2_ID_H__
|
|
|
|
#include "3b2_defs.h"
|
|
#include "3b2_sysdev.h"
|
|
#include "sim_disk.h"
|
|
|
|
/* Command Codes (bits 3-7 of command byte) */
|
|
|
|
#define ID_DATA_REG 0
|
|
#define ID_CMD_STAT_REG 1
|
|
|
|
#define ID_CMD_AUX 0x00 /* Auxiliary Command */
|
|
#define ID_CMD_SIS 0x01 /* Sense int. status */
|
|
#define ID_CMD_SPEC 0x02 /* Specify */
|
|
#define ID_CMD_SUS 0x03 /* Sense unit status */
|
|
#define ID_CMD_DERR 0x04 /* Detect Error */
|
|
#define ID_CMD_RECAL 0x05 /* Recalibrate */
|
|
#define ID_CMD_SEEK 0x06 /* Seek */
|
|
#define ID_CMD_FMT 0x07 /* Format */
|
|
#define ID_CMD_VID 0x08 /* Verify ID */
|
|
#define ID_CMD_RID 0x09 /* Read ID */
|
|
#define ID_CMD_RDIAG 0x0A /* Read Diagnostic */
|
|
#define ID_CMD_RDATA 0x0B /* Read Data */
|
|
#define ID_CMD_CHECK 0x0C /* Check */
|
|
#define ID_CMD_SCAN 0x0D /* Scan */
|
|
#define ID_CMD_VDATA 0x0E /* Verify Data */
|
|
#define ID_CMD_WDATA 0x0F /* Write Data */
|
|
|
|
#define ID_AUX_RST 0x01
|
|
#define ID_AUX_CLB 0x02
|
|
#define ID_AUX_HSRQ 0x04
|
|
#define ID_AUX_CLCE 0x08
|
|
|
|
#define ID_STAT_DRQ 0x01
|
|
#define ID_STAT_NCI 0x02
|
|
#define ID_STAT_IER 0x04
|
|
#define ID_STAT_RRQ 0x08
|
|
#define ID_STAT_SRQ 0x10
|
|
#define ID_STAT_CEL 0x20
|
|
#define ID_STAT_CEH 0x40
|
|
#define ID_STAT_CB 0x80
|
|
|
|
#define ID_IST_SEN 0x80
|
|
#define ID_IST_RC 0x40
|
|
#define ID_IST_SER 0x20
|
|
#define ID_IST_EQC 0x10
|
|
#define ID_IST_NR 0x08
|
|
|
|
#define ID_UST_DSEL 0x10
|
|
#define ID_UST_SCL 0x08
|
|
#define ID_UST_TK0 0x04
|
|
#define ID_UST_RDY 0x02
|
|
#define ID_UST_WFL 0x01
|
|
|
|
#define ID_EST_ENC 0x80
|
|
#define ID_EST_OVR 0x40
|
|
#define ID_EST_DER 0x20
|
|
#define ID_EST_EQC 0x10
|
|
#define ID_EST_NR 0x08
|
|
#define ID_EST_ND 0x04
|
|
#define ID_EST_NWR 0x02
|
|
#define ID_EST_MAM 0x01
|
|
|
|
#define ID_DTLH_POLL 0x10
|
|
|
|
/* Geometry */
|
|
|
|
#define ID_CYL 925
|
|
#define ID_SEC_SIZE 512 /* Bytes per sector */
|
|
#define ID_SEC_CNT 18 /* Sectors per track */
|
|
#define ID_HEADS 9
|
|
#define ID_CYL_SIZE 512 * 18
|
|
|
|
/* Unit, Register, Device descriptions */
|
|
|
|
#define ID_FIFO_LEN 8
|
|
#define ID_IDFIELD_LEN 4
|
|
|
|
#define ID_NUM_UNITS 2
|
|
|
|
/* Unit number field in UNIT structure */
|
|
#define ID_UNIT_NUM u3
|
|
|
|
extern DEVICE id_dev;
|
|
extern DEBTAB sys_deb_tab[];
|
|
extern t_bool id_drq;
|
|
extern t_bool id_irq;
|
|
|
|
#define IDBASE 0x4a000
|
|
#define IDSIZE 0x2
|
|
|
|
/* Total disk size, in sectors */
|
|
#define ID_DSK_SIZE ID_CYL * ID_SEC_CNT * ID_HEADS
|
|
|
|
#define CMD_NUM ((id_cmd >> 4) & 0xf)
|
|
#define UNIT_NUM (id_cmd & 1) /* We intentionally ignore the top unit address bit */
|
|
|
|
/* Function prototypes */
|
|
|
|
t_stat id_svc(UNIT *uptr);
|
|
t_stat id_reset(DEVICE *dptr);
|
|
t_stat id_attach(UNIT *uptr, CONST char *cptr);
|
|
t_stat id_detach(UNIT *uptr);
|
|
uint32 id_read(uint32 pa, size_t size);
|
|
void id_write(uint32 pa, uint32 val, size_t size);
|
|
CONST char *id_description(DEVICE *dptr);
|
|
t_stat id_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr);
|
|
void id_handle_data(uint8 val);
|
|
void id_handle_command(uint8 val);
|
|
|
|
static SIM_INLINE t_lba id_lba(uint16 cyl, uint8 head, uint8 sec);
|
|
|
|
void id_drq_handled();
|
|
|
|
#endif
|