File System Layout
Sector | Description |
---|---|
0 | Boot Sector |
1 - 16 | Kernel Image (8k) |
17 - AS | Alloction Table |
AS+1 - AS+8 | Master Directory |
AS+9 - | Data Sectors |
AS is computed as (total_sectors/sectors_per_au)/entries_per_sector + 17
total_sectors - Total number of sectors on disk
sectors_per_au - Number of sectors per allocation unit (default 8, 4k AUs)
entries_per_sector = 256 when less than 65535 allocation units, otherwise 128
The allocation table is setup as AU chain. The directory entry for a file specifies the first AU number. The allocation table then has a pointer to the next AU for a file. There are 2 special AU codes:
0FFFFh | Unavailable AU |
0FEFEh | End of chain |
Boot Sector Layout
Byte Offset | Description> |
---|---|
0-255 | Boot code |
256-259 | Total sector count on disk |
260 | File system type (1=elfos, others are undefined) |
261-264 | First sector of Master Directory |
265-266 | Size of AU in sectors |
267-270 | Number of AUs |
Directory structure: -------------------- byte description 0-3 First Sector, 0=free entry 4-5 eof byte 6 flags1 0 - file is a subdir 7-8 Packed date 9-10 Packed time 11-31 filename Date format: Time Format: ------------ ------------ 7654 3210 7654 3210 7654 3210 7654 3210 |_______|____|_____| |____||______||____| YEAR MO DY HR MIN SEC/2
; ************************************ ; *** Define disk boot sector *** ; *** This runs at 100h *** ; *** Expects to be called with R0 *** ; ************************************ call: equ 0ffe0h ret: equ 0fff1h scall: equ r4 sret: equ r5 boot: ghi r0 ; get current page phi r3 ; place into r3 ldi low bootst ; boot start code plo r3 sep r3 ; transfer control bootst: ldi high call ; setup call vector phi r4 ldi low call plo r4 ldi high ret ; setup return vector phi r5 ldi low ret plo r5 ldi 0 ; setup an initial stack phi r2 ldi 0f0h plo r2 ldi 1 ; setup sector address plo r7 ldi 3 ; starting page for kernel phi rf ; place into read pointer ldi 0 plo rf sex r2 ; set stack pointer bootrd: glo r7 ; save R7 stxd ldi 0 ; prepare other registers phi r7 plo r8 ldi 0e0h phi r8 sep scall ; call bios to read sector dw f_ideread irx ; recover R7 ldxa plo r7 inc r7 ; point to next sector glo r7 ; get count smi 17 ; was last sector (16) read? bnz bootrd ; jump if not ldi 3 ; setup jump to os phi r0 ldi 0 plo r0 sep r0 ; jump to os
org 0 ldi 0 phi r2 ldi 0ffh plo r2 sex r2 lbr 0ff00h