2020-01-11 09:21:05 -08:00

249 lines
12 KiB
C

/*
* Copyright (C) 2019 John Forecast. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY JOHN FORECAST "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __OS8_H__
#define __OS8_H__
/*
* General disk layout (each block is 256 12-bit words).
*
* Block
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 0 | Reserved |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 1-6 | Directory segments |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 7-12 | Keyboard Monitor | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 13-15 | User Service Routine | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 16-25 | Device Handlers | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 26 | Enter Processor For USR | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 27-50 | System Scratch Blocks | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 51-53 | Command Decoder | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 54-55 | SAVE And DATE Overlays | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 56 | Monitor Error Routine | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 57 | CHAIN Processor For USR | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 60-63 | System ODT | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 64 | Reserved For System Expansion | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 65 | CCL Reminiscences | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 66 | 12K TD8E Resident Code | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 67 | CCL Overlay | **
* +---+---+---+---+---+---+---+---+---+---+---+---+
* Files | ... |
* | ... |
* | ... |
* | ... |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* End Of Volume
*
* Blocks marked "**" are only reserved on System Devices, on non-System
* Devices, file storage starts at block 7.
*
* Directory Segment Header:
*
* Word
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 0 | Minus # of entries in this segment |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 1 | Starting block # of first file in this segment|
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 2 | Link to next directory segment |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 3 | Flag Word |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 4 | Minus # of additional information words |
* +---+---+---+---+---+---+---+---+---+---+---+---+
*
* Directory Entry:
*
* Word
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 0 | Sixbit ASCII File Name (chars 1 - 2) |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 1 | Sixbit ASCII File Name (chars 3 - 4) |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 2 | Sixbit ASCII File Name (chars 5 - 6) |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* 3 | Sixbit ASCII File Extension (chars 1 - 2) |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* | N additional information words |
* | ... |
* | ... |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* N + 4 | Minus file length in blocks |
* +---+---+---+---+---+---+---+---+---+---+---+---+
*
* If there are additional informations words in the directory, the file
* creation time is stored in word 4 (zero means not available):
*
* +---+---+---+---+---+---+---+---+---+---+---+---+
* | | | |
* +---+---+---+---+---+---+---+---+---+---+---+---+
* | | | | | |
* | | | | +-------+
* | | +---------------+ |
* +-----------+ | Year - 1970
* | Day of Month (1 - 31)
* Month (1 - 12)
*/
#define OS8_BLOCKSIZE 256 /* Size of a block on disk (words) */
#define OS8_DSSTART 1 /* Start of directory segments */
#define OS8_DSLAST 6 /* Last directory segment */
#define OS8_DATA 7 /* Start of data (non-system device) */
#define OS8_DH_ENTRIES 0 /* -(# of entries in segment) */
#define OS8_DH_START 1 /* Block # for segment start */
#define OS8_DH_NEXT 2 /* Next directory segment */
#define OS8_DH_FLAGWD 3 /* Flag word */
#define OS8_DH_EXTRA 4 /* -(# of additional info. words) */
#define OS8_DH_SIZE 5 /* Size of directory header */
#define OS8_DI_FNAME1 0 /* File name (chars 1 - 2) */
#define OS8_DI_FNAME2 1 /* File name (chars 3 - 4) */
#define OS8_DI_FNAME3 2 /* File name (chars 5 - 6) */
#define OS8_DI_EXT 3 /* File extension (1 - 2 chars) */
/* Additional words go here */
#define OS8_DI_DATE 4 /* Optional creation date */
#define OS8_DI_LENGTH 4 /* -(File length in blocks) */
#define OS8_DI_SIZE 5 /* Default entry size */
#define OS8_ED_IND 0 /* Empty directory entry */
#define OS8_ED_LENGTH 1 /* -(Empty file length in blocks) */
#define OS8_ED_SIZE 2 /* Entry size */
/*
* Device specific definitions
*/
#define OS8_RK05FS_BLKS 3248 /* Blocks in an RK05 file system */
#define OS8_RX01SS 128 /* Byte sector size of RX01 floppy */
#define OS8_RX02SS 256 /* Byte sector size of RX02 floppy */
#define OS8_RX01SS_W 64 /* Word sector size of RX01 floppy */
#define OS8_RX02SS_W 128 /* Word sector size of RX02 floppy */
#define OS8_RX0xNSECT 26 /* Sectors/track on RX01/RX02 */
#define OS8_RX0xSZ 2002 /* Sectors on an RX01/RX02 */
/*
* Structure to describe a filename. Asterisks may be used as wild card
* characters for the 2 components of a filename; namd and extension
*/
struct os8FileSpec {
uint8_t flags; /* Wild card indicators */
uint16_t name[3]; /* File name (sixbit) */
uint16_t ext; /* File extension (sixbit) */
char fname[6]; /* File name (ASCII) */
char fext[2]; /* File extension (ASCII) */
};
#define OS8_WC_NAME 001 /* Wild card in name */
#define OS8_WC_EXT 002 /* Wild card in extension */
#define OS8_M_NONE 0000 /* Wild cards not allowed */
#define OS8_M_ALLOW 0001 /* Wild cards allowed */
#define OS8_M_NONAME 0002 /* Wild cards allowed */
/* If no filename + extension */
/* present, default to *.* */
/*
* OS/8 files pack 3 bytes into a pair of 12-bit words. The following states
* are used to pack/unpack bytes.
*/
#define OS8_BYTE0 0 /* Pack/unpack byte 0 */
#define OS8_BYTE1 1 /* Pack/unpack byte 1 */
#define OS8_BYTE2 2 /* Pack/unpack byte 2 */
#define OS8_CHECK 3 /* Check for end of block/EOF */
/*
* Structure to define an open file. This is an OS/8 directory entry along
* with sufficient information to be able to write the directory entry back
* to disk.
*/
struct os8OpenFile {
uint16_t name[3]; /* File name */
uint16_t ext; /* File extension */
uint16_t creation; /* Creation date */
uint16_t length; /* File length (blocks) */
/* End of directory entry */
uint8_t segment; /* Directory segment */
uint16_t offset; /* Directory offset */
uint16_t entrysz; /* Size of directory entries */
uint16_t extra; /* Extra words in directory entries */
uint16_t remain; /* Remaining directory entries */
/* Start of read/write info */
enum openMode mode; /* Open mode (read/write) */
struct mountedFS *mount; /* Mounted file system descriptor */
uint8_t unit; /* File system # */
uint16_t *buffer; /* Private buffer for file I/O */
uint16_t start; /* Starting block # */
uint16_t current; /* Current block # */
uint16_t last; /* Last block # */
uint16_t wordpos; /* Current word offset */
uint8_t bytepos; /* Current byte position */
off_t written; /* # of bytes written to the file */
};
/*
* Device descriptor
*/
struct OS8device {
char *name; /* Device name */
uint8_t filesys; /* # of file systems on device */
size_t diskSize; /* # of blocks on device */
off_t skip; /* Reserved space at start of disk */
uint16_t blocks[8]; /* File system sizes */
int (*blockPresent)(struct mountedFS *, uint8_t, unsigned int);
int (*readBlock)(struct mountedFS *, uint8_t, unsigned int, void *);
int (*writeBlock)(struct mountedFS *, uint8_t, unsigned int, void *);
};
/*
* OS/8 specific data area
*/
struct OS8data {
unsigned int blocks; /* Size of container */
struct OS8device *device; /* Device type */
uint8_t devices; /* # of "devices" present */
uint8_t valid; /* Bitmap of valid devices */
uint16_t date; /* Date for creating files */
uint16_t buf[OS8_BLOCKSIZE]; /* Disk buffer */
};
#endif