blob: ea5e1527fc6055f4557b8dff4d9c4e4fb9fbf3fc [file] [log] [blame] [raw]
/* 3b2_ctc.h: AT&T 3B2 Model 400 "CTC" 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.
*/
/*
* CTC is an intelligent feature card for the 3B2 that supports a
* Cipher "FloppyTape(tm)" 525 drive that can read and write 23MB
* DC600A cartridges.
*
* The CTC card is based on the Common I/O (CIO) platform.
*
* Notes:
* ------
*
* The Cipher FloppyTape is an odd beast. Although it's a tape drive,
* it is controlled by a floppy controller. It is divided into virtual
* sectors that can be addressed by Cylinder / Track / Sector.
* Stepping and head select pulses dictate where on the tape to read
* from or write to. Moreover, System V maps a filesystem onto the
* tape, and a properly formatted tape drive will have a VTOC on
* partition 0.
*
*/
#ifndef _3B2_CTC_H_
#define _3B2_CTC_H_
#include "3b2_defs.h"
#include "3b2_io.h"
#define UNIT_V_WLK (DKUF_V_UF + 0) /* Write-locked tape */
#define UNIT_WLK (1 << UNIT_V_WLK)
#define CTC_ID 0x0005
#define CTC_IPL 12
#define CTC_VERSION 1
/* Request Opcodes */
#define CTC_CONFIG 30
#define CTC_CLOSE 31
#define CTC_FORMAT 32
#define CTC_OPEN 33
#define CTC_READ 34
#define CTC_WRITE 35
#define CTC_VWRITE 36
/* Completion Opcodes */
#define CTC_SUCCESS 0
#define CTC_HWERROR 32
#define CTC_RDONLY 33
#define CTC_NOTREADY 36
#define CTC_NOMEDIA 42
/* VTOC values */
#define VTOC_VERSION 1
#define VTOC_SECSZ 512
#define VTOC_PART 16 /* Number of "partitions" on tape */
#define VTOC_VALID 0x600DDEEE /* Magic number for valid VTOC */
/* Physical Device Info (pdinfo) values */
#define PD_VALID 0xCA5E600D /* Magic number for valid PDINFO */
#define PD_DRIVEID 5
#define PD_VERSION 0
#define PD_CYLS 6
#define PD_TRACKS 245
#define PD_SECTORS 31
#define PD_BYTES 512
#define PD_LOGICALST 29
#define CTC_CAPACITY (PD_CYLS * PD_TRACKS * PD_SECTORS) /* In blocks */
struct partition {
uint16 id; /* Partition ID */
uint16 flag; /* Permission Flags */
uint32 sstart; /* Starting Sector */
uint32 ssize; /* Size in Sectors */
};
struct vtoc {
uint32 bootinfo[3]; /* n/a */
uint32 sanity; /* magic number */
uint32 version; /* layout version */
uint8 volume[8]; /* volume name */
uint16 sectorsz; /* sector size in bytes */
uint16 nparts; /* number of partitions */
uint32 reserved[10]; /* free space */
struct partition part[VTOC_PART]; /* partition headers */
uint32 timestamp[VTOC_PART]; /* partition timestamp */
};
struct pdinfo {
uint32 driveid; /* identifies the device type */
uint32 sanity; /* verifies device sanity */
uint32 version; /* version number */
uint8 serial[12]; /* serial number of the device */
uint32 cyls; /* number of cylinders per drive */
uint32 tracks; /* number tracks per cylinder */
uint32 sectors; /* number sectors per track */
uint32 bytes; /* number of bytes per sector */
uint32 logicalst; /* sector address of logical sector 0 */
uint32 errlogst; /* sector address of error log area */
uint32 errlogsz; /* size in bytes of error log area */
uint32 mfgst; /* sector address of mfg. defect info */
uint32 mfgsz; /* size in bytes of mfg. defect info */
uint32 defectst; /* sector address of the defect map */
uint32 defectsz; /* size in bytes of defect map */
uint32 relno; /* number of relocation areas */
uint32 relst; /* sector address of relocation area */
uint32 relsz; /* size in sectors of relocation area */
uint32 relnext; /* address of next avail reloc sector */
};
typedef struct {
uint32 time; /* Time used during a tape session (in 25ms chunks) */
} CTC_STATE;
extern DEVICE ctc_dev;
t_stat ctc_reset(DEVICE *dptr);
t_stat ctc_svc(UNIT *uptr);
t_stat ctc_attach(UNIT *uptr, CONST char *cptr);
t_stat ctc_detach(UNIT *uptr);
void ctc_sysgen(uint8 cid);
void ctc_express(uint8 cid);
void ctc_full(uint8 cid);
/* Largely here for debugging purposes */
static t_stat ctc_show_cqueue(FILE *st, UNIT *uptr, int32 val, CONST void *desc);
static t_stat ctc_show_rqueue(FILE *st, UNIT *uptr, int32 val, CONST void *desc);
static t_stat ctc_show_queue_common(FILE *st, UNIT *uptr, int32 val, CONST void *desc, t_bool rq);
#endif /* _3B2_CTC_H_ */