; STRUCT _sStack ; 256 bytes .buffer BLOCK 256,0 ;.SPoint BYTE 0 ENDS ; ; STRUCT _sEXE_HEADER ; 512 bytes .EXE_EXT TEXT 3,{"EX","E"} ; 0-2 EXE Сигнатура .VERSION BYTE 0 ; 3 Version of EXE file .OFFCOD1 WORD 00 ; 4-5 С какого смещения в файле будет грузиться код в .OFFCOD2 WORD 00 ; 6-7 память по адресу (Code_addr) Low addr, High addr. .LOADER WORD 00 ; 8-9 Размер первичного загрузчика или 0 .RESERVED BLOCK 6,0 ; 10-15 Reserved .LD_ADDR WORD 00 ; 16-17 Адрес расположения кода в памяти (#4100-#FFFF) .PC_REG WORD 00 ; 18-19 Адрес в памяти с которого запустится код (Reg. PC) .SP_REG WORD 00 ; 20-21 Адрес стека (Reg. SP) .UnUsedPoint BYTE 0 ; 22 ; в .RESERVED2 нельзя прописать BLOCK 512-.UnUsedPoint,0; поэтому хардкод .RESERVED2 BLOCK 512-23,0 ; 23-512 Можно использовать под текст для выпендрёжа или не использовать ENDS ; ;File Manipulator (FM) ;[ ] fat32 ; !!!!! из-за всяких оптимизаций сраных не менять местами ничего, только добавлять в конец STRUCT _sFM ; 54 bytes ; from FAT .FS_REC FAT_DIRECTORY_RECORD ; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME ; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT ; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT ; .RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED ; .RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED ; .CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED ; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED ; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED ; .TIME: WORD #0000 ;+ #16 +22 TIME ; .DATE: WORD #0000 ;+ #18 +24 DATE ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE ; from Core .F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW .DIR_CLUSTER_H WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; [x] fat32 .HANDLE WORD #0000 ;+ #28 +40 HANDLE NUMBER .DRIVE BYTE #00 ;+ #2A +42 DRIVE OR CURRENT .ACCESS_MODE BYTE #00 ;+ #2B +43 ACCESS MODE .TASK_NUM BYTE #00 ;+ #2C +44 TASK .OptimizedClusters BYTE #00 ;+ #2D +45 .KnownCluster_L WORD #0000 ;+ #2E +46 Младшее слово номера кластера для которого известно относительное смещение внутри файла .KnownCluster_H WORD #0000 ;+ #30 +48 Старшее слово номера кластера для которого известно относительное смещение внутри файла .KnownOffset_L WORD #0000 ;+ #32 +50 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. .KnownOffset_H WORD #0000 ;+ #34 +52 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS ;ACCESS MODE: A=0 чтение/запись ; A=1 чтение ; A=2 запись ; ;!TODO A=3 запись без лишних сохранений кэша FAT ; ;!TODO A=4 записать кэш FAT ; ; ; NAM EQU 0 ; LEN4 EQU 31 ; EXT EQU 8 ; POS1 EQU 32 ; ATR EQU 11 ; POS2 EQU 33 ; TIM1 EQU 22 ; POS3 EQU 34 ; TIM2 EQU 23 ; POS4 EQU 35 ; DAT1 EQU 24 ; DIRCLU1 EQU 36 ; DAT2 EQU 25 ; DIRCLU2 EQU 37 ; CLU1 EQU 26 ; HND1 EQU 38 ; CLU2 EQU 27 ; HND2 EQU 39 ; LEN1 EQU 28 ; FDRV EQU 40 ; LEN2 EQU 29 ; AMODE EQU 41 ; LEN3 EQU 30 ; FTASK EQU 42 ; STRUCT _sFS_Buffer .DRIVE: BYTE #FF .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) .CacheBlock: WORD #0000 .CacheUpdated: BYTE #00 ;.SectorsPerBank: BYTE #00 .RootDirStartCluster_L: WORD #0000 .RootDirStartCluster_H: WORD #0000 ; fat32 .FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) .FAT1_SEC_H: WORD #0000 ; fat32 .FAT2_SEC_L: WORD #0000 .FAT2_SEC_H: WORD #0000 ; fat32 .Number_Of_FATs BYTE #02 .SectorsPerFAT_L WORD #0000 .SectorsPerFAT_H BYTE #00 .RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR .RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR .DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE .FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low .FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high .BytesPerCluster: WORD #0000 ; CLUSTER_LEN .END_CHAIN_CLUSTER_L: WORD #FFFF .END_CHAIN_CLUSTER_H: WORD #0FFF .MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.) .MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.) .BytesPerSector: WORD #0000 .SectorsPerCluster: BYTE #00 .FSINFO_Sector: WORD #01 .BPB_SERIAL_NUMBER: DWORD #00000000 .BPB_LABEL: BLOCK 11,' ' ; 11 для FAT, 31 для CDFS .UPD_FSINFO: BYTE 0 .FREE_CLUSTERS_COUNT_L: WORD #FFFF .FREE_CLUSTERS_COUNT_H: WORD #FFFF .DIR_BLOCK BYTE #00 ; какой блок директории загружен в кэш директорий DIRPAGE .DIR_BLOCK_CHANGES DWORD #00000000 ; какие из кусков в блоке кэш DIRPAGE изменились до сохранения ;.FilesPerSector: BYTE #00 ; число файловых записей в секторе ;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DWORD #0000 ; количество секторов на цилиндре ENDS ; STRUCT _sMASKARE .Name BLOCK 8,0 ; имя файла .Ext BLOCK 3,0 ; расш. .Data BLOCK 21,0 ; 11+21=32 ENDS ; Буфер имени 8.3 формата ; STRUCT _sBuffers .TMPNAME BLOCK 8+4+1,0 ; Буфер имени 8.3 + 0 .HANDBUF BLOCK FAT_DIRECTORY_RECORD,0 .MASKARE _sMASKARE .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; .FS_Buffer _sFS_Buffer ;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 .EXE_Header _sEXE_HEADER ; 512 bytes .Stack _sStack ; 256 bytes .Buffer BLOCK 512,0 ; FOR BUFFER & SECTOR_BUFFER .MemoryTable BLOCK 256,0 ; 256 bytes .CurrentPath WORD 0 .CurrentDirectory BLOCK DIRECTORY_PATH_LENGTH,0 .WorkDirectory BLOCK DIRECTORY_PATH_LENGTH,0 .BUFFER_CLP BLOCK CLP_Buffer,0 ; буфер для CLP запускаемого в Execute.asm ENDS ;