Version 1 (modified by 10 years ago) ( diff ) | ,
---|
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|Wrire| |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.