This is drive.h in view mode; [Download] [Up]
/* * drive.h - Disk-drive implementation. * * Written by * Teemu Rantanen (tvr@cs.hut.fi) * Jarkko Sonninen (sonninen@lut.fi) * Jouko Valta (jopi@stekt.oulu.fi) * Olaf Seibert (rhialto@mbfys.kun.nl) * Andre Fachat (a.fachat@physik.tu-chemnitz.de) * Ettore Perazzoli (ettore@comm2000.it) * Martin Pottendorfer (Martin.Pottendorfer@aut.alcatel.at) * * Patches by * Dan Miner (dminer@nyx10.cs.du.edu) * Germano Caronni (caronni@tik.ethz.ch) * Daniel Fandrich (dan@fch.wimsey.bc.ca) /DF/ * * This file is part of VICE, the Versatile Commodore Emulator. * See README for copyright notice. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. * */ #ifndef _DRIVE_H #define _DRIVE_H #include <time.h> #include "types.h" #include "fs_cbm.h" #define UPPER(ad) (((ad)>>8)&0xff) #define LOWER(ad) ((ad)&0xff) #define SET_LO_HI(p, val) \ do { \ *((p)++) = (val) & 0xff; \ *((p)++) = ((val)>>8) & 0xff; \ } while (0) #define DRIVE_RAMSIZE 0x400 #define IP_MAX_COMMAND_LEN 128 /* real 58 */ /* File Types */ #define FT_DEL 0 #define FT_SEQ 1 #define FT_PRG 2 #define FT_USR 3 #define FT_REL 4 #define FT_CBM 5 /* 1581 partition */ #define FT_DJJ 6 /* 1581 */ #define FT_FAB 7 /* 1581 - Fred's format */ #define FT_REPLACEMENT 0x20 #define FT_LOCKED 0x40 #define FT_CLOSED 0x80 /* Access Control Methods */ #define FAM_READ 0 #define FAM_WRITE 1 #define FAM_APPEND 2 #define FAM_M 4 #define FAM_F 8 /* This structure is from cbmargc.c of fvcbm by Dan Fandrich */ #ifdef __GNUC__ #define PACK __attribute__ ((packed)) /* pack structures on byte boundaries */ #else #define PACK /* pack using a compiler switch instead */ #endif typedef struct { BYTE Link[2]; /* On the 1st entry only */ BYTE FileType PACK; BYTE FirstTrack PACK; BYTE FirstSector PACK; BYTE FileName[16] PACK; BYTE FirstSideTrack PACK; BYTE FirstSideSector PACK; BYTE RecordSize PACK; BYTE Filler[4] PACK; BYTE FirstReplacementTrack PACK; BYTE FirstReplacementSector PACK; BYTE FileBlocks[2] PACK; } dirslot; typedef struct bufferinfo_s { int mode; /* Mode on this buffer */ int readmode; /* Is this channel for reading or writing */ BYTE *buffer; /* Use this to save data */ BYTE *slot; /* Save data for directory-slot */ int bufptr; /* Use this to save/read data to disk */ int track; /* which track is allocated for this sector */ int sector; /* (for write files only) */ int length; /* Directory-read length */ } bufferinfo_t; typedef struct _DRIVE DRIVE; typedef int (*drive_attach_func_t)(DRIVE *); typedef int (*drive_detach_func_t)(DRIVE *); /* Run-time data struct for each drive. */ struct _DRIVE { int type; /* Device */ /* Current image file */ int mode; /* Read/Write */ int ImageFormat; /* 1541/71/81 */ int ActiveFd; char ActiveName[256]; /* Image name */ char ReadOnly; int unit; /* Function to call after the image is attached. */ drive_attach_func_t attach_func; /* Function to call before the image is detached. */ drive_detach_func_t detach_func; /* Disk Format Constants */ int D64_Header; /* flag if file has header! */ int GCR_Header; /* flag if file is GCR image. */ int Bam_Track; int Bam_Sector; int Dir_Track; int Dir_Sector; /* Drive information */ int NumBlocks; /* Total Count (683) */ int NumTracks; int BSideTrack; /* First track on the second side (1571: 36) */ int ErrFlg; /* Flag if Error Data is available */ char *ErrData; BYTE *dosrom; BYTE *dosram; BYTE bam[256]; bufferinfo_t buffers[16]; /* File information */ BYTE Dir_buffer[256]; /* Current DIR sector */ int SlotNumber; char *find_name; /* Search pattern */ int find_length; int find_type; int Curr_track; int Curr_sector; }; /* Actually, serial-code errors ... */ #define FLOPPY_COMMAND_OK 0 #define FLOPPY_ERROR (2) /* Return values used around. */ #define FD_OK 0 #define FD_EXIT 1 /* -1,0, 1 are fixed values */ #define FD_NOTREADY -2 #define FD_CHANGED -3 /* File has changed on disk */ #define FD_NOTRD -4 #define FD_NOTWRT -5 #define FD_WRTERR -6 #define FD_RDERR -7 #define FD_INCOMP -8 /* DOS Format Mismatch */ #define FD_BADIMAGE -9 /* ID mismatch (Disk or tape) */ #define FD_BADNAME -10 /* Illegal filename */ #define FD_BADVAL -11 /* Illegal value */ #define FD_BADDEV -12 #define FD_BAD_TS -13 /* Track or sector */ #define CHK_NUM 0 #define CHK_RDY 1 #define CHK_EMU 2 /* Is image block based */ #define D64_FILE_SIZE_35 174848 /* D64 image, 35 tracks */ #define D64_FILE_SIZE_35E 175531 /* D64 image, 35 tracks with errors */ #define D64_FILE_SIZE_40 196608 /* D64 image, 40 tracks */ #define D64_FILE_SIZE_40E 197376 /* D64 image, 40 tracks with errors */ #define IS_D64_LEN(x) ((x) == D64_FILE_SIZE_35 || (x) == D64_FILE_SIZE_35E || \ (x) == D64_FILE_SIZE_40 || (x) == D64_FILE_SIZE_40E) /* * Input Processor Error Codes */ #define IPE_OK 0 #define IPE_DELETED 1 #define IPE_SEL_PARTN 2 /* 1581 */ #define IPE_UNIMPL 3 #define IPE_WRITE_PROTECT_ON 26 #define IPE_SYNTAX 30 #define IPE_INVAL 31 #define IPE_LONG_LINE 32 #define IPE_BAD_NAME 33 #define IPE_NO_NAME 34 #define IPE_NOT_WRITE 60 #define IPE_NOT_OPEN 61 #define IPE_NOT_FOUND 62 #define IPE_FILE_EXISTS 63 #define IPE_BAD_TYPE 64 #define IPE_NO_BLOCK 65 #define IPE_ILLEGAL_TRACK_OR_SECTOR 66 #define IPE_NO_CHANNEL 70 #define IPE_DISK_FULL 72 #define IPE_DOS_VERSION 73 #define IPE_NOT_READY 74 #define IPE_BAD_PARTN 77 /* 1581 */ #define IPE_NOT_EMPTY 80 /* dir to remove not empty */ #define IPE_PERMISSION 81 /* permission denied */ /* * Error messages */ typedef struct errortext_s { int nr; char *text; } errortext_t; /* ------------------------------------------------------------------------- */ extern int initialize_1541(int dev, int type, drive_attach_func_t attach_func, drive_detach_func_t detach_func, DRIVE *oldinfo); extern int find_devno(int dev, const char *name); extern int attach_floppy_image(DRIVE *floppy, const char *name, int mode); extern void detach_floppy_image(DRIVE *floppy); extern int open_1541(void *floppy, char *name, int length, int secondary); extern int close_1541(void *floppy, int secondary); extern int read_1541(void *floppy, BYTE *data, int secondary); extern int write_1541(void *floppy, BYTE data, int secondary); extern void flush_1541(void *floppy, int secondary); extern int write_fs(void *floppy, BYTE data, int secondary); extern int read_fs(void *floppy, BYTE *data, int secondary); extern int open_fs(void *floppy, char *name, int length, int secondary); extern int close_fs(void *floppy, int secondary); extern void flush_fs(void *floppy, int secondary); extern int ip_execute(DRIVE *floppy, BYTE *buf, int length); extern int do_validate(DRIVE *floppy); extern int check_track_sector(int format, int track, int sector); extern int floppy_read_block(int fd, int format, BYTE *buf, int track, int sector, int d64); extern int floppy_write_block(int fd, int format, BYTE *buf, int track, int sector, int d64); extern int get_std64_header(int fd, BYTE *header); extern int check_header(int fd, hdrinfo *hdr); extern int get_diskformat(int devtype); extern int num_blocks(int format, int tracks); extern void no_a0_pads(BYTE *ptr, int l); extern int free_sector (BYTE *bam, int track, int sector); extern int allocate_sector (BYTE *bam, int track, int sector); extern char *floppy_read_directory(DRIVE *floppy, const char *pattern); extern int floppy_parse_name ( char *name, int length, char *realname, int *reallength, int *readmode, int *filetype, int *rl ); void set_disk_geometry(DRIVE *floppy, int type); int compare_filename(char *name, char *pattern); void fs_error(int code); char *read_disk_image_contents(const char *fname); #endif /* _DRIVE_H */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.