]> cloudbase.mooo.com Git - avrcpm.git/blobdiff - avrcpm/avr/dsk_mgr.asm
* Merged fat16-test back into trunk.
[avrcpm.git] / avrcpm / avr / dsk_mgr.asm
index eae22a6132e85c8f3da9788635458e9482a29c0e..805c607accad0072568a1e2b973adc6be36e0d64 100644 (file)
-;    Various Management functions for the Interaction with the File-\r
-;    systems\r
-;\r
-;    Copyright (C) 2010 Frank Zoll\r
-;\r
-;    This file is part of avrcpm.\r
-;\r
-;    avrcpm is free software: you can redistribute it and/or modify it\r
-;    under the terms of the GNU General Public License as published by\r
-;    the Free Software Foundation, either version 3 of the License, or\r
-;    (at your option) any later version.\r
-;\r
-;    avrcpm is distributed in the hope that it will be useful,\r
-;    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-;    GNU General Public License for more details.\r
-;\r
-;    You should have received a copy of the GNU General Public License\r
-;    along with avrcpm.  If not, see <http://www.gnu.org/licenses/>.\r
-;\r
-;    $Id$\r
-;\r
-\r
-\r
-;-------------------------- Defines for the disk management Structures\r
-\r
-;----------------------------------------------- Start of Data Segment\r
-\r
-       .dseg\r
-\r
-; ------------------------------- Start of Code Segment\r
-       .cseg\r
-\r
-; ====================================================================\r
-; Function: Scans a Disk for CP/M Partions\r
-; ====================================================================\r
-; Parameters\r
-; --------------------------------------------------------------------\r
-; \r
-; Registers  : [w] temp            Number of disk images (raw and fat16) found.\r
-;                          + 0x80 if sd card changes. (not used, doesn't work)\r
-; SREG :          Z        according to temp\r
-; --------------------------------------------------------------------\r
-; Description:\r
-; This Function scans an SD-Cards Boot-Sector for valid Partitions.\r
-; First all original CP/M Partitions will be usesed as Drives for\r
-; the CPM-System. Wenn all CP/M Partitions are found, a second\r
-; scann will be made. In the second Scan, the first FAT16 Partition\r
-; on the Disk will be used for a detailed analyses. If there\r
-; are any Files like "cpm_x.img" are found, these Files will be\r
-; used as Disks by the CP/M- System. ( x must be in the Range A to D )\r
-; ==================================================================== \r
-mgr_init_partitions:\r
-\r
-       sts     ndisks,_0               ; Set Number of Disks to 0\r
-\r
-; Initialize partition table\r
-       ldiw    y,hostparttbl\r
-       ldi     temp2,PARTENTRY_SIZE*MAXDISKS\r
-mgr_picl:\r
-       st      y+,_0\r
-       dec     temp2\r
-       brne    mgr_picl\r
-\r
-; Start mmc Card interaction\r
-       lcall   mmcInit\r
-       andi    temp,MMCST_NOINIT & MMCST_NODISK\r
-       brne    mgr_pierr\r
-       \r
-;Load first sector from MMC (boot sector)\r
-       ldiw    y,0                     ; Sector 0\r
-       movw    x,y\r
-       lcall   mmcReadSect\r
-       tst     temp\r
-       breq    mgr_check_bootsektor\r
-\r
-mgr_pierr:\r
-       clr     temp\r
-       ret\r
-\r
-mgr_check_bootsektor:\r
-;Pointer to first table entry\r
-       ldiw    y,hostparttbl\r
-       ldi     temp3,0                 ;temp3 holds number of found disks (paritions)\r
-\r
-;Test, if it has a valid MBR\r
-\r
-       lds     temp,hostbuf+510        ;MBR signature (0xAA55)  at and of sector?\r
-       lds     temp2,hostbuf+510+1\r
-       ldi     temp4,0xAA\r
-       cpi     temp,0x55               \r
-       cpc     temp2,temp4\r
-       breq    mgr_search\r
-\r
-;No MBR, no partition table ...\r
-\r
-       inc     temp3                   ;pretend we have one.\r
-       sts     ndisks,temp3\r
-       ldi     temp,high((1<<16) * 128/512)\r
-       ldi     temp2,dskType_CPM\r
-       std     y+0,temp2\r
-       std     y+1,_0                  ;start at beginning of card\r
-       std     y+2,_0\r
-       std     y+3,_0\r
-       std     y+4,_0\r
-       std     y+5,_0                  ;max CP/M 2.2 disk size\r
-       std     y+6,temp                ;\r
-       std     y+7,_0\r
-       std     y+8,_0\r
-       rjmp    mgr_pend\r
-\r
-; Search for valid Partitions and ImageFiles \r
-mgr_search:\r
-       ldiw    z,hostbuf+510-64        ;Point to  first byte of partition table\r
-       ldi     temp4,4                 ;Partition table has 4 entries.\r
-\r
-mgr_ploop:\r
-\r
-;      Get Partitiontype\r
-       ldd     temp,z+PART_TYPE\r
-\r
-;   Test for CP/M Partition\r
-       cpi     temp,PARTID_CPM\r
-       brne    mgr_nextp\r
-       \r
-       rcall    cpm_add_partition\r
-\r
-       inc     temp3\r
-       sts     ndisks,temp3\r
-       cpi     temp3,MAXDISKS\r
-       breq    mgr_pend\r
-       \r
-mgr_nextp:\r
-       adiw    zl,16\r
-       dec     temp4\r
-       brne    mgr_ploop\r
-\r
-#if FAT16_SUPPORT\r
-\r
-; Test for FAT16 Partition\r
-       ldiw    z,hostbuf+510-64        ;Point to  first byte of partition table\r
-       ldi     temp4,4\r
-\r
-mgr_ploop2:\r
-;      Get Partitiontype\r
-       ldd     temp,z+PART_TYPE\r
-\r
-;   Test for FAT Partition\r
-       cpi     temp,PARTID_FAT16\r
-       brne    mgr_nextp2\r
-       \r
-       rcall   fat_add_partition\r
-\r
-       rcall   fat_scan_partition\r
-       rcall   fat_reset_cache\r
-\r
-       rjmp    mgr_pend                ;Stop after first FAT16 parrtition found.\r
-               \r
-mgr_nextp2:\r
-       adiw    zl,16\r
-       dec     temp4\r
-       brne    mgr_ploop2\r
-#endif\r
-\r
-mgr_pend:\r
-       lds     temp,ndisks             ;return # of "disks"\r
-       tst     temp\r
-       ret\r
-\r
-\r
-; ====================================================================\r
-; Function: Print partition table info\r
-; ====================================================================\r
-; Parameters\r
-; --------------------------------------------------------------------\r
-; Registers  :  none\r
-; Variables  :  [r] hostparttbl                Table with Partitioninformations\r
-;               [r] hostparttbltop     Pointer to the Top of the Table\r
-; --------------------------------------------------------------------\r
-; Description:\r
-; ====================================================================\r
-\r
-mgr_prnt_parttbl:\r
-       ldiw    z,hostparttbl\r
-       lds     yl,ndisks\r
-       ldi     xh,'A'\r
-\r
-pprl:\r
-       ldd     temp ,z+1               ;Get partition start\r
-       ldd     temp2,z+2\r
-       ldd     temp3,z+3\r
-       ldd     temp4,z+4\r
-\r
-       printnewline\r
-\r
-       cp      temp,_0                 ;If zero ...\r
-       cpc     temp2,_0\r
-       cpc     temp3,_0\r
-       cpc     temp4,_0\r
-       breq    mgr_prnop               ;... no partition table at 0\r
-\r
-; Partitiontype examining\r
-       ldd     xl,z+0\r
-; CP/M ?\r
-       cpi     xl,dskType_CPM\r
-       brne    mgr_prtb_nocpm\r
-       rcall   mgr_prnt_diskname\r
-       rcall   mgr_prnt_table_cpm\r
-       rjmp    mgr_prnt_size\r
-\r
-mgr_prtb_nocpm:\r
-#if FAT16_SUPPORT\r
-; FAT16 ?\r
-       cpi     xl,dskType_FAT\r
-       brne    mgr_prtb_nofat\r
-       rcall   mgr_prnt_diskname\r
-       rcall   mgr_prnt_table_fat\r
-       rjmp    mgr_prnt_size\r
-mgr_prtb_nofat:\r
-#endif\r
-#if 0                                  /* RAMDISK is not on SD card */\r
-; RAMDISK ?\r
-       cpi     xl,dskType_RAM\r
-       brne    mgr_prnt_err\r
-       rcall   mgr_prnt_diskname\r
-       rcall   mgr_prnt_table_ram\r
-       rjmp    mgr_prnt_size\r
-#endif\r
-mgr_prnt_err:  \r
-; Entry Error\r
-       rcall   mgr_prnt_table_err\r
-       rjmp    mgr_prnt_size\r
-\r
-mgr_prnop:\r
-       rcall   mgr_prnt_diskname\r
-       rcall   mgr_prnt_image\r
-\r
-mgr_prnt_size:\r
-       lcall   print_ultoa\r
-       printstring ", size: "\r
-\r
-       ldd     temp ,z+5               ;Get partition size\r
-       ldd     temp2,z+6\r
-       ldd     temp3,z+7\r
-       ldd     temp4,z+8\r
-\r
-       lsr     temp4\r
-       ror     temp3\r
-       ror     temp2\r
-       ror     temp\r
-       lcall   print_ultoa\r
-       printstring "KB."\r
-\r
-mgr_goto_next_part:    \r
-       adiw    z,PARTENTRY_SIZE\r
-       inc     xh\r
-       dec     yl\r
-       brne    pprl\r
-\r
-mgr_pppre:\r
-       ret\r
-       \r
-\r
-mgr_prnt_fatsize:\r
-       lcall   print_ultoa\r
-       printstring ", size: "\r
-       \r
-       ldd     temp ,z+5               ;Get partition size\r
-       ldd     temp2,z+6\r
-       ldd     temp3,z+7\r
-       ldd     temp4,z+8\r
-\r
-       lcall   print_ultoa\r
-       printstring "BYTE."\r
-       \r
-       rjmp    mgr_goto_next_part\r
-\r
-mgr_prnt_diskname:\r
-       push    temp\r
-       mov     temp,xh\r
-       lcall   uartputc\r
-       ldi     temp,':'\r
-       lcall   uartputc\r
-       pop     temp\r
-       ret\r
-\r
-mgr_prnt_table_cpm:\r
-       printstring "CP/M partition at: "\r
-       ret\r
-\r
-mgr_prnt_table_fat:\r
-       printstring "FAT16 File-Image at: "\r
-       ret\r
-\r
-mgr_prnt_table_ram:\r
-       printstring "Ramdisk at: "\r
-       ret\r
-\r
-mgr_prnt_table_err:\r
-       printstring "Unknown Entry at: "\r
-       ret\r
-\r
-mgr_prnt_image:\r
-       printstring "Assuming CP/M image at: "\r
-       ret\r
-\r
-\r
+;    Various Management functions for the Interaction with the File-
+;    systems
+;
+;    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$
+;
+
+
+;-------------------------- Defines for the disk management Structures
+
+;----------------------------------------------- Start of Data Segment
+
+       .dseg
+
+; ------------------------------- Start of Code Segment
+       .cseg
+
+; ====================================================================
+; Function: Scans a Disk for CP/M Partions
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; 
+; Registers  : [w] temp            Number of disk images (raw and fat16) found.
+;                          + 0x80 if sd card changes. (not used, doesn't work)
+; SREG :          Z        according to temp
+; --------------------------------------------------------------------
+; Description:
+; This Function scans an SD-Cards Boot-Sector for valid Partitions.
+; First all original CP/M Partitions will be usesed as Drives for
+; the CPM-System. Wenn all CP/M Partitions are found, a second
+; scann will be made. In the second Scan, the first FAT16 Partition
+; on the Disk will be used for a detailed analyses. If there
+; are any Files like "cpm_x.img" are found, these Files will be
+; used as Disks by the CP/M- System. ( x must be in the Range A to D )
+; ==================================================================== 
+mgr_init_partitions:
+
+       sts     ndisks,_0               ; Set Number of Disks to 0
+
+; Initialize partition table
+       ldiw    y,hostparttbl
+       ldi     temp2,PARTENTRY_SIZE*MAXDISKS
+mgr_picl:
+       st      y+,_0
+       dec     temp2
+       brne    mgr_picl
+
+; Start mmc Card interaction
+       lcall   mmcInit
+       andi    temp,MMCST_NOINIT & MMCST_NODISK
+       brne    mgr_pierr
+       
+;Load first sector from MMC (boot sector)
+       ldiw    y,0                     ; Sector 0
+       movw    x,y
+       lcall   mmcReadSect
+       tst     temp
+       breq    mgr_check_bootsektor
+
+mgr_pierr:
+       clr     temp
+       ret
+
+mgr_check_bootsektor:
+;Pointer to first table entry
+       ldiw    y,hostparttbl
+       ldi     temp3,0                 ;temp3 holds number of found disks (paritions)
+
+;Test, if it has a valid MBR
+
+       lds     temp,hostbuf+510        ;MBR signature (0xAA55)  at and of sector?
+       lds     temp2,hostbuf+510+1
+       ldi     temp4,0xAA
+       cpi     temp,0x55               
+       cpc     temp2,temp4
+       breq    mgr_search
+
+;No MBR, no partition table ...
+
+       inc     temp3                   ;pretend we have one.
+       sts     ndisks,temp3
+       ldi     temp,high((1<<16) * 128/512)
+       ldi     temp2,dskType_CPM
+       std     y+0,temp2
+       std     y+1,_0                  ;start at beginning of card
+       std     y+2,_0
+       std     y+3,_0
+       std     y+4,_0
+       std     y+5,_0                  ;max CP/M 2.2 disk size
+       std     y+6,temp                ;
+       std     y+7,_0
+       std     y+8,_0
+       rjmp    mgr_pend
+
+; Search for valid Partitions and ImageFiles 
+mgr_search:
+       ldiw    z,hostbuf+510-64        ;Point to  first byte of partition table
+       ldi     temp4,4                 ;Partition table has 4 entries.
+
+mgr_ploop:
+
+;      Get Partitiontype
+       ldd     temp,z+PART_TYPE
+
+;   Test for CP/M Partition
+       cpi     temp,PARTID_CPM
+       brne    mgr_nextp
+       
+       rcall    cpm_add_partition
+
+       inc     temp3
+       sts     ndisks,temp3
+       cpi     temp3,MAXDISKS
+       breq    mgr_pend
+       
+mgr_nextp:
+       adiw    zl,16
+       dec     temp4
+       brne    mgr_ploop
+
+#if FAT16_SUPPORT
+
+; Test for FAT16 Partition
+       ldiw    z,hostbuf+510-64        ;Point to  first byte of partition table
+       ldi     temp4,4
+
+mgr_ploop2:
+;      Get Partitiontype
+       ldd     temp,z+PART_TYPE
+
+;   Test for FAT Partition Type 1
+       cpi     temp,PARTID1_FAT16
+       breq    mgr_fatfound
+
+;   Test for FAT Partition Type 2
+       cpi     temp,PARTID2_FAT16
+       brne    mgr_nextp2
+
+mgr_fatfound:
+       rcall   fat_add_partition
+       rcall   fat_scan_partition
+       rcall   fat_reset_cache
+       rjmp    mgr_pend                ;Stop after first FAT16 partition found.
+
+mgr_nextp2:
+       adiw    zl,16
+       dec     temp4
+       brne    mgr_ploop2
+#endif
+
+mgr_pend:
+       lds     temp,ndisks             ;return # of "disks"
+       tst     temp
+       ret
+
+
+; ====================================================================
+; Function: Print partition table info
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers  :  none
+; Variables  :  [r] hostparttbl                Table with Partitioninformations
+;               [r] hostparttbltop     Pointer to the Top of the Table
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
+
+mgr_prnt_parttbl:
+       ldiw    z,hostparttbl
+       lds     yl,ndisks
+       ldi     xh,'A'
+
+pprl:
+       ldd     temp ,z+1               ;Get partition start
+       ldd     temp2,z+2
+       ldd     temp3,z+3
+       ldd     temp4,z+4
+
+       printnewline
+
+       cp      temp,_0                 ;If zero ...
+       cpc     temp2,_0
+       cpc     temp3,_0
+       cpc     temp4,_0
+       breq    mgr_prnop               ;... no partition table at 0
+
+; Partitiontype examining
+       ldd     xl,z+0
+; CP/M ?
+       cpi     xl,dskType_CPM
+       brne    mgr_prtb_nocpm
+       rcall   mgr_prnt_diskname
+       rcall   mgr_prnt_table_cpm
+       rjmp    mgr_prnt_size
+
+mgr_prtb_nocpm:
+#if FAT16_SUPPORT
+; FAT16 ?
+       cpi     xl,dskType_FAT
+       brne    mgr_prtb_nofat
+       rcall   mgr_prnt_diskname
+       rcall   mgr_prnt_table_fat
+       rjmp    mgr_prnt_size
+mgr_prtb_nofat:
+#endif
+#if 0                                  /* RAMDISK is not on SD card */
+; RAMDISK ?
+       cpi     xl,dskType_RAM
+       brne    mgr_prnt_err
+       rcall   mgr_prnt_diskname
+       rcall   mgr_prnt_table_ram
+       rjmp    mgr_prnt_size
+#endif
+mgr_prnt_err:  
+; Entry Error
+       rcall   mgr_prnt_table_err
+       rjmp    mgr_prnt_size
+
+mgr_prnop:
+       rcall   mgr_prnt_diskname
+       rcall   mgr_prnt_image
+
+mgr_prnt_size:
+       lcall   print_ultoa
+       printstring ", size: "
+
+       ldd     temp ,z+5               ;Get partition size
+       ldd     temp2,z+6
+       ldd     temp3,z+7
+       ldd     temp4,z+8
+
+       lsr     temp4
+       ror     temp3
+       ror     temp2
+       ror     temp
+       lcall   print_ultoa
+       printstring "KB."
+
+mgr_goto_next_part:    
+       adiw    z,PARTENTRY_SIZE
+       inc     xh
+       dec     yl
+       brne    pprl
+
+mgr_pppre:
+       ret
+       
+
+mgr_prnt_fatsize:
+       lcall   print_ultoa
+       printstring ", size: "
+       
+       ldd     temp ,z+5               ;Get partition size
+       ldd     temp2,z+6
+       ldd     temp3,z+7
+       ldd     temp4,z+8
+
+       lcall   print_ultoa
+       printstring "BYTE."
+       
+       rjmp    mgr_goto_next_part
+
+mgr_prnt_diskname:
+       push    temp
+       mov     temp,xh
+       lcall   uartputc
+       ldi     temp,':'
+       lcall   uartputc
+       pop     temp
+       ret
+
+mgr_prnt_table_cpm:
+       printstring "CP/M partition at: "
+       ret
+
+mgr_prnt_table_fat:
+       printstring "FAT16 File-Image at: "
+       ret
+
+mgr_prnt_table_ram:
+       printstring "Ramdisk at: "
+       ret
+
+mgr_prnt_table_err:
+       printstring "Unknown Entry at: "
+       ret
+
+mgr_prnt_image:
+       printstring "Assuming CP/M image at: "
+       ret
+
+