; Эдесь лежат макросы FatFs.
; Все аргументы передаются через стек, в порядке их перечисления.
; Длинна аргумента кратна двум, то есть, если аргумент типа BYTE,
; то он занимает на стеке два байта.
; Если аргумент типа DWORD, то на стек сначала кладем старшие два байта, затем младшие.
; После выполнения функции все аргументы остаются на стеке,
; не забывайте снимать ненужные (за исключением f_voltopart).
;
; При попадании в функцию на стеке должен быть адрес возврата, затем список переменных.
;
; Строковая переменная должна заканчиватся 0x0 (нулём).
; Можно использовать как абсолютный, так и относительный путь:
; "file.txt" A file in the current directory of the current drive
; "/file.txt" A file in the root directory of the current drive
; "" The current directory of the current drive
; "/" The root directory of the current drive
; "2:" The current directory of the drive 2
; "2:/" The root directory of the drive 2
; "2:file.txt" A file in the current directory of the drive 2
; "../file.txt" A file in the parent directory
; "." This directory
; ".." Parent directory of the current directory
; "dir1/.." The current directory
; "/.." The root directory (sticks the top level)
; Возвращаемый параметр лежит в HL, если DWORD то DEHL.
;
; Левые порты должны быть скрыты (MEM_HIDE)
; Стек должен быть в текущем адресном пространстве (юзается очень сильно байт 100-200
; свободно может заюзать). И переменные(если на них есть указатель в
; аргументах, а также глобальные переменные типа FATFS), тоже должны быть доступны.
include "ffsfunc.asm"
STRUCT FFS_DRV
init defw
status defw
rd_to_usp defw
rd_to_buf defw
wr_fr_usp defw
wr_fr_buf defw
RTC defw
strcpy_lib2usp defw
strcpy_usp2lib defw
memcpy_lib2usp defw
memcpy_usp2lib defw
memcpy_buf2usp defw
memcpy_usp2buf defw
dio_drv defb
dma_addr defw
lba_ptr defw
count defb
curr_fatfs defw
curr_dir0 defw
curr_dir2 defw
ENDS
;(((OUT&03fff)==037f7)&&(VAL==0))
;------------------------СТРУКТУРЫ FATFS --------------------------------------
FA_READ=0x01 ;Specifies read access to the object. Data can be read from the file.
;Combine with FA_WRITE for read-write access.
FA_WRITE=0x02 ;Specifies write access to the object. Data can be written to the file.
;Combine with FA_READ for read-write access.
FA_OPEN_EXISTING=0x00 ;Opens the file. The function fails if the file is not existing. (Default)
FA_OPEN_ALWAYS=0x10 ;Opens the file if it is existing. If not, a new file is created.
;To append data to the file, use f_lseek function after file open in this method.
FA_CREATE_NEW=0x04 ;Creates a new file. The function fails with FR_EXIST if the file is existing.
FA_CREATE_ALWAYS=0x08 ;Creates a new file. If the file is existing, it is truncated and overwritten.
;/* File system object structure (FATFS) */
STRUCT FATFS
fs_type BYTE; /* FAT sub-type (0:Not mounted) */
drv BYTE 0; /* Physical drive number */
part BYTE 0; /* Partition # (0-4) 0-auto*/
csize BYTE; /* Sectors per cluster (1,2,4...128) */
n_fats BYTE; /* Number of FAT copies (1,2) */
wflag BYTE; /* win[] dirty flag (1:must be written back) */
fsi_flag BYTE; /* fsinfo dirty flag (1:must be written back) */
id WORD; /* File system mount ID */
n_rootdir WORD; /* Number of root directory entries (FAT12/16) */
last_clust DWORD; /* Last allocated cluster */
free_clust DWORD; /* Number of free clusters */
fsi_sector DWORD; /* fsinfo sector (FAT32) */
cdir DWORD; /* Current directory start cluster (0:root) */ ;TODO use
n_fatent DWORD; /* Number of FAT entries (= number of clusters + 2) */
fsize DWORD; /* Sectors per FAT */
fatbase DWORD; /* FAT start sector */
dirbase DWORD; /* Root directory start sector (FAT32:Cluster#) */
database DWORD; /* Data start sector */
winsect DWORD; /* Current sector appearing in the win[] */
win BLOCK 512; /* Disk access window for Directory, FAT (and Data on tiny cfg) */
ENDS
FATFS_sz=51+512
;/* Directory object structure (DIR) */
STRUCT DIR
FS WORD ;/* POINTER TO THE OWNER FILE SYSTEM OBJECT */
ID WORD ;/* OWNER FILE SYSTEM MOUNT ID */
INDEX WORD ;/* CURRENT READ/WRITE INDEX NUMBER */
SCLUST DWORD ;/* TABLE START CLUSTER (0:ROOT DIR) */ ;видимо, в том же формате, что FATFS.cdir
CLUST DWORD ;/* CURRENT CLUSTER */
SECT DWORD ;/* CURRENT SECTOR */
DIR WORD ;/* POINTER TO THE CURRENT SFN ENTRY IN THE WIN[] */
FN WORD ;/* POINTER TO THE SFN (IN/OUT) {FILE[8],EXT[3],STATUS[1]} */
lfn WORD ;/* Pointer to the LFN working buffer */
lfn_idx WORD ;/* Last matched LFN index number (0xFFFF:No LFN) */
ENDS
DIR_sz=22+4
;/* FILE STATUS STRUCTURE (FILINFO) */
; STRUCT FILINFO
;FSIZE DWORD ;/* FILE SIZE */
;FDATE WORD ;/* LAST MODIFIED DATE */
;FTIME WORD ;/* LAST MODIFIED TIME */
;FATTRIB BYTE ;/* ATTRIBUTE */
;FNAME BLOCK 13,0 ;/* SHORT FILE NAME (8.3 FORMAT with dot and terminator) */
;LNAME BLOCK 64,0 ;/* LONG FILE NAME (ASCIIZ) */
; ENDS
;/* File object structure (FIL) */
struct FIL
FS WORD ;/* Pointer to the owner file system object */
ID WORD ;/* Owner file system mount ID */
FLAG BYTE ;/* File status flags */
PAD1 BYTE ;;TODO добавить тут id приложения-хозяина, чтобы можно было автоматически удалить
FPTR DWORD ;/* File read/write pointer (0 on file open) */
FSIZE DWORD ;/* File size */
FCLUST DWORD ;/* File start cluster (0 when fsize==0) */
CLUST DWORD ;/* Current cluster */
DSECT DWORD ;/* Current data sector */
DIR_SECT DWORD ;/* Sector containing the directory entry */
DIR_PTR WORD ;/* Ponter to the directory entry in the window */
BUF BLOCK 512 ;/* File data read/write buffer */
ENDS
FIL_sz=32+512
;---------------------------------МАКРОСЫ--------------------------------------
;/*-----------------------------------------------------------------------*/
;/* Mount/Unmount a Logical Drive */
;/*-----------------------------------------------------------------------*/
;
;FRESULT f_mount (
; BYTE vol, /* Logical drive number to be mounted/unmounted */
; FATFS *fs /* Pointer to new file system object (NULL for unmount)*/
;)
MACRO F_MOUNT _VOL,_FS ;vol - уже лежит на стеке.
ld e,_VOL
LD bc,_FS
F_MNT
ENDM
MACRO F_MNT
call ffsfunc.f_mount
ENDM
; FRESULT f_open (
; FIL *fp, /* Pointer to the blank file object */
; TCHAR *path, /* Pointer to the file name */
; BYTE mode /* Access mode and file open mode flags */
; )
;de=fil
;hl=flags
;bc=filename
MACRO F_OP
call open_keeppid
PUSH HL
LD hl,ffsfunc.f_open
call call_ffs
POP BC
ENDM
MACRO F_OPEN_CURDRV
call open_keeppid
PUSH HL
LD hl,ffsfunc.f_open
call call_ffs_curvol
POP BC
ENDM
;seek
;FRESULT f_lseek (
; FIL *fp, /* Pointer to the file object */
; DWORD ofs /* File pointer from top of file */
;)
;fp = de
;ofs in stack
MACRO F_LSEEK_CURDRV
ld hl,ffsfunc.f_lseek
call call_ffs_curvol
ENDM
;/*-----------------------------------------------------------------------*/
;/* Read File */
;/*-----------------------------------------------------------------------*/
;FRESULT f_read
; FIL *fp, /* Pointer to the file object */
; void *buff, /* Pointer to data buffer */
; UINT btr, /* Number of bytes to read */
; UINT *br /* Pointer to number of bytes read */
MACRO F_READ_CURDRV
ld hl,ffsfunc.f_read
call call_ffs_curvol
ENDM
;/*-----------------------------------------------------------------------*/
;/* Write File */
;/*-----------------------------------------------------------------------*/
;FRESULT f_write
; FIL *fp, /* Pointer to the file object */
; const void *buff, /* Pointer to the data to be written */
; UINT btw, /* Number of bytes to write */
; UINT *bw /* Pointer to number of bytes written */
MACRO F_WRITE_CURDRV
ld hl,ffsfunc.f_write
call call_ffs_curvol
ENDM
; /*-----------------------------------------------------------------------*/
; /* Close File */
; /*-----------------------------------------------------------------------*/
; FRESULT f_close (
; FIL *fp /* Pointer to the file object to be closed */)
MACRO F_CLOS_CURDRV ;de=fil
ld a,d
or e
call nz,f_clos_curdrv_pp
ENDM
; /*-----------------------------------------------------------------------*/
; /* Create a Directory Object */
; /*-----------------------------------------------------------------------*/
; FRESULT f_opendir
; DIR *dj, /* Pointer to directory object to create */
; TCHAR *path /* Pointer to the directory path */
MACRO F_OPDIR_CURDRV
ld hl,ffsfunc.f_opendir
call call_ffs_curvol
ENDM
; /*-----------------------------------------------------------------------*/
; /* Read Directory Entry in Sequence */
; /*-----------------------------------------------------------------------*/
; FRESULT f_readdir (
; DIR *dj, /* Pointer to the open directory object */
; FILINFO *fno /* Pointer to file information to return */
; )
MACRO F_RDIR_CURDRV
ld hl,ffsfunc.f_readdir
call call_ffs_curvol
ENDM
;/*-----------------------------------------------------------------------*/
;/* Delete a File or Directory */
;/*-----------------------------------------------------------------------*/
;FRESULT f_unlink
; const TCHAR *path /* Pointer to the file or directory path */
MACRO F_UNLINK_CURDRV
ld hl,ffsfunc.f_unlink
call call_ffs_curvol
ENDM
MACRO F_UNLINK
ld hl,ffsfunc.f_unlink
call call_ffs
ENDM
;/*-----------------------------------------------------------------------*/
;/* Create a Directory */
;/*-----------------------------------------------------------------------*/
;FRESULT f_mkdir
; const TCHAR *path /* Pointer to the directory path */
MACRO F_MKDIR
ld hl,ffsfunc.f_mkdir
call call_ffs
ENDM
;/*-----------------------------------------------------------------------*/
;/* Rename File/Directory */
;/*-----------------------------------------------------------------------*/
;FRESULT f_rename
; const TCHAR *path_old, /* Pointer to the old name */
; const TCHAR *path_new /* Pointer to the new name */
MACRO F_RENAME
ld hl,ffsfunc.f_rename
call call_ffs
ENDM
;/*-----------------------------------------------------------------------*/
;/* Current Drive/Directory Handlings */
;/*-----------------------------------------------------------------------*/
;FRESULT f_chdrive
; BYTE drv /* Drive number */
; MACRO F_CHDR
; LD A,17
; call ffs
; ENDM
; MACRO F_CHDRIVE _DRV
; LD e,_DRV
; F_CHDR
; ENDM
; FRESULT f_chdir (
; TCHAR *path /* Pointer to the directory path */
; )
MACRO F_CHDIR
ld hl,ffsfunc.f_chdir
call call_ffs
ENDM
;FRESULT f_getcwd (
; DE=TCHAR *path, /* Pointer to the directory path */ буфер
; BC=UINT sz_path /* Size of path */) размер буфера
MACRO F_GETCWD_CURDRV
ld hl,ffsfunc.f_getcwd
call call_ffs_curvol
ENDM
;MACRO F_MUL _ARG
;LD DE,0
;PUSH DE
;LD de,_ARG
;push de
;LD A,20;19
;call ffs
;endm
;FRESULT f_stat (const TCHAR*, FILINFO*); /* Get file status */
; DE=TCHAR *path,
; BC=FILINFO* буфер
MACRO F_STAT
ld hl,ffsfunc.f_stat
call call_ffs
ENDM
;FRESULT f_utime (const TCHAR*, WORD fdate, WORD ftime); /* Change timestamp of the file/dir */
;de=name
;bc=date
;stack=time
MACRO F_UTIME_CURDRV
ld hl,ffsfunc.f_utime
call call_ffs;_curvol
ENDM
;FRESULT f_getutime (const TCHAR*, WORD *ftimedate); /* Get timestamp of the file/dir */
;de=name
;bc=pointer to time,date
MACRO F_GETUTIME
ld hl,ffsfunc.f_getutime
call call_ffs;_curvol
ENDM
; /* File function return code (FRESULT) */
; typedef enum {
; FR_OK = 0, /* (0) Succeeded */
; FR_DISK_ERR, /* (1) A hard error occured in the low level disk I/O layer */
; FR_INT_ERR, /* (2) Assertion failed */
; FR_NOT_READY, /* (3) The physical drive cannot work */
; FR_NO_FILE, /* (4) Could not find the file */
; FR_NO_PATH, /* (5) Could not find the path */
; FR_INVALID_NAME, /* (6) The path name format is invalid */
; FR_DENIED, /* (7) Access denied due to prohibited access or directory full */
; FR_EXIST, /* (8) Access denied due to prohibited access */
; FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */
; FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */
; FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */
; FR_NOT_ENABLED, /* (12) The volume has no work area */
; FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume on the physical drive */
; FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */
; FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
; FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */
; FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
; FR_TOO_MANY_OPEN_FILES /* (18) Number of open files > _FS_SHARE */
; } FRESULT;