-; 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
-\r
-\r
-; ------------------------------- Start of Code Segment\r
- .cseg\r
-\r
-; ====================================================================\r
-; Function: Scans a Disk for CP/M Partions\r
-; ====================================================================\r
-; Parameters\r
-; --------------------------------------------------------------------\r
-; Registers : none\r
-; Variables : [w] temp Status of Operation\r
-; (0x80 - Operation Failure )\r
-; (others - Operation Suceded)\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 temp partition table\r
- ldiw y,tmp_tbl\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
- rcall 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 temp table entry\r
- ldiw y,tmp_tbl\r
-;Test, if it has a valid MBR\r
-\r
- ldiw z,hostbuf+510-1 ;Point to last byte of partition table\r
-\r
- ldi temp3,0 ;temp3 holds number of found disks (paritions)\r
- ldd temp,z+1 ;MBR signature (0xAA55) at and of sector?\r
- ldd temp2,z+2\r
- ldi temp4,0xAA\r
- cpi temp,0x55 \r
- cpc temp2,temp4\r
- breq mgr_search\r
-\r
-;No MBR, no partition table ...\r
- inc temp3 ;pretend we have one.\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
- sbiw z,63 ;Now at first byte of partition table\r
- ldi temp4,high(hostbuf+510)\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
- cpi temp3,MAXDISKS\r
- breq mgr_pend\r
- \r
-mgr_nextp:\r
- adiw zl,16\r
- cpi zl,low(hostbuf+510)\r
- cpc zh,temp4\r
- brlo mgr_ploop\r
-\r
-#if FAT16_SUPPORT\r
-\r
-; Test for FAT16 Partition\r
- ldiw z,hostbuf+510-1-63 ;Point to first byte of partition table\r
- ldi temp4,high(hostbuf+510)\r
-\r
-mgr_ploop2:\r
-\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
- rjmp mgr_pend\r
- \r
-mgr_nextp2:\r
- adiw zl,16\r
- cpi zl,low(hostbuf+510)\r
- cpc zh,temp4\r
- brlo mgr_ploop2\r
-#endif\r
-\r
-mgr_pend:\r
-\r
-; Initialize RAM-Disks\r
- rcall rdsk_add_partition\r
-\r
-;Store new partitions and check if the SD card has been changed.\r
-\r
- ldiw y,tmp_tbl\r
- ldiw z,hostparttbl\r
- ldi temp4,PARTENTRY_SIZE*MAXDISKS\r
- clt\r
-\r
-mgr_pcpl:\r
- ld temp,y+\r
- ld temp2,z\r
- st z+,temp\r
- cpse temp,temp2\r
- set\r
- dec temp4\r
- brne mgr_pcpl\r
-\r
- mov temp,temp3\r
- sts ndisks,temp\r
- brtc mgr_pcpe\r
-\r
- tst temp\r
- breq mgr_pcpe\r
-\r
-; SD card not changed.\r
-\r
-#if FAT16_SUPPORT\r
- rcall fat_scan_partition\r
-#endif\r
- lds temp,ndisks\r
- sbr temp,0x80\r
-\r
-mgr_pcpe:\r
-\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
-pprl:\r
-; Partitiontype examining\r
-\r
- ldd xl,z+0\r
-; Empty slot?\r
- cpi xl,dskType_None\r
- breq mgr_goto_next_part\r
-\r
- printnewline\r
-\r
-; CP/M ?\r
- cpi xl,dskType_CPM\r
- brne mgr_prtb_nocpm\r
- rcall mgr_prnt_table_cpm\r
- rjmp mgr_prnt_size\r
-\r
-; FAT16 ?\r
-mgr_prtb_nocpm:\r
- cpi xl,dskType_FAT\r
- brne mgr_prtb_nofat\r
- rcall mgr_prnt_table_fat\r
- rjmp mgr_prnt_size\r
-; RAMDISK ?\r
-mgr_prtb_nofat:\r
- cpi xl,dskType_RAM\r
- brne mgr_prnt_err\r
- rcall mgr_prnt_table_ram\r
- rjmp mgr_prnt_size\r
-; Entry Error\r
-mgr_prnt_err: \r
- rcall mgr_prnt_table_err\r
- rjmp mgr_prnt_size\r
-\r
-mgr_prnop:\r
- rcall mgr_prnt_image\r
-\r
-mgr_prnt_size:\r
- ldd temp ,z+1 ;Get partition start\r
- ldd temp2,z+2\r
- ldd temp3,z+3\r
- ldd temp4,z+4\r
- lcall print_ultoa\r
- printstring ", size: "\r
-\r
- ldd temp ,z+5 ;Get partition size\r
- ldd temp2,z+6 ;Get partition size\r
- ldd temp3,z+7 ;Get partition size\r
- ldd temp4,z+8 ;Get partition size\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
- ldi temp,high(hostparttbltop)\r
- cpi zl, low (hostparttbltop)\r
- cpc zh,temp\r
- brlo 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 ;Get partition size\r
- ldd temp3,z+7 ;Get partition size\r
- ldd temp4,z+8 ;Get partition size\r
-\r
- lcall print_ultoa\r
- printstring "BYTE."\r
- \r
- rjmp mgr_goto_next_part\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
+
+