Introduction
UCSD Pascal was a language/virtual machine/OS/File System developed by the University of California, San Diego. Apple sold an Apple II implementation/port. IIgs System 6 included a read-only Apple Pascal FST.
The Pascal File system used 512k blocks (like ProDOS) and 2-byte block pointers (which implies a maximum disk size of 32 Meg, like ProDOS). Files don't store their file size per se, but rather the start block, end block, and size of last block. This implies a maximum file size of 32 Meg, minus the overhead of boot and volume blocks.
Block 0 and 1 contain boot code. Blocks 2--5 contain the volume header and up to 77 file entries. When a file is deleted, all subsequent records are moved up.
Volume Header
All values are little-endian unless specified otherwise. All blocks are 512 bytes in length.
Name | Offset | Size |
---|---|---|
first_block | $00 | 2 bytes |
last_block | $02 | 2 bytes |
file_kind | $04 | 1 byte |
reserved | $05 | 1 byte |
volume_name | $06 | 8 bytes |
volume_last_block | $0e | 2 bytes |
file_count | $10 | 2 byte |
load_time | $12 | 2 bytes |
boot_date | $14 | 2 bytes |
reserved | $16 | 4 bytes |
fields
first_block
The first block of the file system header (boot block and directory blocks) This should always be 0.
last_block
The block after the last block of the directory structure. (i.e., the next available block). This should always be 6.
file_kind
This should always be 0.
volume_name
The volume name, stored with a leading length byte (i.e., a pstring). May be 1--7 characters in length.
volume_last_block
The number of blocks on the volume.
file count
The number of files. May be 0--77.
load_time
????
boot_date
The date last booted.
File Entry
Name | Offset | Size |
---|---|---|
first_block | $00 | 2 bytes |
last_block | $02 | 2 bytes |
file_kind | $04 | 1 byte |
status | $05 | 1 byte |
file_name | $06 | 16 bytes |
last_byte | $16 | 2 bytes |
modification_date | $18 | 2 bytes |
fields
first_block
The first block of the file
last_block
The block after the last file block (i.e., the next available block).
file_kind
Name | Value | Use |
---|---|---|
untypedfile | $00 | Volume Header |
xdskfile | $01 | Bad blocks |
codefile | $02 | Machine executable code |
textfile | $03 | Text |
infofile | $04 | Debugger Information |
datafile | $05 | Data |
graffile | $06 | Compressed graphic image * |
fotofile | $07 | Screen image |
securedir | $08 | Subdirectory [???] * |
*
Not implemented.
status
Used by wildcard file listings [???]
N.B. -- bit 0 is the status bit, all other bits are reserved.
file_name
The file name, stored with a leading length byte (i.e., a pstring). May be 1--15 characters in length.
last_byte
The number of bytes used in the last block. Should be 1--512.
modification_date
The date the file was created or last modified.
Dates
Dates are stored in a 2 bytes structure:
Field | bits | range |
---|---|---|
year | 15--9 | 0-100 |
day | 8--4 | 0--31 |
month | 0--3 | 0 -- 12 |
yyyy yyyd dddd mmmm
Year 100 is used to indicate a temporary file.
File Name Restrictions
There seems to be a lot of bad information about file name restrictions. Wikipedia states:
Apple Pascal dropped the length to fifteen characters and allowed only letters, numbers and periods to be used.
The UCSD Pascal II manual states:
A volume name be be 7 or less characters long and may not contain '=', '$', '?' or ','.
A legal filename can consist of up to 15 characters. ... Lower-case letters are translated to upper-case, and blanks and non-printing characters are removed from the filename. Legal characters for filenames are the alphanumerics and the special characters '-', '/', '', '', and '.'.
Research (with the file manager) has shown that the only illegal characters are:
- $
- =
- ?
- ,
- whitespace (stripped out)
Additionally, the file manager cannot create (or transfer to) files with a '['. I did not try creating a '[' file programmatically, so its status is ambiguous.
For volume names, ':' and subsequent characters are stripped. The illegal filename characters are allowed but confuse the file manager. You can still refer to the disk by volume number though.