The interface to the filesystems is handled by the standard send/receive and stream routines. To access a file, a message has to be sent to the filesystem manager, i.e. to task id SEND_FM. To 'mount' a filesystem to a drive, the task has to register itself with the filesystem manager. To do this, it sends a message of type FM_REG to the filesystem manager. In PCBUF ($0200), the message contains the number of drives to register (FM_REG_DRVS) and the task id of the filesystem task (FM_REG_ENV). /* FileManager */ #define SEND_FM $fe #define FM_REG 0 #define FM_REG_DRVS 0 #define FM_REG_ENV 1 All other messages to the filesystem manager have to have the drive in PCBUF+FM_OPEND_DRV to allow easy redirection. '/' is used to separate dirs from each other in a filename. #define FM_OPEN_DRV 0 #define DIRSIGN "/" /* Trennzeichen zwischen Verzeichnissen */ The following message types are defined, although not all have been implemented. #define FS_OPEN_RD 1 /* Open file for reading only */ #define FS_OPEN_WR 2 /* Open file for writing only (with error if file exists) */ #define FS_OPEN_RW 3 /* Open file for read and write */ #define FS_OPEN_OW 4 /* Open file for overwriting */ #define FS_OPEN_AP 5 /* Open file for append */ #define FS_OPEN_DR 6 /* Open directory for reading */ #define FS_RENAME 7 /* rename file */ #define FS_DELETE 8 /* remove file */ #define FS_FORMAT 9 /* format disk */ #define FS_CHKDSK 10 /* check disk */ #define FS_CLOSE 11 /* close file (only for FS_OPEN_RW) */ #define FS_RMDIR 12 /* remove subdirectory */ #define FS_MKDIR 13 /* create subdirectory */ #define FS_CHDIR 14 /* ---- */ #define FS_ASSIGN 15 /* ---- */ /* struct, that has to be sent in PCBUF for any FS_OPEN_* message */ /* after a successful open with FS_OPEN_RD/WR/OW/AP, the filesystem tries to read data from stream or write to it. It ends when it gets an E_EOF on reading streams or E_NUL on writing streams. If a file is read to the end, the filesystem decrements the write task counter (thus signaling the end of file) and closes the file internally */ #define FS_OPEN_DRV 0 /* drive = FM_OPEN_DRV */ #define FS_OPEN_STR 1 /* stream over which the data is transfered */ #define FS_OPEN_PFAD 2 /* ---- */ #define FS_OPEN_NAME 3 /* name of the file to be opened */ /* struct to be sent for any message except FS_OPEN_* */ #define FS_CMD_DRV 0 /* target drive */ #define FS_CMD_PFAD 1 /* --- */ #define FS_CMD_FIL 2 /* --- */ #define FS_CMD_NAME 3 /* for rename, the original filename has to be sent as usual, but after the nullbyte at the end of the first name follows the name the file has to be renamed to, ended with a nullbyte */ /* struct that is sent back by the filesystem task */ #define FS_X_ERR 0 /* error code, that is also returned in the accumulator */ #define FS_X_ENV 1 /* task id of filesystem task */ #define FS_X_FIL 2 /* file handle (for FS_OPEN_RW only) */ #define FS_X_SLEN 3 /* length of this struct (not sent) */ A directory is being read as a normal file, but the file has a structrure, that is being described here. /* struct of a directory entry in a directory file */ #define FS_DIR_LEN 0 /* length of file, 4 byte, lo byte first */ #define FS_DIR_YEAR 4 /* year -1900, */ #define FS_DIR_MONTH 5 /* month, */ #define FS_DIR_DAY 6 /* day, */ #define FS_DIR_HOUR 7 /* hour, */ #define FS_DIR_MIN 8 /* minute, */ #define FS_DIR_SEC 9 /* and second of last change */ #define FS_DIR_MODE 10 /* type of file */ #define FS_DIR_NAME 11 /* name, ended with a nullbyte */ /* file types */ #define FS_DIR_MOD_FIL 0 /* normal file */ #define FS_DIR_MOD_NAM 1 /* disk name */ #define FS_DIR_MOD_FRE 2 /* number of free bytes in FS_DIR_LEN */ #define FS_DIR_MOD_DIR 3 /* subdirectory */ Now comes the definition of an executable file, as interpreted by the ROM startup and by the shell. /* Prg-Header */ #define P_KIND 0 /* type of program */ #define P_MEM 1 /* memory size in kByte */ #define P_RES 2 /* --- */ #define P_ADR 4 /* start address of program */ #define P_TAB 6 /* memory relocation table: a series of two bytes, the first describing the position in the MMU map, the second the memory block to map in this position. This is used to map the ROM in the memory for autostart executables. The table is ended with a single $ff. */ /* Prg-types */ #define PK_PRG 0 /* program executable */ #define PK_DEV 1 /* device block - memory size is ignored and exactly one position in the relocation table has to be set. These values are given to REGDEV. #define PK_FS 2 /* filesystem - STD* streams are set to STDNUL */ Appendix -------- For the FAT filesystem, several disk sizes have been defined for the format command. The disk size is stored in the FS_CMD_PFAD byte in PCBUF. dsize kByte pages tracks sectors blocksize dd/hd comment ------------------------------------------------------------ 0 360 1 80 9 512 dd Atari ST single sided 1 720 2 80 9 512 dd 3.5" 2 1440 2 80 18 512 hd 3.5" 3 1200 2 80 15 512 hd 5.25" 4 1280 2 80 8 1024 hd 5.25" 5 360 2 40 9 512 dd 5.25"