/* 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_ */ |