+; Various functions for the Interaction with the FAT16 Filesystem
+;
+; Copyright (C) 2010 Frank Zoll
+;
+; This file is part of avrcpm.
+;
+; avrcpm is free software: you can redistribute it and/or modify it
+; under the terms of the GNU General Public License as published by
+; the Free Software Foundation, either version 3 of the License, or
+; (at your option) any later version.
+;
+; avrcpm is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with avrcpm. If not, see <http://www.gnu.org/licenses/>.
+;
+; $Id$
+;\r
+\r
+; ===========================================================================\r
+; Prelimitary !\r
+; °°°°°°°°°°°°°\r
+; Size of a Sector is fixed to 512 Bytes by Base - MMC Driver implementation\r
+; The Functions below therefore assume a fixed Size of 512 Bytes per Sector.\r
+; ===========================================================================\r
+\r
+#ifndef FAT16_SUPPORT\r
+ #define FAT16_SUPPORT 1\r
+ #define FAT16_DEBUG 2\r
+#endif\r
+\r
+#if FAT16_SUPPORT\r
+\r
+\r
+;-------------------------------- Defines for FAT16 Structures
+#define PARTID_FAT16 0x0E\r
+\r
+;#define FAT16_BSO_SECSIZE 0x0b ; BootSectorOffset to Sectorsize Word\r
+#define FAT16_BSO_CLUSTSZ 0x0d ; BootSectorOffset to Clustersize Byte\r
+#define FAT16_BSO_RESSECT 0x0e ; BootSectorOffset to Number of Reserved Sectors\r
+#define FAT16_BSO_VOLPTR 0x1c ; BootSectorOffset to First VolumeSector\r
+#define FAT16_BSO_SECPERFAT 0x16 ; BootSectorOffset to Number of Sectors per Fat\r
+#define FAT16_BSO_NUMFATCP 0x10 ; BootSectorOffset to Ammount of FAT Copys\r
+#define FAT16_BSO_NUMDIRENT 0x11 ; BootSectorOffset to Max. Root Dir. Entrys\r
+\r
+;-------------------------------- Start of Data Segment
+
+ .dseg\r
+\r
+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\r
+fat_clustersize: .byte 1 ; sectors per cluster\r
+fat_ressectors: .byte 2 ; number of reserved sectors\r
+fat_secperfat: .byte 2 ; number of sectors per fat\r
+fat_numfatcp: .byte 1 ; Number of FAT Copies\r
+fat_numdirentrys:.byte 2 ; Max. ammount of Directory Entrys within Rootdirektory\r
+fat_ptr2fat: .byte 4 ; pointer to the first fat sector\r
+fat_ptr2dir: .byte 4 ; pointer to the first root directory sector\r
+fat_ptr2dat: .byte 4 ; pointer to the first data sector\r
+\r
+; ------------------------------- Start of Code Segment
+ .cseg\r
+\r
+; ====================================================================\r
+; Function: Does a Disk read/write operation
+; ====================================================================\r
+; Parameters\r
+; --------------------------------------------------------------------\r
+; Registers : none\r
+; Variables : [r] seekdsk Number of Disk to Read\r
+; [r] seeksec Sector to read\r
+; [r] seektrk Track to read\r
+; --------------------------------------------------------------------\r
+; Description:\r
+; ====================================================================\r
+fat_init_partitiontable:\r
+\r
+ sts fat_partfound,_0\r
+\r
+ ldiw y,fat_parttbl\r
+ st y+,_0\r
+ st y+,_0\r
+ st y+,_0\r
+ st y+,_0\r
+ st y+,_0\r
+ st y+,_0\r
+ st y+,_0\r
+ st y+,_0\r
+ ret\r
+\r
+; ====================================================================\r
+; Function: Add's a FAT16 Partition for later Scanning
+; ====================================================================\r
+; Parameters\r
+; --------------------------------------------------------------------\r
+; Registers : \r
+; Variables : \r
+; --------------------------------------------------------------------\r
+; Description:\r
+; This funktion sets the internal Variables to set Start and Size\r
+; of a given FAT16 Paritition. This Information will be used for a\r
+; later scanning of the Partition. See Function "fat_scan_partition"\r
+; for more information. \r
+; ====================================================================\r
+fat_add_partition:\r
+ \r
+.if FAT16_DEBUG > 0
+ printstring "fat16 part found",0\r
+ printnewline\r
+.endif\r
+\r
+\r
+; save variables on stack\r
+ push yl\r
+ push yh\r
+\r
+; set fat16 partition found flag\r
+ ldi yl,1\r
+ sts fat_partfound,yl\r
+\r
+; save data from first fat16 partition\r
+ 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_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\r
+\r
+\r
+; reload variables from stack\r
+ pop yh\r
+ pop yl\r
+
+ ret
+\r
+; --------------------------------------------------------------------------- \r
+; Read and Scann a FAT16 Partition for Imagedatefiles
+; --------------------------------------------------------------------------- \r
+; This Routine reads the Bootblock and scanns it for a Diskimage\r
+; Input Registers : none\r
+; Output Registers : none\r
+; Changes Variables: none\r
+; --------------------------------------------------------------------------- \r
+\r
+\r
+fat_scan_partition:\r
+\r
+.if FAT16_DEBUG > 0
+ printstring "fat16 scanning",0\r
+ printnewline\r
+.endif\r
+\r
+; Check if a FAT16 Partition was realy found\r
+ lds yl,fat_partfound\r
+ cpi yl,1 \r
+ brne fat_scan_error \r
+\r
+\r
+.if FAT16_DEBUG > 0
+ printstring "free entrys in ptable ?",0\r
+ printnewline\r
+.endif\r
+\r
+; Check for free Entrys in Partition table\r
+ lds yl,ndisks\r
+ cpi yl,MAXDISKS\r
+ breq fat_scan_error\r
+\r
+.if FAT16_DEBUG > 0
+ printstring "read fat bootblock.",0\r
+ printnewline\r
+.endif\r
+\r
+; Scan partition start\r
+ ldiw z,fat_parttbl
+ ldd xl,z+0
+ ldd xh,z+1
+ ldd yl,z+2
+ ldd yh,z+3\r
+\r
+; Load first sector from Partition
+ rcall mmcReadSect
+ tst temp
+ breq fat_bootblock_check\r
+\r
+; Read error: Block not found\r
+fat_scan_error:\r
+ clr temp\r
+ ret\r
+\r
+fat_bootblock_check:\r
+\r
+.if FAT16_DEBUG > 0
+ printstring "fat16 bootblock check",0\r
+ printnewline\r
+.endif\r
+\r
+; -> Size of Sectors fixed at 512 Bytes\r
+; Get ammount of Bytes per Sector\r
+; ldiw z,hostbuf+FAT16_BSO_SECSIZE\r
+; ldiw y,fat_sectorsize\r
+; ld temp,z\r
+; st y+, temp\r
+; ldd temp2,z+1\r
+; st y , temp2\r
+;\r
+;.if FAT16_DEBUG > 0\r
+; printstring "Bytes per Sector ",0\r
+; rcall printhexw\r
+; printnewline\r
+;.endif\r
+\r
+; Anzahl der Sectoren pro Cluster lesen\r
+ ldiw z,hostbuf+FAT16_BSO_CLUSTSZ\r
+ ld temp,z\r
+ sts fat_clustersize,temp\r
+\r
+.if FAT16_DEBUG > 0\r
+ printstring "Sectors per Cluster ",0\r
+ rcall printhex\r
+ printnewline\r
+.endif\r
+\r
+; Anzahl der reservierten Sectoren\r
+ ldiw z,hostbuf+FAT16_BSO_RESSECT\r
+ ld temp,z+\r
+ sts fat_ressectors,temp ; low byte\r
+ ld temp2,z\r
+ sts fat_ressectors+1,temp2 ; high byte\r
+\r
+.if FAT16_DEBUG > 0\r
+ printstring "Reserved Sectors__: ",0\r
+ rcall printhexw\r
+ printnewline\r
+.endif\r
+\r
+; Anzahl der Sectoren pro FAT\r
+ ldiw z,hostbuf+FAT16_BSO_SECPERFAT\r
+ ld temp,z+\r
+ sts fat_secperfat,temp ; low byte\r
+ ld temp2,z\r
+ sts fat_secperfat+1,temp2 ; high byte\r
+\r
+.if FAT16_DEBUG > 0\r
+ printstring "Sectors per FAT__: ",0\r
+ rcall printhexw\r
+ printnewline\r
+.endif\r
+\r
+; Anzahl der FAT kopien\r
+ ldiw z,hostbuf+FAT16_BSO_NUMFATCP\r
+ ld temp,z\r
+ sts fat_numfatcp,temp ; low byte\r
+\r
+.if FAT16_DEBUG > 0\r
+ printstring "Ammount of FAT copies: ",0\r
+ rcall printhex\r
+ printnewline\r
+.endif\r
+\r
+; Max. Anzahl der Dir. Enträge im Root Verz.\r
+ ldiw z,hostbuf+FAT16_BSO_NUMDIRENT\r
+ ld temp,z+\r
+ sts fat_numdirentrys,temp ; low byte\r
+ ld temp2,z\r
+ sts fat_numdirentrys+1,temp2 ; high byte\r
+\r
+.if FAT16_DEBUG > 0\r
+ printstring "Max. entrys in Rootdir.: ",0\r
+ rcall printhexw\r
+ printnewline\r
+.endif\r
+\r
+; Print begin of Volume\r
+.if FAT16_DEBUG > 1\r
+\r
+ ldiw z,fat_parttbl
+ ldd xl,z+0
+ ldd xh,z+1
+ ldd yl,z+2
+ ldd yh,z+3\r
+\r
+ printstring "Begin of Volume 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
+.endif\r
+\r
+; Calculate begin of FAT within the Volume\r
+ lds temp ,fat_ressectors\r
+ lds temp2,fat_ressectors+1\r
+\r
+ ldiw z,fat_parttbl
+ ldd xl,z+0
+ ldd xh,z+1
+ ldd yl,z+2
+ ldd yh,z+3\r
+\r
+ add xl,temp\r
+ adc xh,temp2\r
+ adc yl,_0\r
+ adc yh,_0\r
+\r
+ sts fat_ptr2fat ,xl\r
+ sts fat_ptr2fat+1,xh\r
+ sts fat_ptr2fat+2,yl\r
+ sts fat_ptr2fat+3,yh\r
+\r
+.if FAT16_DEBUG > 1\r
+ printstring "Begin of FAT 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
+.endif\r
+\r
+; Calculate begin of Root- Directory within the Volume\r
+ ldiw z,fat_ptr2fat\r
+ ldd xl,z+0\r
+ ldd xh,z+1\r
+ ldd yl,z+2\r
+ ldd yh,z+3\r
+\r
+ lds temp ,fat_secperfat\r
+ lds temp2,fat_secperfat+1\r
+ lds temp3,fat_numfatcp\r
+\r
+fat_calc_dp_loop:\r
+ cp temp3,_0\r
+ breq fat_calc_dp_lend\r
+\r
+ add xl,temp\r
+ adc xh,temp2\r
+ adc yl,_0\r
+ adc yh,_0\r
+\r
+ dec temp3\r
+\r
+ jmp fat_calc_dp_loop\r
+fat_calc_dp_lend:\r
+\r
+ sts fat_ptr2dir ,xl\r
+ sts fat_ptr2dir+1,xh\r
+ sts fat_ptr2dir+2,yl\r
+ sts fat_ptr2dir+3,yh\r
+\r
+\r
+.if FAT16_DEBUG > 1\r
+ printstring "Begin of DIR 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
+.endif\r
+\r
+; Calculate begin of DATA Clusters within the Volume\r
+; Num. Dir.Sektors = (Num. of Dir. Entrys * 32) / Bytes per Sektor\r
+\r
+; Sectorsize is fixed at 512 Bytes, makes 16 Entrys per Sektor\r
+\r
+ lds zl,fat_numdirentrys ; low byte\r
+ lds zh,fat_numdirentrys+1 ; high byte\r
+\r
+; Num. Direntrys / 16\r
+ lsr zh\r
+ ror zl\r
+ lsr zh\r
+ ror zl\r
+ lsr zh\r
+ ror zl\r
+ lsr zh\r
+ ror zl\r
+\r
+ lds xl,fat_ptr2dir\r
+ lds xh,fat_ptr2dir+1\r
+ lds yl,fat_ptr2dir+2\r
+ lds yh,fat_ptr2dir+3\r
+\r
+ add xl,zl\r
+ adc xh,zh\r
+ adc yl,_0\r
+ adc yh,_0\r
+\r
+ sts fat_ptr2dat ,xl\r
+ sts fat_ptr2dat+1,xh\r
+ sts fat_ptr2dat+2,yl\r
+ sts fat_ptr2dat+3,yh\r
+\r
+.if FAT16_DEBUG > 1\r
+ printstring "Begin of Data 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
+.endif\r
+\r
+; Here Starts the Scann of the Directory for valid image Files.\r
+\r
+ lds xl,fat_ptr2dir\r
+ lds xh,fat_ptr2dir+1\r
+ lds yl,fat_ptr2dir+2\r
+ lds yh,fat_ptr2dir+3\r
+\r
+; Load first sector from Directory
+ call mmcReadSect
+ tst temp
+ breq fat_look_for_images\r
+\r
+; Read error: Block not found\r
+ clr temp\r
+ ret\r
+\r
+; Looks at a read directory block for image entrys\r
+fat_look_for_images:\r
+ \r
+ ldiw z,hostbuf\r
+ ldi temp2,0\r
+\r
+fat_look_for_loop: \r
+ ldd temp,z+0\r
+ cpi temp,'C'\r
+ brne fat_look_not_ok\r
+ \r
+ ldd temp,z+1\r
+ cpi temp,'P'\r
+ brne fat_look_not_ok\r
+\r
+ ldd temp,z+2\r
+ cpi temp,'M'\r
+ brne fat_look_not_ok\r
+\r
+ ldd temp,z+3\r
+ cpi temp,'D'\r
+ brne fat_look_not_ok\r
+\r
+ ldd temp,z+4\r
+ cpi temp,'S'\r
+ brne fat_look_not_ok\r
+\r
+ ldd temp,z+5\r
+ cpi temp,'K'\r
+ brne fat_look_not_ok\r
+\r
+ ldd temp,z+6\r
+ cpi temp,'_'\r
+ brne fat_look_not_ok\r
+\r
+ ldd temp,z+8\r
+ cpi temp,'I'\r
+ brne fat_look_not_ok\r
+\r
+ ldd temp,z+9\r
+ cpi temp,'M'\r
+ brne fat_look_not_ok\r
+\r
+ ldd temp,z+10\r
+ cpi temp,'G'\r
+ brne fat_look_not_ok\r
+\r
+ jmp fat_store_new_entry\r
+\r
+fat_look_not_ok:\r
+ \r
+ //ldi temp,32\r
+ addiw z,32 \r
+\r
+ inc temp2\r
+ cpi temp2,16 ; max entrys/sector\r
+ breq fat_scan_next_sector\r
+ jmp fat_look_for_loop\r
+\r
+fat_scan_next_sector:\r
+\r
+ ret\r
+\r
+\r
+; Create new Partition Entry\r
+fat_store_new_entry:\r
+\r
+; Found a valid image\r
+.if FAT16_DEBUG > 1\r
+ printstring "Found a valid Image ! ",0\r
+ printnewline\r
+.endif\r
+\r
+ ldiw y,hostparttbl\r
+ lds temp,ndisks\r
+\r
+fat_look_store_loop:\r
+ cp temp,_0\r
+ breq fat_look_store\r
+\r
+ adiw y,PARTENTRY_SIZE\r
+ dec temp\r
+ jmp fat_look_store_loop\r
+\r
+fat_look_store:\r
+; Set Type of Partition to FAT16- Fileimage\r
+ ldi temp,dskType_FAT\r
+ st y+,temp\r
+\r
+; Offset to Startcluster + 2
+ ldd temp,z+0x1A
+ st y+,temp
+ ldd temp,z+0x1B
+ st y+,temp \r
+ ldi temp,0\r
+ st y+,temp
+ st y+,temp\r
+\r
+; Filesize in Bytes - 2,4,8,16,32,64,128,256,512 \r
+; ldd temp,z+0x1C\r
+; st y+,temp
+; ldd temp,z+0x1D\r
+; st y+,temp
+; ldd temp,z+0x1E\r
+; st y+,temp
+; ldd temp,z+0x1F\r
+; st y+,temp\r
+\r
+; Convert Filesize to ammount of sectors\r
+ ldd xl,z+0x1D\r
+ ldd xh,z+0x1E\r
+ ldd zl,z+0x1F\r
+ mov zh,_0\r
+\r
+ lsr zh\r
+ ror zl\r
+ ror xh\r
+ ror xl\r
+\r
+; store ammount of sectors in partitiontable \r
+ st y+,xl
+ st y+,xh
+ st y+,zl
+ st y+,zh
+\r
+; Check for another free entry in partition table\r
+ lds temp,ndisks\r
+ inc temp\r
+ sts ndisks,temp\r
+ \r
+\r
+.if FAT16_DEBUG > 1\r
+; Test finding of the first sector\r
+ ldd xl,z+0x1A\r
+ ldd xh,z+0x1B\r
+ ldi zl,0\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
+ \r
+; cp temp,MAXDISKS\r
+; brne fat_scan_for_more \r
+ \r
+ ret\r
+\r
+\r
+; ====================================================================\r
+; Function: Cluster+Offset to HostSector
+; ====================================================================\r
+; Parameters: [in] xh,xl Cluster Number\r
+; [in] zl Offset\r
+; [out] yh,yl,xh,xl Sector Number on Disk\r
+; --------------------------------------------------------------------\r
+; Registers : \r
+; Variables : [used] fat_clustersize Ammount of Sectors per Cluster\r
+; [changes] temp\r
+; --------------------------------------------------------------------\r
+; Description:\r
+; ! Only works with Clustersizes 1,2,4,8,16,32,64,128 !\r
+; ====================================================================\r
+fat_gethostsec:\r
+\r
+; Get Offset into Data area of Disk\r
+ rcall fat_clusttosec\r
+\r
+; add given offset\r
+ add xl,zl\r
+ adc xh,_0\r
+ adc yl,_0\r
+ adc yh,_0\r
+\r
+; add begin of data area to offset\r
+ lds temp,fat_ptr2dat+0\r
+ add xl,temp\r
+ lds temp,fat_ptr2dat+1\r
+ adc xh,temp\r
+ lds temp,fat_ptr2dat+2\r
+ adc yl,temp\r
+ lds temp,fat_ptr2dat+3\r
+ adc yh,temp\r
+ ret\r
+\r
+; ====================================================================\r
+; Function: Cluster to Sector
+; ====================================================================\r
+; Parameters: [in] xl,xh Cluster Number\r
+; [out] xl,xh,yl,yh Sector Number\r
+; --------------------------------------------------------------------\r
+; Registers : \r
+; Variables : [used] fat_clustersize Ammount of Sectors per Cluster\r
+; [changes] temp\r
+; --------------------------------------------------------------------\r
+; Description:\r
+; ! Only works with Clustersizes 1,2,4,8,16,32,64,128 !\r
+; ====================================================================\r
+fat_clusttosec:\r
+ clr yl\r
+ clr yh\r
+\r
+ ldi temp,2\r
+ sub xl,temp ; Substract the 2 reserved clusters\r
+ sbc xh,_0\r
+\r
+ lds temp,fat_clustersize\r
+\r
+fat_c2s_loop:\r
+ lsr temp\r
+ tst temp\r
+ breq fat_c2s_end\r
+\r
+ lsl xl\r
+ rol xh\r
+ rol yl\r
+ rol yh\r
+ rjmp fat_c2s_loop\r
+\r
+fat_c2s_end:\r
+ ret\r
+\r
+; ====================================================================\r
+; Function: CP/M Sector to Cluster & Offset
+; ====================================================================\r
+; Parameters: [in] xl,xh Cluster Number\r
+; [out] xl,xh,yl,yh Sector Number\r
+; --------------------------------------------------------------------\r
+; Registers : \r
+; Variables : [used] fat_clustersize Ammount of Sectors per Cluster\r
+; [changes] temp\r
+; --------------------------------------------------------------------\r
+; Description:\r
+; ! Only works with Clustersizes 1,2,4,8,16,32,64,128 !\r
+; ====================================================================\r
+fat_cpmtoclust:\r
+\r
+ ret\r
+\r
+; ====================================================================\r
+; Function: Does a Disk write operation
+; ====================================================================\r
+; Parameters\r
+; --------------------------------------------------------------------\r
+; Registers : none\r
+; Variables : [r] seekdsk Number of Disk to Read\r
+; [r] seeksec Sector to read\r
+; [r] seektrk Track to read\r
+; hostdsk = host disk #, (partition #)
+; hostlba = host block #, relative to partition start
+; Read/Write "hostsize" bytes to/from hostbuf\r
+; --------------------------------------------------------------------\r
+; Description:\r
+; ====================================================================
+
+fat_hostparam:
+ lds xl,hostdsk
+\r
+.if HOSTRW_DEBUG
+ mov temp,xl
+ subi temp,-('A')
+ rcall uartputc
+ printstring ": "
+.endif
+\r
+ rcall dsk_getpartentry ; get partition entry
+\r
+fat_hostlend:\r
+ lds temp ,hostlba
+ lds temp2,hostlba+1
+ lds temp3,hostlba+2
+
+.if HOSTRW_DEBUG
+ printstring "lba: "
+ clr temp4
+ rcall print_ultoa
+.endif
+
+ 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
+ brcs fat_hp1
+
+.if HOSTRW_DEBUG
+ printstring ", max: "
+ push temp4
+ push temp3
+ push temp2
+ push temp
+ movw temp,x
+ mov temp3,yl
+ clr temp4
+ rcall print_ultoa
+ pop temp
+ pop temp2
+ pop temp3
+ pop temp4
+ printstring " "
+.endif
+
+ clr temp
+ ret
+
+fat_hp1:
+ ldd xl,z+1 ; startsector
+ ldd xh,z+2
+ ldd yl,z+3
+ ldd yh,z+4
+
+ add xl,temp ; startsector + offset
+ adc xh,temp2
+ adc yl,temp3
+ adc yh,_0\r
+
+.if HOSTRW_DEBUG
+ printstring ", abs:"
+ push temp4
+ push temp3
+ push temp2
+ push temp
+ movw temp,x
+ movw temp3,y
+ rcall print_ultoa
+ pop temp
+ pop temp2
+ pop temp3
+ pop temp4
+ printstring " "
+.endif\r
+
+ ori temp,255
+fat_hpex:
+ ret
+
+; ====================================================================\r
+; Function: Does a Disk write operation
+; ====================================================================\r
+; Parameters\r
+; --------------------------------------------------------------------\r
+; Registers : none\r
+; Variables : [r] seekdsk Number of Disk to Read\r
+; [r] seeksec Sector to read\r
+; [r] seektrk Track to read\r
+; --------------------------------------------------------------------\r
+; Description:\r
+; ====================================================================
+
+fat_writehost:
+.if HOSTRW_DEBUG
+ printnewline
+ printstring "host write "
+.endif
+ rcall fat_hostparam
+ breq fat_rdwr_err
+
+ ;call mmcWriteSect ; disabled till read is functioning
+ tst temp
+ breq fat_rdwr_ok
+
+ 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
+ tst temp
+ brne fat_rdwr_err
+ rjmp fat_rdwr_ok
+
+; ====================================================================\r
+; Function: Does a Disk read operation
+; ====================================================================\r
+; Parameters\r
+; --------------------------------------------------------------------\r
+; Registers : none\r
+; Variables : [r] seekdsk Number of Disk to Read\r
+; [r] seeksec Sector to read\r
+; [r] seektrk Track to read\r
+; --------------------------------------------------------------------\r
+; Description:\r
+; ====================================================================\r
+
+fat_readhost:
+.if HOSTRW_DEBUG
+ printnewline
+ printstring "host read "
+.endif\r
+
+ rcall fat_hostparam
+ breq fat_rdwr_err
+
+ call mmcReadSect
+ tst temp
+ breq fat_rdwr_ok
+
+ rcall mgr_init_partitions
+ cbr temp,0x80
+ breq fat_rdwr_err
+
+ rcall fat_hostparam
+ breq fat_rdwr_err
+ call mmcReadSect
+ tst temp
+ brne fat_rdwr_err
+
+fat_rdwr_ok:
+ sts erflag,_0
+ ret
+
+fat_rdwr_err:
+ sts erflag,_255
+ ret\r
+#endif\r