CPC-CompactFlash
This very simple interface (only 2 74LSxx chips) allows the use of a CompactFlash memory card on the CPC. It uses the 8 bit mode of the compact flash, making it even simpler than the IDE interfaces you can find elsewhere.
Schematics
http://www.circuitbee.com/circuit/view/0000000374
Also available (with PCB routing) in the SVN repository.
Programming information
The interface maps the registers at addresses FEF0-FEFF :
Address | Read | Write |
---|---|---|
FEF0 | Data | Data |
FEF1 | Error | Feature |
FEF2 | Sector count | Sector count |
FEF3 | LBA 0 | LBA 0 |
FEF4 | LBA 1 | LBA 1 |
FEF5 | LBA 2 | LBA 2 |
FEF6 | Drive/LBA 3 | Drive/LBA 3 |
FEF7 | Status | Command |
Sector are accessed using 28-bit sector numbers in registers FEF3-FEF6. Only the 4 low bits of FEF6 are used, the 4 high bits must be set to E to enable LBA mode on the master drive.
Initializing
First of all, set the compact flash card to 8-bit mode:
OUT &FEF6,&E0 ' Select master drive in LBA mode OUT &FEF2,1 ' Sector count = 1 OUT &FEF3,0 ' Select first sector on drive OUT &FEF4,0 OUT &FEF5,0 OUT &FEF1,1 ' 8bit mode feature code OUT &FEF7,&EF ' execute SET FEATURE command
You can then identify the card:
OUT &FEF6,&E0 ' Select master drive in LBA mode OUT &FEF2,1 ' Sector count = 1 OUT &FEF3,0 ' Select first sector on drive OUT &FEF4,0 OUT &FEF5,0 OUT &FEF7,&EC ' Send IDENTIFY command ' Wait for the card to become ready to send data loop A = IN &FEF7 IF A > &7F GOTO loop ' Get the drive identification in IDENT array FOR i = 0 to 512 IDENT(i) = IN &FEF0 NEXT i
The identification data is 512 bytes long and has information about the card (manufacturer id, model number, ...) and its capacity and format, and a few other less important things.
You can also read sectors:
OUT &FEF6,&E0 ' Select master drive in LBA mode OUT &FEF2,1 ' Sector count = 1 OUT &FEF3,0 ' Select first sector on drive OUT &FEF4,0 OUT &FEF5,0 OUT &FEF7,&20 ' Send READ SECTOR WITH RETRY command loop A = IN &FEF7 IF A > &7F GOTO loop ' Get the sector in DATA array FOR i = 0 to 512 DATA(i) = IN &FEF0 NEXT i
Using a filesystem
Currently, no filesystem is available. Write one or wait for AmélieDOS to be released! Meanwhile, you can have fun with reading and writing sectors.