Magic‐1 CF Card Boot Process - retrotruestory/M1DEV GitHub Wiki
Based on the provided source code (particularly bloader.c), here's how the Magic-1 system loads from a CF card:
Magic-1 CF Card Boot Process
1. Storage Layout
Sector 0-1: Reserved
Sector 2: Image Table Directory
Sectors 3+: Boot Images (256 sectors per image)
2. CF Card Initialization
// CF Configuration
#define CF_MODE 0xE0 // MASTER, LBA mode
#define FEATURE_8_BIT 0x01 // 8-bit mode
#define CF_MASTER 0x02 // CF as master device
3. Initialization Sequence
void cf_init(int drive, int mode) {
// 1. Reset CF card
cf_base[FEATURE_REG] = CMD_RESET;
cf_wait();
// 2. Set 8-bit mode
cf_base[LBA_3] = mode;
cf_base[FEATURE_REG] = FEATURE_8_BIT;
cf_base[COMMAND_REG] = CMD_SET_FEATURE;
cf_wait();
}
4. Boot Image Loading Process
- Read Image Table:
void read_image_table(t_image_table image_table, int tgt_drive) {
// Read directory from sector 2
read_sector(2, buf, tgt_drive);
memcpy((char*)image_table, buf, sizeof(t_image_table));
}
- Load Boot Image:
void cf_read_sector(int sector, char* buf, int drive) {
// Set up LBA addressing
cf_sector_setup(sector);
// Issue read command
cf_base[COMMAND_REG] = CMD_READ;
// Read 512 bytes
cf_read_512(buf);
}
5. Boot Process
1. Initialize CF interface
2. Check for CF card presence
3. Read image table from sector 2
4. Select boot image (default or user selected)
5. Load image into memory
6. Transfer control to loaded image
Example Usage
To boot from CF card:
- Power on system
- Boot loader detects CF card:
if (ide_drives[CF_MASTER].present) {
active_drive = CF_MASTER;
}
- Auto-boot sequence:
if ((active_drive != NO_DRIVES) && default_boot()) {
printf("Booting default image.\n");
read_image_table(image_table, active_drive);
boot_image(TRUE);
}
The CF card should be formatted with:
- First 2 sectors reserved
- Boot directory in sector 2
- Boot images starting at sector 3
- Each image can be up to 256 sectors (128KB)