X-Git-Url: http://cloudbase.mooo.com/gitweb/avrcpm.git/blobdiff_plain/32618ce120d49871ee23e7a3c1c9d061a024d10a..29ce189c438e15067a26aebcb12227a9c172a384:/avrcpm/avr/dsk_fat16.asm?ds=sidebyside diff --git a/avrcpm/avr/dsk_fat16.asm b/avrcpm/avr/dsk_fat16.asm index cc25afd..42c3ae0 100644 --- a/avrcpm/avr/dsk_fat16.asm +++ b/avrcpm/avr/dsk_fat16.asm @@ -2,7 +2,7 @@ ; ; Copyright (C) 2010 Frank Zoll ; Copyright (C) 2010 Sprite_tm -; Copyright (C) 2010 Leo C. +; Copyright (C) 2010 Leo C. ; ; This file is part of avrcpm. ; @@ -32,14 +32,14 @@ #if FAT16_SUPPORT -; ############################################################################ +; ############################################################################ ; Defines for FAT16 Structures -; ############################################################################ - +; ############################################################################ + #define PARTID_FAT16 0x0E - -/*These are the Offsets to the Variables within the Bootsector of a FAT16 - Partition. + +/*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 @@ -48,36 +48,36 @@ #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 +#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 ; (partition: 0= no found 1=found ) -fat_parttbl: .byte 4 ; first fat16 partition entry +fat_parttbl: .byte 4 ; first fat16 partition entry ; only startsector is needed fat_clustersize: .byte 1 ; sectors per cluster fat_numdirentrys:.byte 2 ; Max. num. of entrys within Rootdirektory fat_ptr2fat: .byte 4 ; pointer to the first fat 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. - */ +/*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 - +fat_clust_ptr: .byte 4; ; sector of last real cluster + -; ############################################################################ +; ############################################################################ ; Start of Code Segment -; ############################################################################ +; ############################################################################ .cseg ; ============================================================================ @@ -88,8 +88,8 @@ fat_clust_ptr: .byte 4; ; sector of last real cluster ; Registers : none ; Variables : [out] fat_parttabl ; ---------------------------------------------------------------------------- -; Description: -; This Routine initializes the internal Variables, that point to the +; Description: +; This Routine initializes the internal Variables, that point to the ; first Found FAT16 Partition. ; ============================================================================ fat_init_partitiontable: @@ -101,29 +101,29 @@ fat_init_partitiontable: st y+,_0 st y+,_0 st y+,_0 - ret - -; ============================================================================ + ret + +; ============================================================================ ; Function: Resets the Cache -; ============================================================================ -; Parameters -; ---------------------------------------------------------------------------- -; 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 +; ============================================================================ +; Parameters +; ---------------------------------------------------------------------------- +; 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+1,yl sts fat_last_dsk ,yl - pop yl + pop yl ret ; ============================================================================ @@ -132,7 +132,7 @@ fat_reset_cache: ; Parameters ; ---------------------------------------------------------------------------- ; Registers : [in] z Pointer to the Partitondata -; Variables : [out] fat_partfound Boolean for "Partition found" +; Variables : [out] fat_partfound Boolean for "Partition found" ; [out] fat_parttbl Pointer to Partitiontable ; ---------------------------------------------------------------------------- ; Description: @@ -290,7 +290,7 @@ fat_bootblock_check: rcall printhexw printnewline .endif - + ; get num of sectors per FAT-Table from bootblock ldiw z,hostbuf+FAT16_BSO_SECPERFAT ld temp,z+ @@ -302,13 +302,13 @@ fat_bootblock_check: printstring "Sectors per FAT__: ",0 rcall printhexw printnewline -.endif - +.endif + ; get num of reseved sectors from bootblock ldiw z,hostbuf+FAT16_BSO_RESSECT ld temp,z+ ld temp2,z - + ; Calculate begin of FAT within the Volume ldiw z,fat_parttbl ldd xl,z+0 @@ -359,7 +359,7 @@ fat_calc_dp_loop: dec temp3 - jmp fat_calc_dp_loop + rjmp fat_calc_dp_loop fat_calc_dp_lend: sts fat_clust_ptr ,xl @@ -425,39 +425,39 @@ fat_calc_dp_lend: ; Here Starts the Scann of the Directory for valid image Files. -; Init Image-Namecounter - 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 - -; Init counter for number of entry left to scan - lds temp,fat_numdirentrys - sts fat_log_clust ,temp - - lds temp,fat_numdirentrys+1 - sts fat_log_clust+1,temp - -fat_next_sector_loop: -; Get a Pointer to the first Directory sector +; Init Image-Namecounter + 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 + +; Init counter for number of entry left to scan + lds temp,fat_numdirentrys + sts fat_log_clust ,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_clust_ptr lds xh,fat_clust_ptr+1 lds yl,fat_clust_ptr+2 lds yh,fat_clust_ptr+3 -; Add actual offset - lds temp,fat_clust_offset - add xl,temp - adc xh,_0 - adc yl,_0 - adc yh,_0 - +; Add actual offset + lds temp,fat_clust_offset + add xl,temp + adc xh,_0 + adc yl,_0 + adc yh,_0 + ; Load sector from Directory - call mmcReadSect + lcall mmcReadSect tst temp breq fat_look_for_images @@ -500,11 +500,11 @@ fat_look_for_loop: 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 - brne fat_look_not_ok - + 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' brne fat_look_not_ok @@ -517,62 +517,62 @@ fat_look_for_loop: 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 + rjmp fat_store_new_entry -fat_scan_for_more: - - lds zl ,fat_clust_ptr - lds zh ,fat_clust_ptr+1 - lds temp2,fat_clust_ptr+2 +fat_scan_for_more: + + lds zl ,fat_clust_ptr + lds zh ,fat_clust_ptr+1 + lds temp2,fat_clust_ptr+2 fat_look_not_ok: - - adiw z,32 + + adiw z,32 inc temp2 cpi temp2,16 ; max entrys/sector breq fat_scan_next_sector - jmp fat_look_for_loop + rjmp fat_look_for_loop fat_scan_next_sector: - - lds temp3, fat_log_clust - lds temp4, fat_log_clust+1 - - sub temp3,temp2 - sbc temp4,_0 - - sts fat_log_clust,temp3 - sts fat_log_clust+1,temp4 - - cp temp3,_0 - cpc temp4,_0 - breq fat_scan_at_end - - lds temp,fat_clust_offset - inc temp - sts fat_clust_offset,temp - - rjmp fat_next_sector_loop - -fat_scan_at_end: - - lds temp,fat_last_dsk - inc temp - sts fat_last_dsk,temp - - ldi temp2,FAT16_LAST_IMAGENAME - cp temp,temp2 - brge fat_scaned_last_disk - - rjmp fat_scan_for_next_image - -fat_scaned_last_disk: - - rjmp fat_scan_end + + lds temp3, fat_log_clust + lds temp4, fat_log_clust+1 + + sub temp3,temp2 + sbc temp4,_0 + + sts fat_log_clust,temp3 + sts fat_log_clust+1,temp4 + + cp temp3,_0 + cpc temp4,_0 + breq fat_scan_at_end + + lds temp,fat_clust_offset + inc temp + sts fat_clust_offset,temp + + rjmp fat_next_sector_loop + +fat_scan_at_end: + + lds temp,fat_last_dsk + inc temp + sts fat_last_dsk,temp + + ldi temp2,FAT16_LAST_IMAGENAME + cp temp,temp2 + brge fat_scaned_last_disk + + rjmp fat_scan_for_next_image + +fat_scaned_last_disk: + + rjmp fat_scan_end ; Create new Partition Entry @@ -580,10 +580,10 @@ 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 + printstring "Found a valid Image ! Z=",0 + mov temp ,zl + mov temp2,zh + rcall printhexw printnewline .endif @@ -596,14 +596,14 @@ fat_look_store_loop: adiw y,PARTENTRY_SIZE dec temp - jmp fat_look_store_loop + rjmp fat_look_store_loop fat_look_store: ; Set Type of Partition to FAT16- Fileimage ldi temp,dskType_FAT st y+,temp - + ; Offset to Startcluster + 2 ldd temp,z+0x1A st y+,temp @@ -613,9 +613,9 @@ fat_look_store: ldi temp,0 st y+,temp - st y+,temp + st y+,temp -; Filesize in Bytes +; Filesize in Bytes ; ldd temp,z+0x1C ; st y+,temp ; ldd temp,z+0x1D @@ -643,35 +643,35 @@ fat_look_store: st y+,zl st y+,zh -.if FAT16_DEBUG > 1 -; Test finding of the first sector - - ldd xl,z+0x1A - ldd xh,z+0x1B - - 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 - printnewline - -.endif +.if FAT16_DEBUG > 1 +; Test finding of the first sector + + ldd xl,z+0x1A + ldd xh,z+0x1B + + 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 + printnewline + +.endif ; Check for another free entry in partition table lds temp,ndisks inc temp sts ndisks,temp - cpi temp,MAXDISKS - breq fat_scan_end + cpi temp,MAXDISKS + breq fat_scan_end - jmp fat_scan_for_more + rjmp fat_scan_for_more -fat_scan_end: +fat_scan_end: ret @@ -714,11 +714,11 @@ fat_gethostsec: ; 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. +; 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 ! +; ! Only works with Clustersizes 2,4,8,16,32,64,128 ! ; ============================================================================ fat_clusttosec: clr yl @@ -750,7 +750,7 @@ fat_c2s_end: ; ==================================================================== ; Registers: [in] xh,xl logical- Cluster ; [out] yh,yl physical- Cluster -; Variables: +; Variables: ; -------------------------------------------------------------------- ; Description: ; ==================================================================== @@ -770,13 +770,13 @@ fat_find_phsy_clust: printstring "Search log. Cluster ",0 mov temp,xl mov temp2,xh - rcall printhexw + lcall printhexw printnewline printstring "Search phys. Cluster ",0 mov temp ,yl mov temp2,yh - rcall printhexw + lcall printhexw printnewline .endif @@ -812,7 +812,7 @@ fat_next_phsy_clust: adc xh,_0 adc yl,_0 adc yh,_0 - call mmcReadWord + lcall mmcReadWord pop xh pop xl @@ -827,13 +827,13 @@ fat_next_phsy_clust: rjmp fat_next_phsy_clust ; Found the physical cluster -fat_found_phsy_clust: +fat_found_phsy_clust: .if FAT16_DBG_FAT > 0 printstring "Found phys. Cluster at:",0 mov temp,yl mov temp2,yh - rcall printhexw + lcall printhexw printnewline .endif @@ -842,34 +842,34 @@ fat_found_phsy_clust: ; ============================================================================ ; Function: This Routine searches for the Sector within an Imagefile ; ============================================================================ -; Registers: [out] xl,xh,yl,yh Pointer to the Sector on the SD-Card +; Registers: [out] xl,xh,yl,yh Pointer to the Sector on the SD-Card ; [out] temp Error- Variable (0= No Error) ; Variables: [in] hostdsk host disk #, (partition #) -; [in] hostlba host block #, relative to part.start +; [in] hostlba host block #, relative to part.start ; [in] fat_last_dsk number of disk with entry in cache ; [in] fat_log_clust last searched logical cluster ; [in] fat_clust_offset offset within the cluster -; [in] fat_clust_ptr sector of last real cluster +; [in] fat_clust_ptr sector of last real cluster ; ---------------------------------------------------------------------------- ; Description: -; This Routine uses the variables hostdsk and hostlba to find an Sector -; in the Imagefile. -; The CP/M Sector given within "hostlba" are splited to a logical Cluster- -; Number and the Subsector within this logical Cluster. -; logical Cluster Number = hostlba / fat_clustersize -; The logical Cluster Number will be compared to the logical Cluster- Number -; within the Cache. When this Clusters are the same and the DiskID's are -; also the same, then the cached physical Sector will be used. -; When the Clusters or the Disks don't match, a seek for the physical -; Cluster is performed. This seek is done thru an access over the FAT of -; the FAT16 Partition. The Routine starts at the first Cluster of the -; Imagefile and goes along the linked list of Clusternumber till it reaches -; the searched cluster. The found Clusternumber will be used to calculate -; the Sektor where this Cluster lies on the SD- Card. Both the found physical -; Cluster and the logical Cluster together with the physical Sectornumber -; are stored in the cache. -; The last step done is to add the SubSectorOffset to the found physical -; Sector. This gives the pointer to the Sector to be read and or written. +; This Routine uses the variables hostdsk and hostlba to find an Sector +; in the Imagefile. +; The CP/M Sector given within "hostlba" are splited to a logical Cluster- +; Number and the Subsector within this logical Cluster. +; logical Cluster Number = hostlba / fat_clustersize +; The logical Cluster Number will be compared to the logical Cluster- Number +; within the Cache. When this Clusters are the same and the DiskID's are +; also the same, then the cached physical Sector will be used. +; When the Clusters or the Disks don't match, a seek for the physical +; Cluster is performed. This seek is done thru an access over the FAT of +; the FAT16 Partition. The Routine starts at the first Cluster of the +; Imagefile and goes along the linked list of Clusternumber till it reaches +; the searched cluster. The found Clusternumber will be used to calculate +; the Sektor where this Cluster lies on the SD- Card. Both the found physical +; Cluster and the logical Cluster together with the physical Sectornumber +; are stored in the cache. +; The last step done is to add the SubSectorOffset to the found physical +; Sector. This gives the pointer to the Sector to be read and or written. ; ============================================================================ fat_hostparam: @@ -918,7 +918,7 @@ fat_search_clst_lp: lsr zl - rjmp fat_search_clst_lp + rjmp fat_search_clst_lp fat_found_clst: ; at this point xh and xl are carying the logical cluster number @@ -977,16 +977,16 @@ fat_wrong_cache_clst: mov xl,yl 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 + lcall printhexw mov temp,xl mov temp2,xh - rcall printhexw + lcall printhexw printnewline .endif @@ -1009,10 +1009,10 @@ fat_add_offset: printstring "Sector with Offset at:",0 mov temp,yl mov temp2,yh - rcall printhexw + lcall printhexw mov temp,xl mov temp2,xh - rcall printhexw + lcall printhexw printnewline .endif @@ -1025,10 +1025,10 @@ fat_hpex: ; ============================================================================ ; Registers: [out] temp Error-Variable ( 0= No Error) ; Variables: [in] hostdsk host disk #, (partition #) -; [in] hostlba host block #, relative to part.start +; [in] hostlba host block #, relative to part.start ; [in] hostbuf Sector to be written ; ---------------------------------------------------------------------------- -; Description: +; Description: ; This Routine writes a Sector to the Imagefile inside an FAT16 Partition. ; ============================================================================ @@ -1040,17 +1040,25 @@ fat_writehost: rcall fat_hostparam breq fat_rdwr_err - ;call mmcWriteSect ; disabled till read is functioning + call mmcWriteSect tst temp breq fat_rdwr_ok + rjmp fat_rdwr_err ; skip disk change detection code + +; After a second thought, the following code doesn't make sense, because +; disk change (change of one or more disk images) can not reliably detected. +; At least with the existing code. + + + rcall mgr_init_partitions cbr temp,0x80 breq fat_rdwr_err rcall fat_hostparam breq fat_rdwr_err - ;call mmcWriteSect ; disabled till read is functioning + call mmcWriteSect ; disabled till read is functioning tst temp brne fat_rdwr_err rjmp fat_rdwr_ok @@ -1061,17 +1069,17 @@ fat_rdwr_ok: fat_rdwr_err: sts erflag,_255 - ret + ret ; ============================================================================ ; Function: Does a Disk read operation ; ============================================================================ ; Registers: none ; Variables: [in] hostdsk host disk #, (partition #) -; [in] hostlba host block #, relative to part.start +; [in] hostlba host block #, relative to part.start ; [out] hostbuf Sector read by this routine ; ---------------------------------------------------------------------------- -; Description: +; Description: ; This Routine reads a Sector from the Imagefile inside an FAT16 Partition. ; ============================================================================ @@ -1093,7 +1101,7 @@ fat_readhost: push temp movw temp,x movw temp3,y - rcall print_ultoa + lcall print_ultoa pop temp pop temp2 pop temp3 @@ -1101,17 +1109,19 @@ fat_readhost: printnewline .endif - call mmcReadSect + lcall mmcReadSect tst temp breq fat_rdwr_ok + rjmp fat_rdwr_err ; skip disk change detection code + rcall mgr_init_partitions cbr temp,0x80 breq fat_rdwr_err rcall fat_hostparam breq fat_rdwr_err - call mmcReadSect + lcall mmcReadSect tst temp brne fat_rdwr_err