| /* 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_RWERROR 37 | |
| #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_ */ |