You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.0 KiB
Plaintext
128 lines
4.0 KiB
Plaintext
MineCraft FileSystem (MCFS) documentation
|
|
|
|
|
|
Disk format
|
|
|
|
Each floppy disk capacity is limited to 2048 sectors by the disk drive.
|
|
Each sector is 128 bytes long so the maximum physical capacity of a disk
|
|
is 256 kilobytes. An MCFS formatted disk can hold (2048-16)*126 bytes
|
|
(250 kilobytes) of user data.
|
|
|
|
Sector Description
|
|
0 - 3 MCFS boot loader
|
|
4 - 5 Sector allocation map (2048 bits, one bit / sector)
|
|
6 - 15 Directory (4 entries / sector, maximum 40 entries)
|
|
16 - 2047 Available for files
|
|
|
|
|
|
|
|
Boot loader
|
|
|
|
This small loader only job is to load the bootable programs which are
|
|
then executed. The boot loaders remaps itself after the execution into the
|
|
two stack area at $0100 and $0200 which makes possible to load the program
|
|
from $0500 like the original RPC8/e boot code does.
|
|
|
|
Most of the possible cases are handled and visible during the boot sequence,
|
|
these are the following:
|
|
- detects drive errors during the boot (for example: destroyed cable)
|
|
- handles read errors (for example: a truncated disk image)
|
|
- detects available memory and display and error message when a programs
|
|
doesn't fit into the memory.
|
|
- warns if disk is not bootable
|
|
|
|
Sector Byte
|
|
0-3 0-511 Boot loader which is loaded to memory and started at
|
|
address $0500
|
|
|
|
0 122-123 Starting sector of the bootable file.
|
|
If sector = 0 then the disk is not bootable.
|
|
|
|
0 124-127 MCFS magic constant: $4d $43 $46 $53 "MCFS"
|
|
|
|
|
|
|
|
Sector allocation map
|
|
|
|
Sector allocation map (SAM) is a plain bitmap for each physical sector.
|
|
Bitmap is linear, however the least significant bit is on the left
|
|
|
|
Sector Byte Content
|
|
4 0 SAM for sector 0-7
|
|
Example: the byte value is $a5 so the sector availability
|
|
looks like this:
|
|
|
|
2^7 6 5 4 3 2 1 0
|
|
-------------------
|
|
1 0 1 0 0 1 0 1
|
|
|
|
sector: 0 1 2 3 4 5 6 7
|
|
|
|
in this case sector 0,2,5 and 7 is occupied and sector
|
|
1,3,4,6 is available.
|
|
|
|
4 1 SAM for sector 8-15
|
|
4 2 SAM for sector 15-23
|
|
... ...
|
|
4 127 SAM for sector 1016-1023
|
|
5 0 SAM for sector 1024-1031
|
|
5 1 SAM for sector 1032-1039
|
|
... ...
|
|
5 126 SAM for sector 2032-2039
|
|
5 127 SAM for sector 2040-2047
|
|
|
|
|
|
Directory structure
|
|
|
|
The first entry of a directory structure is the header which contains the name
|
|
of the disk. Each entry is 32 bytes long, the maximum length of a filename
|
|
is 28. Each sector is 128 bytes long so 4 entries fits into one sector.
|
|
10 sectors are available for directory entries so the maximum capacity is 39
|
|
files plus the header (40 in total).
|
|
|
|
Sector Byte Content
|
|
6 0- 3 Unused
|
|
6 4-31 Disk name. all characters MSB is set to 1 ($80)
|
|
|
|
6 32-63 Directory entry #1
|
|
6 32-33 Starting sector of the file.
|
|
If sector = 0 the directory entry is free.
|
|
6 34-35 Size of the file in sectors
|
|
6 36-63 File name
|
|
|
|
6 64-95 Directory entry #2
|
|
6 64-65 Starting sector of the file.
|
|
If sector = 0 the directory entry is free.
|
|
6 66-67 Size of the file in sectors
|
|
6 68-95 File name
|
|
|
|
... ...
|
|
|
|
15 96-127 Directory entry #39
|
|
15 96- 97 Starting sector of the file.
|
|
If sector = 0 the directory entry is free.
|
|
15 98- 99 Size of the file in sectors
|
|
15 100-127 File name
|
|
|
|
|
|
File format
|
|
|
|
First two bytes of each sector were used as a pointer to the next sector
|
|
of the file, so only 126 out of the 128 bytes of a sector were used for file
|
|
contents. In the last sector of a file the higher value of a pointer is set
|
|
to $ff and the lower value of the pointer holds the remaining bytes used on
|
|
the actual sector.
|
|
|
|
Sector Byte
|
|
xx 0-1 Pointer to next sector #yy (word)
|
|
If byte 1 is $ff then the number of bytes which used
|
|
within the sector is contained in byte 0.
|
|
xx 2-127 User data
|
|
|
|
yy 0-1 Pointer to next sector #zz (word)
|
|
If byte 1 is $ff then the number of bytes which used
|
|
within the sector is contained in byte 0.
|
|
yy 2-127 User data
|
|
|
|
zz ...
|