From 630ec2d3d01c9e013f14612a7c9f464b4e33663c Mon Sep 17 00:00:00 2001 From: Frank Zoll Date: Tue, 5 Oct 2010 11:04:22 +0000 Subject: [PATCH] git-svn-id: svn://cu.loc/avr-cpm/trunk@114 57430480-672e-4586-8877-bcf8adbbf3b7 --- avrcpm/avr/dsk_fat16.asm | 988 ++++++++++++++++++++------------------- 1 file changed, 505 insertions(+), 483 deletions(-) diff --git a/avrcpm/avr/dsk_fat16.asm b/avrcpm/avr/dsk_fat16.asm index ac4b2e8..ac47708 100644 --- a/avrcpm/avr/dsk_fat16.asm +++ b/avrcpm/avr/dsk_fat16.asm @@ -1,6 +1,8 @@ ; Various functions for the Interaction with the FAT16 Filesystem ; ; Copyright (C) 2010 Frank Zoll +; Copyright (C) 2010 Sprite_tm +; Copyright (C) 2010 Leo C. ; ; This file is part of avrcpm. ; @@ -20,67 +22,84 @@ ; $Id$ ; -; =========================================================================== +; ============================================================================ ; Prelimitary ! ; °°°°°°°°°°°°° ; Size of a Sector is fixed to 512 Bytes by Base - MMC Driver implementation ; The Functions below therefore assume a fixed Size of 512 Bytes per Sector. -; =========================================================================== +; ============================================================================ #if FAT16_SUPPORT -;-------------------------------- Defines for FAT16 Structures +; ############################################################################ +; Defines for FAT16 Structures +; ############################################################################ + #define PARTID_FAT16 0x0E - -;#define FAT16_BSO_SECSIZE 0x0b ; BootSectorOffset to Sectorsize Word -#define FAT16_BSO_CLUSTSZ 0x0d ; BootSectorOffset to Clustersize Byte -#define FAT16_BSO_RESSECT 0x0e ; BootSectorOffset to Number of Reserved Sectors -#define FAT16_BSO_VOLPTR 0x1c ; BootSectorOffset to First VolumeSector -#define FAT16_BSO_SECPERFAT 0x16 ; BootSectorOffset to Number of Sectors per Fat -#define FAT16_BSO_NUMFATCP 0x10 ; BootSectorOffset to Ammount of FAT Copys -#define FAT16_BSO_NUMDIRENT 0x11 ; BootSectorOffset to Max. Root Dir. Entrys -#define FAT16_FIRST_IMAGENAME 'A' -#define FAT16_LAST_IMAGENAME 'Z' - -;-------------------------------- Start of Data Segment - + +/*These are the Offsets to the Variables within the Bootsector of a FAT16 + Partition. + */ +;#define FAT16_BSO_SECSIZE 0x0b ; Offset to Sectorsize Word +#define FAT16_BSO_CLUSTSZ 0x0d ; Offset to Clustersize Byte +#define FAT16_BSO_RESSECT 0x0e ; Offset to Number of Reserved Sectors +#define FAT16_BSO_VOLPTR 0x1c ; Offset to First VolumeSector +#define FAT16_BSO_SECPERFAT 0x16 ; Offset to Number of Sectors per Fat +#define FAT16_BSO_NUMFATCP 0x10 ; Offset to Ammount of FAT Copys +#define FAT16_BSO_NUMDIRENT 0x11 ; Offset to Max. Root Dir. Entrys +#define FAT16_FIRST_IMAGENAME 'A' ; First letter of filename to search +#define FAT16_LAST_IMAGENAME 'Z' ; Last letter of filename to search + +; ############################################################################ +; Start of Data Segment +; ############################################################################ .dseg -fat_partfound: .byte 1 ; (0= no fat partition found 1=found partition) -fat_parttbl: .byte 8 ; first fat16 partition entry (start sector, sector count) -;fat_sectorsize: .byte 2 ; size of sector in bytes -fat_clustersize: .byte 1 ; sectors per cluster -fat_ressectors: .byte 2 ; number of reserved sectors -fat_secperfat: .byte 2 ; number of sectors per fat -fat_numfatcp: .byte 1 ; Number of FAT Copies -fat_numdirentrys:.byte 2 ; Max. ammount of Directory Entrys within Rootdirektory -fat_ptr2fat: .byte 4 ; pointer to the first fat sector -fat_ptr2dir: .byte 4 ; pointer to the first root directory sector -fat_ptr2dat: .byte 4 ; pointer to the first data sector - -fat_last_dsk: .byte 1 ; number of disk with entry in cache -fat_log_clust: .byte 2 ; last searched logical cluster -fat_clust_offset: .byte 1 ; offset within the cluster -fat_clust_ptr: .byte 4; ; sector of last real cluster -; ------------------------------- Start of Code Segment +fat_partfound: .byte 1 ; (partition: 0= no found 1=found ) +fat_parttbl: .byte 8 ; first fat16 partition entry + ; (start sector, sector count) +;fat_sectorsize: .byte 2 ; size of sector in bytes +fat_clustersize: .byte 1 ; sectors per cluster +fat_ressectors: .byte 2 ; number of reserved sectors +fat_secperfat: .byte 2 ; number of sectors per fat +fat_numfatcp: .byte 1 ; number of FAT Copies +fat_numdirentrys:.byte 2 ; Max. num. of entrys within Rootdirektory +fat_ptr2fat: .byte 4 ; pointer to the first fat sector +fat_ptr2dir: .byte 4 ; pointer to the first root directory sector +fat_ptr2dat: .byte 4 ; pointer to the first data sector + +/*These variables define a cache that holds the last Cluster and Sector + thats been searched vor. To save some of the valuabe SRAM- Space these + variables also are used as temporary variables by the function + fat_scan_partition. + */ +fat_last_dsk: .byte 1 ; number of disk with entry in cache +fat_log_clust: .byte 2 ; last searched logical cluster +fat_clust_offset: .byte 1 ; offset within the cluster +fat_clust_ptr: .byte 4; ; sector of last real cluster + + +; ############################################################################ +; Start of Code Segment +; ############################################################################ .cseg -; ==================================================================== -; Function: Does a Disk read/write operation -; ==================================================================== +; ============================================================================ +; Function: Initialize internal FAT-Partition Variables +; ============================================================================ ; Parameters -; -------------------------------------------------------------------- -; Registers : none -; Variables : [r] seekdsk Number of Disk to Read -; [r] seeksec Sector to read -; [r] seektrk Track to read -; -------------------------------------------------------------------- -; Description: -; ==================================================================== +; ---------------------------------------------------------------------------- +; Registers : none +; Variables : [out] fat_parttabl +; ---------------------------------------------------------------------------- +; Description: +; This Routine initializes the internal Variables, that point to the +; first Found FAT16 Partition. +; ============================================================================ fat_init_partitiontable: - sts fat_partfound,_0 + sts fat_partfound,_0 ldiw y,fat_parttbl st y+,_0 @@ -93,41 +112,44 @@ fat_init_partitiontable: st y+,_0 ret -; ==================================================================== +; ============================================================================ ; Function: Resets the Cache -; ==================================================================== +; ============================================================================ ; Parameters -; -------------------------------------------------------------------- -; Registers : none -; Variables : [r] seekdsk Number of Disk to Read -; [r] seeksec Sector to read -; [r] seektrk Track to read -; -------------------------------------------------------------------- +; ---------------------------------------------------------------------------- +; Registers : none +; Variables : [out] fat_log_clust +; [out] fat_last_dsk +; ---------------------------------------------------------------------------- ; Description: -; ==================================================================== +; This Routine resets the internal Cache- Variables. After reset, the +; next read or write Command will initialize a scan of the FAT of +; the FAT16-Partition for the given sector. +; ============================================================================ fat_reset_cache: push yl ldi yl,0xFF - sts fat_log_clust ,yl + sts fat_log_clust ,yl sts fat_log_clust+1,yl sts fat_last_dsk ,yl - pop yl + pop yl ret -; ==================================================================== -; Function: Add's a FAT16 Partition for later Scanning -; ==================================================================== +; ============================================================================ +; Function: Saves FAT16 Partitiondata for later Scanning +; ============================================================================ ; Parameters -; -------------------------------------------------------------------- -; Registers : -; Variables : -; -------------------------------------------------------------------- +; ---------------------------------------------------------------------------- +; Registers : [in] z Pointer to the Partitondata +; Variables : [out] fat_partfound Boolean for "Partition found" +; [out] fat_parttbl Pointer to Partitiontable +; ---------------------------------------------------------------------------- ; Description: -; This funktion sets the internal Variables to set Start and Size +; This funktion sets the internal Variables to the Start and Size ; of a given FAT16 Paritition. This Information will be used for a ; later scanning of the Partition. See Function "fat_scan_partition" ; for more information. -; ==================================================================== +; ============================================================================ fat_add_partition: .if FAT16_DEBUG > 0 @@ -147,39 +169,39 @@ fat_add_partition: ; save data from first fat16 partition ldiw y,fat_parttbl - ldd temp,z+PART_START - st y+,temp - ldd temp,z+PART_START+1 - st y+,temp - ldd temp,z+PART_START+2 - st y+,temp - ldd temp,z+PART_START+3 - st y+,temp + ldd temp,z+PART_START + st y+,temp + ldd temp,z+PART_START+1 + st y+,temp + ldd temp,z+PART_START+2 + st y+,temp + ldd temp,z+PART_START+3 + st y+,temp - ldd temp,z+PART_SIZE - st y+,temp - ldd temp,z+PART_SIZE+1 - st y+,temp - ldd temp,z+PART_SIZE+2 - st y+,temp - ldd temp,z+PART_SIZE+3 - st y+,temp + ldd temp,z+PART_SIZE + st y+,temp + ldd temp,z+PART_SIZE+1 + st y+,temp + ldd temp,z+PART_SIZE+2 + st y+,temp + ldd temp,z+PART_SIZE+3 + st y+,temp ; reload variables from stack - pop yh + pop yh pop yl ret -; --------------------------------------------------------------------------- +; ============================================================================ ; Read and Scann a FAT16 Partition for Imagedatefiles -; --------------------------------------------------------------------------- +; ============================================================================ +; Registers : none +; Variables : none +; ---------------------------------------------------------------------------- ; This Routine reads the Bootblock and scanns it for a Diskimage -; Input Registers : none -; Output Registers : none -; Changes Variables: none -; --------------------------------------------------------------------------- +; ============================================================================ fat_scan_partition: @@ -190,7 +212,7 @@ fat_scan_partition: .endif ; Check if a FAT16 Partition was realy found - lds yl,fat_partfound + lds yl,fat_partfound cpi yl,1 brne fat_scan_error @@ -201,8 +223,8 @@ fat_scan_partition: .endif ; Check for free Entrys in Partition table - lds yl,ndisks - cpi yl,MAXDISKS + lds yl,ndisks + cpi yl,MAXDISKS breq fat_scan_error .if FAT16_DEBUG > 0 @@ -212,19 +234,19 @@ fat_scan_partition: ; Scan partition start ldiw z,fat_parttbl - ldd xl,z+0 - ldd xh,z+1 - ldd yl,z+2 - ldd yh,z+3 + ldd xl,z+0 + ldd xh,z+1 + ldd yl,z+2 + ldd yh,z+3 ; Load first sector from Partition rcall mmcReadSect - tst temp + tst temp breq fat_bootblock_check ; Read error: Block not found fat_scan_error: - clr temp + clr temp ret fat_bootblock_check: @@ -234,7 +256,7 @@ fat_bootblock_check: printnewline .endif -; -> Size of Sectors fixed at 512 Bytes +; Not needed / used by now because size of Sectors fixed at 512 Bytes ; Get ammount of Bytes per Sector ; ldiw z,hostbuf+FAT16_BSO_SECSIZE ; ldiw y,fat_sectorsize @@ -249,9 +271,9 @@ fat_bootblock_check: ; printnewline ;.endif -; Anzahl der Sectoren pro Cluster lesen +; get sectors per cluster from bootblock ldiw z,hostbuf+FAT16_BSO_CLUSTSZ - ld temp,z + ld temp,z sts fat_clustersize,temp .if FAT16_DEBUG > 0 @@ -260,12 +282,12 @@ fat_bootblock_check: printnewline .endif -; Anzahl der reservierten Sectoren +; get num of reseved sectors from bootblock ldiw z,hostbuf+FAT16_BSO_RESSECT - ld temp,z+ - sts fat_ressectors,temp ; low byte - ld temp2,z - sts fat_ressectors+1,temp2 ; high byte + ld temp,z+ + sts fat_ressectors,temp ; low byte + ld temp2,z + sts fat_ressectors+1,temp2 ; high byte .if FAT16_DEBUG > 0 printstring "Reserved Sectors__: ",0 @@ -273,12 +295,12 @@ fat_bootblock_check: printnewline .endif -; Anzahl der Sectoren pro FAT +; get num of sectors per FAT-Table from bootblock ldiw z,hostbuf+FAT16_BSO_SECPERFAT - ld temp,z+ - sts fat_secperfat,temp ; low byte - ld temp2,z - sts fat_secperfat+1,temp2 ; high byte + ld temp,z+ + sts fat_secperfat,temp ; low byte + ld temp2,z + sts fat_secperfat+1,temp2 ; high byte .if FAT16_DEBUG > 0 printstring "Sectors per FAT__: ",0 @@ -286,10 +308,10 @@ fat_bootblock_check: printnewline .endif -; Anzahl der FAT kopien +; get num of FAT Tables from bootblock ldiw z,hostbuf+FAT16_BSO_NUMFATCP - ld temp,z - sts fat_numfatcp,temp ; low byte + ld temp,z + sts fat_numfatcp,temp ; low byte .if FAT16_DEBUG > 0 printstring "Ammount of FAT copies: ",0 @@ -297,12 +319,12 @@ fat_bootblock_check: printnewline .endif -; Max. Anzahl der Dir. Enträge im Root Verz. +; get max num of entrys in root direktory from bootblock ldiw z,hostbuf+FAT16_BSO_NUMDIRENT - ld temp,z+ - sts fat_numdirentrys,temp ; low byte - ld temp2,z - sts fat_numdirentrys+1,temp2 ; high byte + ld temp,z+ + sts fat_numdirentrys,temp ; low byte + ld temp2,z + sts fat_numdirentrys+1,temp2 ; high byte .if FAT16_DEBUG > 0 printstring "Max. entrys in Rootdir.: ",0 @@ -310,95 +332,95 @@ fat_bootblock_check: printnewline .endif -; Print begin of Volume +; Print begin of Volume .if FAT16_DEBUG > 1 ldiw z,fat_parttbl - ldd xl,z+0 - ldd xh,z+1 - ldd yl,z+2 - ldd yh,z+3 + ldd xl,z+0 + ldd xh,z+1 + ldd yl,z+2 + ldd yh,z+3 printstring "Begin of Volume at: ",0 - mov temp ,yl - mov temp2,yh - rcall printhexw - mov temp ,xl - mov temp2,xh - rcall printhexw + mov temp ,yl + mov temp2,yh + rcall printhexw + mov temp ,xl + mov temp2,xh + rcall printhexw printnewline .endif -; Calculate begin of FAT within the Volume - lds temp ,fat_ressectors - lds temp2,fat_ressectors+1 +; Calculate begin of FAT within the Volume + lds temp ,fat_ressectors + lds temp2,fat_ressectors+1 ldiw z,fat_parttbl - ldd xl,z+0 - ldd xh,z+1 - ldd yl,z+2 - ldd yh,z+3 + ldd xl,z+0 + ldd xh,z+1 + ldd yl,z+2 + ldd yh,z+3 - add xl,temp + add xl,temp adc xh,temp2 - adc yl,_0 - adc yh,_0 + adc yl,_0 + adc yh,_0 - sts fat_ptr2fat ,xl - sts fat_ptr2fat+1,xh - sts fat_ptr2fat+2,yl - sts fat_ptr2fat+3,yh + sts fat_ptr2fat ,xl + sts fat_ptr2fat+1,xh + sts fat_ptr2fat+2,yl + sts fat_ptr2fat+3,yh .if FAT16_DEBUG > 1 printstring "Begin of FAT at___: ",0 - mov temp ,yl - mov temp2,yh - rcall printhexw - mov temp ,xl - mov temp2,xh - rcall printhexw + mov temp ,yl + mov temp2,yh + rcall printhexw + mov temp ,xl + mov temp2,xh + rcall printhexw printnewline .endif ; Calculate begin of Root- Directory within the Volume ldiw z,fat_ptr2fat - ldd xl,z+0 - ldd xh,z+1 - ldd yl,z+2 - ldd yh,z+3 + ldd xl,z+0 + ldd xh,z+1 + ldd yl,z+2 + ldd yh,z+3 - lds temp ,fat_secperfat - lds temp2,fat_secperfat+1 - lds temp3,fat_numfatcp + lds temp ,fat_secperfat + lds temp2,fat_secperfat+1 + lds temp3,fat_numfatcp fat_calc_dp_loop: - cp temp3,_0 + cp temp3,_0 breq fat_calc_dp_lend - add xl,temp - adc xh,temp2 - adc yl,_0 - adc yh,_0 + add xl,temp + adc xh,temp2 + adc yl,_0 + adc yh,_0 - dec temp3 + dec temp3 - jmp fat_calc_dp_loop + jmp fat_calc_dp_loop fat_calc_dp_lend: - sts fat_ptr2dir ,xl - sts fat_ptr2dir+1,xh - sts fat_ptr2dir+2,yl - sts fat_ptr2dir+3,yh + sts fat_ptr2dir ,xl + sts fat_ptr2dir+1,xh + sts fat_ptr2dir+2,yl + sts fat_ptr2dir+3,yh .if FAT16_DEBUG > 1 printstring "Begin of DIR at___: ",0 - mov temp ,yl - mov temp2,yh - rcall printhexw - mov temp ,xl - mov temp2,xh - rcall printhexw + mov temp ,yl + mov temp2,yh + rcall printhexw + mov temp ,xl + mov temp2,xh + rcall printhexw printnewline .endif @@ -407,142 +429,143 @@ fat_calc_dp_lend: ; Sectorsize is fixed at 512 Bytes, makes 16 Entrys per Sektor - lds zl,fat_numdirentrys ; low byte - lds zh,fat_numdirentrys+1 ; high byte + lds zl,fat_numdirentrys ; low byte + lds zh,fat_numdirentrys+1 ; high byte ; Num. Direntrys / 16 - lsr zh - ror zl - lsr zh - ror zl - lsr zh - ror zl - lsr zh - ror zl - - lds xl,fat_ptr2dir - lds xh,fat_ptr2dir+1 - lds yl,fat_ptr2dir+2 - lds yh,fat_ptr2dir+3 - - add xl,zl - adc xh,zh - adc yl,_0 - adc yh,_0 - - sts fat_ptr2dat ,xl - sts fat_ptr2dat+1,xh - sts fat_ptr2dat+2,yl - sts fat_ptr2dat+3,yh + lsr zh + ror zl + lsr zh + ror zl + lsr zh + ror zl + lsr zh + ror zl + + lds xl,fat_ptr2dir + lds xh,fat_ptr2dir+1 + lds yl,fat_ptr2dir+2 + lds yh,fat_ptr2dir+3 + + add xl,zl + adc xh,zh + adc yl,_0 + adc yh,_0 + + sts fat_ptr2dat ,xl + sts fat_ptr2dat+1,xh + sts fat_ptr2dat+2,yl + sts fat_ptr2dat+3,yh .if FAT16_DEBUG > 1 printstring "Begin of Data at__: ",0 - mov temp ,yl - mov temp2,yh - rcall printhexw - mov temp ,xl - mov temp2,xh - rcall printhexw + mov temp ,yl + mov temp2,yh + rcall printhexw + mov temp ,xl + mov temp2,xh + rcall printhexw printnewline .endif ; Here Starts the Scann of the Directory for valid image Files. ; Init Image-Namecounter - ldi temp,FAT16_FIRST_IMAGENAME - sts fat_last_dsk,temp + ldi temp,FAT16_FIRST_IMAGENAME + sts fat_last_dsk,temp fat_scan_for_next_image: ; Init Offset into Directory-Sectors - ldi temp,0 - sts fat_clust_offset,temp + ldi temp,0 + sts fat_clust_offset,temp ; Init counter for number of entry left to scan - lds temp,fat_numdirentrys - sts fat_log_clust ,temp + lds temp,fat_numdirentrys + sts fat_log_clust ,temp - lds temp,fat_numdirentrys+1 - sts fat_log_clust+1,temp + lds temp,fat_numdirentrys+1 + sts fat_log_clust+1,temp fat_next_sector_loop: ; Get a Pointer to the first Directory sector - lds xl,fat_ptr2dir - lds xh,fat_ptr2dir+1 - lds yl,fat_ptr2dir+2 - lds yh,fat_ptr2dir+3 + lds xl,fat_ptr2dir + lds xh,fat_ptr2dir+1 + lds yl,fat_ptr2dir+2 + lds yh,fat_ptr2dir+3 ; Add actual offset - lds temp,fat_clust_offset - add xl,temp - adc xh,_0 - adc yl,_0 - adc yh,_0 + lds temp,fat_clust_offset + add xl,temp + adc xh,_0 + adc yl,_0 + adc yh,_0 ; Load sector from Directory call mmcReadSect - tst temp + tst temp breq fat_look_for_images ; Read error: Block not found - clr temp + clr temp ret ; Looks at a read directory block for image entrys fat_look_for_images: ldiw z,hostbuf - ldi temp2,0 + ldi temp2,0 fat_look_for_loop: ldd temp,z+0 - cpi temp,'C' + cpi temp,'C' brne fat_look_not_ok - ldd temp,z+1 - cpi temp,'P' + ldd temp,z+1 + cpi temp,'P' brne fat_look_not_ok - ldd temp,z+2 - cpi temp,'M' + ldd temp,z+2 + cpi temp,'M' brne fat_look_not_ok - ldd temp,z+3 - cpi temp,'D' + ldd temp,z+3 + cpi temp,'D' brne fat_look_not_ok - ldd temp,z+4 - cpi temp,'S' + ldd temp,z+4 + cpi temp,'S' brne fat_look_not_ok - ldd temp,z+5 - cpi temp,'K' + ldd temp,z+5 + cpi temp,'K' brne fat_look_not_ok - ldd temp,z+6 - cpi temp,'_' + ldd temp,z+6 + cpi temp,'_' brne fat_look_not_ok - lds temp3,fat_last_dsk ; Get actual Diskname (A to Z) - ldd temp,z+7 - cp temp,temp3 + lds temp3,fat_last_dsk ; Get actual Diskname (A to Z) + ldd temp,z+7 + cp temp,temp3 brne fat_look_not_ok - ldd temp,z+8 - cpi temp,'I' + + ldd temp,z+8 + cpi temp,'I' brne fat_look_not_ok - ldd temp,z+9 - cpi temp,'M' + ldd temp,z+9 + cpi temp,'M' brne fat_look_not_ok - ldd temp,z+10 - cpi temp,'G' + ldd temp,z+10 + cpi temp,'G' brne fat_look_not_ok - sts fat_clust_ptr ,zl - sts fat_clust_ptr+1,zh - sts fat_clust_ptr+2,temp2 - jmp fat_store_new_entry + sts fat_clust_ptr ,zl + sts fat_clust_ptr+1,zh + sts fat_clust_ptr+2,temp2 + jmp fat_store_new_entry fat_scan_for_more: @@ -552,9 +575,9 @@ fat_scan_for_more: printnewline .endif - lds zl ,fat_clust_ptr - lds zh ,fat_clust_ptr+1 - lds temp2,fat_clust_ptr+2 + lds zl ,fat_clust_ptr + lds zh ,fat_clust_ptr+1 + lds temp2,fat_clust_ptr+2 fat_look_not_ok: .if FAT16_DEBUG > 1 @@ -563,8 +586,8 @@ fat_look_not_ok: adiw z,32 - inc temp2 - cpi temp2,16 ; max entrys/sector + inc temp2 + cpi temp2,16 ; max entrys/sector breq fat_scan_next_sector jmp fat_look_for_loop @@ -575,22 +598,22 @@ fat_scan_next_sector: printnewline .endif - lds temp3, fat_log_clust - lds temp4, fat_log_clust+1 + lds temp3, fat_log_clust + lds temp4, fat_log_clust+1 - sub temp3,temp2 - sbc temp4,_0 + sub temp3,temp2 + sbc temp4,_0 - sts fat_log_clust,temp3 - sts fat_log_clust+1,temp4 + sts fat_log_clust,temp3 + sts fat_log_clust+1,temp4 - cp temp3,_0 - cpc temp4,_0 + cp temp3,_0 + cpc temp4,_0 breq fat_scan_at_end - lds temp,fat_clust_offset - inc temp - sts fat_clust_offset,temp + lds temp,fat_clust_offset + inc temp + sts fat_clust_offset,temp rjmp fat_next_sector_loop @@ -601,12 +624,12 @@ fat_scan_at_end: printnewline .endif - lds temp,fat_last_dsk - inc temp - sts fat_last_dsk,temp + lds temp,fat_last_dsk + inc temp + sts fat_last_dsk,temp - ldi temp2,FAT16_LAST_IMAGENAME - cp temp,temp2 + ldi temp2,FAT16_LAST_IMAGENAME + cp temp,temp2 brge fat_scaned_last_disk rjmp fat_scan_for_next_image @@ -622,26 +645,26 @@ fat_store_new_entry: ; Found a valid image .if FAT16_DEBUG > 1 printstring "Found a valid Image ! Z=",0 - mov temp ,zl - mov temp2,zh - rcall printhexw + mov temp ,zl + mov temp2,zh + rcall printhexw printnewline .endif ldiw y,hostparttbl - lds temp,ndisks + lds temp,ndisks fat_look_store_loop: - cp temp,_0 + cp temp,_0 breq fat_look_store adiw y,PARTENTRY_SIZE - dec temp - jmp fat_look_store_loop + dec temp + jmp fat_look_store_loop fat_look_store: ; Set Type of Partition to FAT16- Fileimage - ldi temp,dskType_FAT + ldi temp,dskType_FAT st y+,temp .if FAT16_DEBUG > 1 @@ -651,16 +674,17 @@ fat_look_store: ldd temp,z+0x1A st y+,temp .if FAT16_DEBUG > 1 - rcall printhex + rcall printhex .endif ldd temp,z+0x1B st y+,temp .if FAT16_DEBUG > 1 - rcall printhex + rcall printhex .endif ldi temp,0 st y+,temp - st y+,temp + st y+,temp + .if FAT16_DEBUG > 1 printnewline .endif @@ -683,15 +707,15 @@ fat_look_store: mov zh,_0 lsr zh - ror zl - ror xh - ror xl + ror zl + ror xh + ror xl ; store ammount of sectors in partitiontable - st y+,xl - st y+,xh - st y+,zl - st y+,zh + st y+,xl + st y+,xh + st y+,zl + st y+,zh .if FAT16_DEBUG > 1 ; Test finding of the first sector @@ -702,12 +726,12 @@ fat_look_store: rcall fat_gethostsec printstring "Begin of Image at: ",0 - mov temp ,yl - mov temp2,yh - rcall printhexw - mov temp ,xl - mov temp2,xh - rcall printhexw + mov temp ,yl + mov temp2,yh + rcall printhexw + mov temp ,xl + mov temp2,xh + rcall printhexw printnewline .endif @@ -716,29 +740,29 @@ fat_look_store: inc temp sts ndisks,temp - cpi temp,MAXDISKS + cpi temp,MAXDISKS breq fat_scan_end - jmp fat_scan_for_more + jmp fat_scan_for_more fat_scan_end: ret -; ==================================================================== +; ============================================================================ ; Function: Cluster to HostSector -; ==================================================================== -; Parameters: [in] xh,xl Cluster Number -; [out] yh,yl,xh,xl Sector Number on Disk -; -------------------------------------------------------------------- +; ============================================================================ +; Parameters: [in] xh,xl Cluster Number +; [out] yh,yl,xh,xl Sector Number on Disk +; ---------------------------------------------------------------------------- ; Registers : ; Variables : [used] fat_clustersize Ammount of Sectors per Cluster -; [changes] temp -; -------------------------------------------------------------------- +; [changes] temp +; ---------------------------------------------------------------------------- ; Description: ; ! Only works with Clustersizes 2,4,8,16,32,64,128 ! -; ==================================================================== +; ============================================================================ fat_gethostsec: ; Get Offset into Data area of Disk @@ -746,49 +770,50 @@ fat_gethostsec: ; add begin of data area to offset - lds temp,fat_ptr2dat+0 - add xl,temp - lds temp,fat_ptr2dat+1 - adc xh,temp - lds temp,fat_ptr2dat+2 - adc yl,temp - lds temp,fat_ptr2dat+3 - adc yh,temp + lds temp,fat_ptr2dat+0 + add xl,temp + lds temp,fat_ptr2dat+1 + adc xh,temp + lds temp,fat_ptr2dat+2 + adc yl,temp + lds temp,fat_ptr2dat+3 + adc yh,temp ret -; ==================================================================== +; ============================================================================ ; Function: Cluster to Sector -; ==================================================================== -; Parameters: [in] xl,xh Cluster Number -; [out] xl,xh,yl,yh Sector Number -; -------------------------------------------------------------------- -; Registers : -; Variables : [used] fat_clustersize Ammount of Sectors per Cluster -; [changes] temp -; -------------------------------------------------------------------- -; Description: -; ! Only works with Clustersizes 2,4,8,16,32,64,128 ! -; ==================================================================== +; ============================================================================ +; Registers: [in] xl,xh Cluster Number +; [out] xl,xh,yl,yh Sector Number +; Variables: [in] fat_clustersize Ammount of Sectors per Cluster +; [out] temp =0 +; ---------------------------------------------------------------------------- +; Description: +; Calculates the logical Sectornumber given the physical ClusterNumber +; and the size of a Cluster un sectors. +; +; ! Only works with Clustersizes 2,4,8,16,32,64,128,512,1024 ! +; ============================================================================ fat_clusttosec: clr yl - clr yh + clr yh - ldi temp,2 - sub xl,temp ; Substract the 2 reserved clusters - sbc xh,_0 + ldi temp,2 + sub xl,temp ; Substract the 2 reserved clusters + sbc xh,_0 - lds temp,fat_clustersize - lsr temp + lds temp,fat_clustersize + lsr temp fat_c2s_loop: - tst temp + tst temp breq fat_c2s_end - lsr temp + lsr temp - lsl xl - rol xh - rol yl - rol yh + lsl xl + rol xh + rol yl + rol yh rjmp fat_c2s_loop fat_c2s_end: @@ -797,42 +822,41 @@ fat_c2s_end: ; ==================================================================== ; Function: Searches a physical Cluster, given the logical Cluster ; ==================================================================== -; Parameters -; -------------------------------------------------------------------- -; Registers : [r] xh,xl logical- Cluster -; [w] yh,yl physical- Cluster +; Registers: [in] xh,xl logical- Cluster +; [out] yh,yl physical- Cluster +; Variables: ; -------------------------------------------------------------------- ; Description: ; ==================================================================== fat_find_phsy_clust: mov temp2,xl - lds xl,hostdsk + lds xl,hostdsk rcall dsk_getpartentry ; get partition entry mov xl,temp2 ; Get First FAT- Cluster Number of Diskimage - ldd yl,z+1 - ldd yh,z+2 + ldd yl,z+1 + ldd yh,z+2 .if FAT16_DBG_FAT > 0 printstring "Search log. Cluster ",0 - mov temp,xl - mov temp2,xh - rcall printhexw + mov temp,xl + mov temp2,xh + rcall printhexw printnewline printstring "Search phys. Cluster ",0 - mov temp ,yl - mov temp2,yh - rcall printhexw + mov temp ,yl + mov temp2,yh + rcall printhexw printnewline .endif fat_next_phsy_clust: - cp xl,_0 - cpc xh,_0 + cp xl,_0 + cpc xh,_0 breq fat_found_phsy_clust ; Get Next Cluster from Fat @@ -843,89 +867,88 @@ fat_next_phsy_clust: ; in zh,zl: Pointer to Word within the Sector to read ; in yh..xl: Start sector number (LBA) ; out zh,zl : word thats been read - push xl - push xh + push xl + push xh ; Create FAT Offset Value clr zh - mov zl,yl + mov zl,yl lsl zl - rol zh + rol zh ; Get FAT Start - mov temp,yh - lds xl,fat_ptr2fat - lds xh,fat_ptr2fat+1 - lds yl,fat_ptr2fat+2 - lds yh,fat_ptr2fat+3 + mov temp,yh + lds xl,fat_ptr2fat + lds xh,fat_ptr2fat+1 + lds yl,fat_ptr2fat+2 + lds yh,fat_ptr2fat+3 ; Add Cluster offset within sector add xl,temp adc xh,_0 - adc yl,_0 - adc yh,_0 - call mmcReadWord + adc yl,_0 + adc yh,_0 + call mmcReadWord - pop xh - pop xl + pop xh + pop xl - mov yl,zl - mov yh,zh + mov yl,zl + mov yh,zh ; Check next logical Cluster - ldi zl,1 - sub xl,zl - sbc xh,_0 + ldi zl,1 + sub xl,zl + sbc xh,_0 rjmp fat_next_phsy_clust ; Found the physical cluster fat_found_phsy_clust: .if FAT16_DBG_FAT > 0 printstring "Found phys. Cluster at:",0 - mov temp,yl - mov temp2,yh - rcall printhexw + mov temp,yl + mov temp2,yh + rcall printhexw printnewline .endif ret -; ==================================================================== +; ============================================================================ ; Function: Does a Disk write operation -; ==================================================================== +; ============================================================================ ; Parameters -; -------------------------------------------------------------------- -; Registers : none -; Variables : [r] seekdsk Number of Disk to Read -; [r] seeksec Sector to read -; [r] seektrk Track to read -; hostdsk = host disk #, (partition #) -; hostlba = host block #, relative to partition start -; Read/Write "hostsize" bytes to/from hostbuf -; -------------------------------------------------------------------- +; ---------------------------------------------------------------------------- +; Registers: none +; Variables: [in] seekdsk Number of Disk to Read +; [in] seeksec Sector to read +; [in] seektrk Track to read +; [in] hostdsk host disk #, (partition #) +; [in] hostlba host block #, relative to part.start +; ---------------------------------------------------------------------------- ; Description: -; ==================================================================== +; ============================================================================ fat_hostparam: - lds xl,hostdsk + lds xl,hostdsk - rcall dsk_getpartentry ; get partition entry + rcall dsk_getpartentry ; get partition entry fat_hostlend: - lds temp ,hostlba - lds temp2,hostlba+1 - lds temp3,hostlba+2 + lds temp ,hostlba + lds temp2,hostlba+1 + lds temp3,hostlba+2 - ldd xl,z+5 ; get size of disk in sectors - ldd xh,z+6 - ldd yl,z+7 + ldd xl,z+5 ; get size of disk in sectors + ldd xh,z+6 + ldd yl,z+7 - cp temp,xl ; check given sector against disksize - cpc temp2,xh - cpc temp3,yl + cp temp,xl ; check given sector against disksize + cpc temp2,xh + cpc temp3,yl brcs fat_hp1 - clr temp + clr temp ret fat_hp1: @@ -937,131 +960,131 @@ fat_hp1: mov yl,temp3 mov yh,_0 ; Divide logical Sectornumber by size of Cluster in sectors - lds zl, fat_clustersize + lds zl, fat_clustersize lsr zl fat_search_clst_lp: - tst zl + tst zl breq fat_found_clst - lsr yh - ror yl - ror xh - ror xl + lsr yh + ror yl + ror xh + ror xl - lsr zl + lsr zl rjmp fat_search_clst_lp fat_found_clst: ; at this point xh and xl are carying the logical cluster number ; printstring "find subsector" ; ################# Get Subsector within the logical Cluster for later use - mov yl,xl - lds zl, fat_clustersize - lsr zl + mov yl,xl + lds zl, fat_clustersize + lsr zl fat_search_clst_lp2: - tst zl + tst zl breq fat_found_subsec - lsl yl + lsl yl - lsr zl + lsr zl rjmp fat_search_clst_lp2 fat_found_subsec: - mov zl,temp - sub zl,yl - sts fat_clust_offset,zl + mov zl,temp + sub zl,yl + sts fat_clust_offset,zl ; Check against last HOSTDISK searched - lds yl,fat_last_dsk - lds yh,hostdsk - cp yl,yh + lds yl,fat_last_dsk + lds yh,hostdsk + cp yl,yh brne fat_wrong_cache_clst ; Check against last Cluster searched - lds yl,fat_log_clust - lds yh,fat_log_clust+1 + lds yl,fat_log_clust + lds yh,fat_log_clust+1 - cp yl,xl + cp yl,xl brne fat_wrong_cache_clst - cp yh,xh + cp yh,xh brne fat_wrong_cache_clst ; Last Cluster = searched Cluster -> get Sectornumber from cache - lds xl,fat_clust_ptr - lds xh,fat_clust_ptr+1 - lds yl,fat_clust_ptr+2 - lds yh,fat_clust_ptr+3 + lds xl,fat_clust_ptr + lds xh,fat_clust_ptr+1 + lds yl,fat_clust_ptr+2 + lds yh,fat_clust_ptr+3 rjmp fat_add_offset -; ################# Cluster is not in cache, so we must search for it +; Cluster is not in cache, so we must search for it fat_wrong_cache_clst: - lds yl,hostdsk - sts fat_last_dsk,yl - sts fat_log_clust,xl - sts fat_log_clust+1,xh + lds yl,hostdsk + sts fat_last_dsk,yl + sts fat_log_clust,xl + sts fat_log_clust+1,xh -; ################# Map Logical Cluster-Number to "Physical" Cluster Number using the FAT +; Map Logical Cluster-Number to "Physical" Cluster Number using the FAT rcall fat_find_phsy_clust -; ################# Get StartSector of "physical" Cluster +; Get StartSector of "physical" Cluster mov xl,yl - mov xh,yh + mov xh,yh rcall fat_gethostsec ; Found the physical sector .if FAT16_DBG_FAT > 0 printstring "Found phys. Sector at:",0 - mov temp,yl - mov temp2,yh - rcall printhexw - mov temp,xl - mov temp2,xh - rcall printhexw + mov temp,yl + mov temp2,yh + rcall printhexw + mov temp,xl + mov temp2,xh + rcall printhexw printnewline .endif ; Save the found Sector for later use into cache - sts fat_clust_ptr ,xl - sts fat_clust_ptr+1,xh - sts fat_clust_ptr+2,yl - sts fat_clust_ptr+3,yh + sts fat_clust_ptr ,xl + sts fat_clust_ptr+1,xh + sts fat_clust_ptr+2,yl + sts fat_clust_ptr+3,yh ; Add- Subsector to Startsector fat_add_offset: - lds zl,fat_clust_offset - add xl,zl - adc xh,_0 - adc yl,_0 - adc yh,_0 + lds zl,fat_clust_offset + add xl,zl + adc xh,_0 + adc yl,_0 + adc yh,_0 ; Found the physical sector .if FAT16_DBG_FAT > 0 printstring "Sector with Offset at:",0 - mov temp,yl - mov temp2,yh - rcall printhexw - mov temp,xl - mov temp2,xh - rcall printhexw + mov temp,yl + mov temp2,yh + rcall printhexw + mov temp,xl + mov temp2,xh + rcall printhexw printnewline .endif - ori temp,255 + ori temp,255 fat_hpex: ret -; ==================================================================== +; ============================================================================ ; Function: Does a Disk write operation -; ==================================================================== +; ============================================================================ ; Parameters -; -------------------------------------------------------------------- +; ---------------------------------------------------------------------------- ; Registers : none ; Variables : [r] seekdsk Number of Disk to Read ; [r] seeksec Sector to read ; [r] seektrk Track to read -; -------------------------------------------------------------------- +; ---------------------------------------------------------------------------- ; Description: -; ==================================================================== +; ============================================================================ fat_writehost: .if FAT16_RWDEBUG > 1 @@ -1072,39 +1095,38 @@ fat_writehost: breq fat_rdwr_err ;call mmcWriteSect ; disabled till read is functioning - tst temp + tst temp breq fat_rdwr_ok rcall mgr_init_partitions - cbr temp,0x80 + cbr temp,0x80 breq fat_rdwr_err rcall fat_hostparam breq fat_rdwr_err ;call mmcWriteSect ; disabled till read is functioning - tst temp + tst temp brne fat_rdwr_err rjmp fat_rdwr_ok fat_rdwr_ok: - sts erflag,_0 + sts erflag,_0 ret fat_rdwr_err: - sts erflag,_255 - ret -; ==================================================================== + sts erflag,_255 + ret + +; ============================================================================ ; Function: Does a Disk read operation -; ==================================================================== -; Parameters -; -------------------------------------------------------------------- -; Registers : none -; Variables : [r] seekdsk Number of Disk to Read -; [r] seeksec Sector to read -; [r] seektrk Track to read -; -------------------------------------------------------------------- +; ============================================================================ +; Registers: none +; Variables: [in] seekdsk Number of Disk to Read +; [in] seeksec Sector to read +; [in] seektrk Track to read +; ---------------------------------------------------------------------------- ; Description: -; ==================================================================== +; ============================================================================ fat_readhost: .if FAT16_RWDEBUG > 1 @@ -1125,25 +1147,25 @@ fat_readhost: movw temp,x movw temp3,y rcall print_ultoa - pop temp - pop temp2 - pop temp3 - pop temp4 + pop temp + pop temp2 + pop temp3 + pop temp4 printnewline .endif call mmcReadSect - tst temp + tst temp breq fat_rdwr_ok rcall mgr_init_partitions - cbr temp,0x80 + cbr temp,0x80 breq fat_rdwr_err rcall fat_hostparam breq fat_rdwr_err call mmcReadSect - tst temp + tst temp brne fat_rdwr_err #endif -- 2.39.2