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

  1. 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));
}
  1. 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:

  1. Power on system
  2. Boot loader detects CF card:
if (ide_drives[CF_MASTER].present) {
    active_drive = CF_MASTER;
}
  1. 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)