;
; Copyright (C) 2010 Frank Zoll
; Copyright (C) 2010 Sprite_tm
-; Copyright (C) 2010 Leo C.\r
+; Copyright (C) 2010 Leo C.
;
; This file is part of avrcpm.
;
#if FAT16_SUPPORT
-; ############################################################################ \r
+; ############################################################################
; Defines for FAT16 Structures
-; ############################################################################ \r
-\r
+; ############################################################################
+
#define PARTID_FAT16 0x0E
-\r
-/*These are the Offsets to the Variables within the Bootsector of a FAT16\r
- Partition.\r
+
+/*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_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 \r
-#define FAT16_LAST_IMAGENAME 'Z' ; Last letter of filename to search \r
+#define FAT16_FIRST_IMAGENAME 'A' ; First letter of filename to search
+#define FAT16_LAST_IMAGENAME 'Z' ; Last letter of filename to search
-; ############################################################################ \r
+; ############################################################################
; Start of Data Segment
-; ############################################################################ \r
+; ############################################################################
.dseg
fat_partfound: .byte 1 ; (partition: 0= no found 1=found )
-fat_parttbl: .byte 4 ; first fat16 partition entry \r
+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\r
- thats been searched vor. To save some of the valuabe SRAM- Space these\r
- variables also are used as temporary variables by the function \r
- fat_scan_partition.\r
- */\r
+/*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\r
-\r
+fat_clust_ptr: .byte 4; ; sector of last real cluster
+
-; ############################################################################ \r
+; ############################################################################
; Start of Code Segment
-; ############################################################################ \r
+; ############################################################################
.cseg
; ============================================================================
; Registers : none
; Variables : [out] fat_parttabl
; ----------------------------------------------------------------------------
-; Description:\r
-; This Routine initializes the internal Variables, that point to the\r
+; Description:
+; This Routine initializes the internal Variables, that point to the
; first Found FAT16 Partition.
; ============================================================================
fat_init_partitiontable:
st y+,_0
st y+,_0
st y+,_0
- ret\r
-\r
-; ============================================================================\r
+ ret
+
+; ============================================================================
; Function: Resets the Cache
-; ============================================================================\r
-; Parameters\r
-; ----------------------------------------------------------------------------\r
-; Registers : none\r
-; Variables : [out] fat_log_clust\r
-; [out] fat_last_dsk\r
-; ----------------------------------------------------------------------------\r
-; Description:\r
-; This Routine resets the internal Cache- Variables. After reset, the\r
-; next read or write Command will initialize a scan of the FAT of\r
-; the FAT16-Partition for the given sector.\r
-; ============================================================================\r
-fat_reset_cache:\r
- push yl\r
+; ============================================================================
+; 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\r
+ pop yl
ret
; ============================================================================
; Parameters
; ----------------------------------------------------------------------------
; Registers : [in] z Pointer to the Partitondata
-; Variables : [out] fat_partfound Boolean for "Partition found"\r
+; Variables : [out] fat_partfound Boolean for "Partition found"
; [out] fat_parttbl Pointer to Partitiontable
; ----------------------------------------------------------------------------
; Description:
rcall printhexw
printnewline
.endif
-\r
+
; get num of sectors per FAT-Table from bootblock
ldiw z,hostbuf+FAT16_BSO_SECPERFAT
ld temp,z+
printstring "Sectors per FAT__: ",0
rcall printhexw
printnewline
-.endif\r
-\r
+.endif
+
; get num of reseved sectors from bootblock
ldiw z,hostbuf+FAT16_BSO_RESSECT
ld temp,z+
ld temp2,z
-\r
+
; Calculate begin of FAT within the Volume
ldiw z,fat_parttbl
ldd xl,z+0
dec temp3
- jmp fat_calc_dp_loop
+ rjmp fat_calc_dp_loop
fat_calc_dp_lend:
sts fat_clust_ptr ,xl
; Here Starts the Scann of the Directory for valid image Files.
-; Init Image-Namecounter\r
- ldi temp,FAT16_FIRST_IMAGENAME\r
- sts fat_last_dsk,temp\r
-\r
-fat_scan_for_next_image:\r
-\r
-; Init Offset into Directory-Sectors\r
- ldi temp,0\r
- sts fat_clust_offset,temp\r
-\r
-; Init counter for number of entry left to scan\r
- lds temp,fat_numdirentrys\r
- sts fat_log_clust ,temp\r
-\r
- lds temp,fat_numdirentrys+1\r
- sts fat_log_clust+1,temp\r
-\r
-fat_next_sector_loop:\r
-; Get a Pointer to the first Directory sector\r
+; 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\r
- lds temp,fat_clust_offset\r
- add xl,temp\r
- adc xh,_0\r
- adc yl,_0\r
- adc yh,_0\r
-\r
+; 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
cpi temp,'_'
brne fat_look_not_ok
- lds temp3,fat_last_dsk ; Get actual Diskname (A to Z)\r
- ldd temp,z+7\r
- cp temp,temp3\r
- brne fat_look_not_ok\r
-\r
+ 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
cpi temp,'G'
brne fat_look_not_ok
- sts fat_clust_ptr ,zl\r
- sts fat_clust_ptr+1,zh\r
- sts fat_clust_ptr+2,temp2\r
- 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:\r
-\r
- lds zl ,fat_clust_ptr\r
- lds zh ,fat_clust_ptr+1\r
- lds temp2,fat_clust_ptr+2\r
+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:
- \r
- adiw z,32\r
+
+ 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:
- \r
- lds temp3, fat_log_clust\r
- lds temp4, fat_log_clust+1\r
-\r
- sub temp3,temp2\r
- sbc temp4,_0\r
-\r
- sts fat_log_clust,temp3\r
- sts fat_log_clust+1,temp4\r
- \r
- cp temp3,_0\r
- cpc temp4,_0\r
- breq fat_scan_at_end \r
-\r
- lds temp,fat_clust_offset\r
- inc temp\r
- sts fat_clust_offset,temp\r
-\r
- rjmp fat_next_sector_loop\r
-\r
-fat_scan_at_end:\r
-\r
- lds temp,fat_last_dsk\r
- inc temp\r
- sts fat_last_dsk,temp\r
-\r
- ldi temp2,FAT16_LAST_IMAGENAME\r
- cp temp,temp2\r
- brge fat_scaned_last_disk\r
-\r
- rjmp fat_scan_for_next_image\r
-\r
-fat_scaned_last_disk:\r
-\r
- rjmp fat_scan_end\r
+
+ 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
; Found a valid image
.if FAT16_DEBUG > 1
- printstring "Found a valid Image ! Z=",0\r
- mov temp ,zl\r
- mov temp2,zh\r
- rcall printhexw\r
+ printstring "Found a valid Image ! Z=",0
+ mov temp ,zl
+ mov temp2,zh
+ rcall printhexw
printnewline
.endif
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
-\r
+
; Offset to Startcluster + 2
ldd temp,z+0x1A
st y+,temp
ldi temp,0
st y+,temp
- st y+,temp\r
+ st y+,temp
-; Filesize in Bytes\r
+; Filesize in Bytes
; ldd temp,z+0x1C
; st y+,temp
; ldd temp,z+0x1D
st y+,zl
st y+,zh
-.if FAT16_DEBUG > 1\r
-; Test finding of the first sector\r
- \r
- ldd xl,z+0x1A\r
- ldd xh,z+0x1B\r
-\r
- rcall fat_gethostsec\r
-\r
- printstring "Begin of Image at: ",0\r
- mov temp ,yl\r
- mov temp2,yh\r
- rcall printhexw\r
- mov temp ,xl\r
- mov temp2,xh\r
- rcall printhexw\r
- printnewline\r
-\r
-.endif\r
+.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\r
- breq fat_scan_end \r
+ cpi temp,MAXDISKS
+ breq fat_scan_end
- jmp fat_scan_for_more \r
+ rjmp fat_scan_for_more
-fat_scan_end:\r
+fat_scan_end:
ret
; Variables: [in] fat_clustersize Ammount of Sectors per Cluster
; [out] temp =0
; ----------------------------------------------------------------------------
-; Description:\r
-; Calculates the logical Sectornumber given the physical ClusterNumber\r
-; and the size of a Cluster un sectors.\r
+; 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
; ====================================================================
; Registers: [in] xh,xl logical- Cluster
; [out] yh,yl physical- Cluster
-; Variables:\r
+; Variables:
; --------------------------------------------------------------------
; Description:
; ====================================================================
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
adc xh,_0
adc yl,_0
adc yh,_0
- call mmcReadWord
+ lcall mmcReadWord
pop xh
pop xl
rjmp fat_next_phsy_clust
; Found the physical cluster
-fat_found_phsy_clust:\r
+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
; ============================================================================
; Function: This Routine searches for the Sector within an Imagefile
; ============================================================================
-; Registers: [out] xl,xh,yl,yh Pointer to the Sector on the SD-Card\r
+; 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\r
+; [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\r
+; [in] fat_clust_ptr sector of last real cluster
; ----------------------------------------------------------------------------
; Description:
-; This Routine uses the variables hostdsk and hostlba to find an Sector\r
-; in the Imagefile.\r
-; The CP/M Sector given within "hostlba" are splited to a logical Cluster-\r
-; Number and the Subsector within this logical Cluster.\r
-; logical Cluster Number = hostlba / fat_clustersize\r
-; The logical Cluster Number will be compared to the logical Cluster- Number\r
-; within the Cache. When this Clusters are the same and the DiskID's are\r
-; also the same, then the cached physical Sector will be used.\r
-; When the Clusters or the Disks don't match, a seek for the physical\r
-; Cluster is performed. This seek is done thru an access over the FAT of\r
-; the FAT16 Partition. The Routine starts at the first Cluster of the \r
-; Imagefile and goes along the linked list of Clusternumber till it reaches\r
-; the searched cluster. The found Clusternumber will be used to calculate\r
-; the Sektor where this Cluster lies on the SD- Card. Both the found physical\r
-; Cluster and the logical Cluster together with the physical Sectornumber\r
-; are stored in the cache.\r
-; The last step done is to add the SubSectorOffset to the found physical\r
-; Sector. This gives the pointer to the Sector to be read and or written.\r
+; 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:
lsr zl
- rjmp fat_search_clst_lp\r
+ rjmp fat_search_clst_lp
fat_found_clst:
; at this point xh and xl are carying the logical cluster number
mov xl,yl
mov xh,yh
rcall fat_gethostsec
-\r
+
; 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
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
; ============================================================================
; Registers: [out] temp Error-Variable ( 0= No Error)
; Variables: [in] hostdsk host disk #, (partition #)
-; [in] hostlba host block #, relative to part.start\r
+; [in] hostlba host block #, relative to part.start
; [in] hostbuf Sector to be written
; ----------------------------------------------------------------------------
-; Description:\r
+; Description:
; This Routine writes a Sector to the Imagefile inside an FAT16 Partition.
; ============================================================================
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
fat_rdwr_err:
sts erflag,_255
- ret\r
+ ret
; ============================================================================
; Function: Does a Disk read operation
; ============================================================================
; Registers: none
; Variables: [in] hostdsk host disk #, (partition #)
-; [in] hostlba host block #, relative to part.start\r
+; [in] hostlba host block #, relative to part.start
; [out] hostbuf Sector read by this routine
; ----------------------------------------------------------------------------
-; Description:\r
+; Description:
; This Routine reads a Sector from the Imagefile inside an FAT16 Partition.
; ============================================================================
push temp
movw temp,x
movw temp3,y
- rcall print_ultoa
+ lcall print_ultoa
pop temp
pop temp2
pop temp3
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