mirror of
https://github.com/open-simh/simtools.git
synced 2026-01-14 23:55:09 +00:00
249 lines
12 KiB
C
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
|