; Defines for FAT16 Structures
; ############################################################################
-#define PARTID_FAT16 0x0E
+#define PARTID1_FAT16 0x0E
+#define PARTID2_FAT16 0x06
/*These are the Offsets to the Variables within the Bootsector of a FAT16
Partition.
#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_LAST_IMAGENAME 'A'+MAXDISKS-1 ; Last letter of filename to
+ ; search
; ############################################################################
; Start of Data Segment
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
+/* This Variable is only needed within the scanning of the directory
+for tempoary variable storage.. todo: optimize away :-) */
+fat_temp: .byte 3 ; for tempoary use
; ############################################################################
; Start of Code Segment
fat_add_partition:
.if FAT16_DEBUG > 0
- printstring "fat16 part found",0
+ printstring "fat16 part found"
printnewline
.endif
fat_scan_partition:
.if FAT16_DEBUG > 0
- printstring "fat16 scanning",0
+ printstring "fat16 scanning"
printnewline
.endif
.if FAT16_DEBUG > 0
- printstring "free entrys in ptable ?",0
+ printstring "free entrys in ptable ?"
printnewline
.endif
breq fat_scan_error
.if FAT16_DEBUG > 0
- printstring "read fat bootblock.",0
+ printstring "read fat bootblock."
printnewline
.endif
fat_bootblock_check:
.if FAT16_DEBUG > 0
- printstring "fat16 bootblock check",0
+ printstring "fat16 bootblock check"
printnewline
.endif
sts fat_clustersize,temp
.if FAT16_DEBUG > 0
- printstring "Sectors per Cluster ",0
+ printstring "Sectors per Cluster "
rcall printhex
printnewline
.endif
sts fat_last_dsk,temp ; low byte
.if FAT16_DEBUG > 0
- printstring "Ammount of FAT copies: ",0
+ printstring "Ammount of FAT copies: "
rcall printhex
printnewline
.endif
sts fat_numdirentrys+1,temp2 ; high byte
.if FAT16_DEBUG > 0
- printstring "Max. entrys in Rootdir.: ",0
+ printstring "Max. entrys in Rootdir.: "
rcall printhexw
printnewline
.endif
ldd yl,z+2
ldd yh,z+3
- printstring "Begin of Volume at: ",0
+ printstring "Begin of Volume at: "
mov temp ,yl
mov temp2,yh
rcall printhexw
sts fat_log_clust+1,temp2 ; high byte
.if FAT16_DEBUG > 0
- printstring "Sectors per FAT__: ",0
+ printstring "Sectors per FAT__: "
rcall printhexw
printnewline
.endif
sts fat_ptr2fat+3,yh
.if FAT16_DEBUG > 1
- printstring "Begin of FAT at___: ",0
+ printstring "Begin of FAT at___: "
mov temp ,yl
mov temp2,yh
rcall printhexw
.if FAT16_DEBUG > 1
- printstring "Begin of DIR at___: ",0
+ printstring "Begin of DIR at___: "
mov temp ,yl
mov temp2,yh
rcall printhexw
sts fat_ptr2dat+3,yh
.if FAT16_DEBUG > 1
- printstring "Begin of Data at__: ",0
+ printstring "Begin of Data at__: "
mov temp ,yl
mov temp2,yh
rcall printhexw
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
+ sts fat_temp ,zl
+ sts fat_temp+1,zh
+ sts fat_temp+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
+ lds zl ,fat_temp
+ lds zh ,fat_temp+1
+ lds temp2,fat_temp+2
fat_look_not_ok:
adiw z,32
; Found a valid image
.if FAT16_DEBUG > 1
- printstring "Found a valid Image ! Z=",0
+ printstring "Found a valid Image ! Z="
mov temp ,zl
mov temp2,zh
rcall printhexw
rcall fat_gethostsec
- printstring "Begin of Image at: ",0
+ printstring "Begin of Image at: "
mov temp ,yl
mov temp2,yh
rcall printhexw
ldd yh,z+2
.if FAT16_DBG_FAT > 0
- printstring "Search log. Cluster ",0
+ printstring "Search log. Cluster "
mov temp,xl
mov temp2,xh
lcall printhexw
printnewline
- printstring "Search phys. Cluster ",0
+ printstring "Search phys. Cluster "
mov temp ,yl
mov temp2,yh
lcall printhexw
fat_found_phsy_clust:
.if FAT16_DBG_FAT > 0
- printstring "Found phys. Cluster at:",0
+ printstring "Found phys. Cluster at:"
mov temp,yl
mov temp2,yh
lcall printhexw
; Found the physical sector
.if FAT16_DBG_FAT > 0
- printstring "Found phys. Sector at:",0
+ printstring "Found phys. Sector at:"
mov temp,yl
mov temp2,yh
lcall printhexw
; Found the physical sector
.if FAT16_DBG_FAT > 0
- printstring "Sector with Offset at:",0
+ printstring "Sector with Offset at:"
mov temp,yl
mov temp2,yh
lcall printhexw
;*****************************************************
;* CP/M to host disk constants *
;*****************************************************
- .equ MAXDISKS = 6 ;Max number of Disks (partitions)
+ .equ MAXDISKS = 8 ;Max number of Disks (partitions)
.equ PARTENTRY_SIZE = 9 ;Size of a Partitiontableentry
.equ blksize = 1024 ;CP/M allocation size
.equ hostsize = 512 ;host disk sector size
; Test DPBs (avrcpm format)
dpblist:
+;dpb243
+ .db 0x1A,0x00 ;spt
+ .db 0x03,0x07 ;block shift, bock mask
+ .db 0x00,0xF2 ;extent mask, low(disk size -1),
+ .db 0x00,0x3F ;high(disk size -1), low(dir max)
+ .db 0x00,0xC0 ;high(dir max), alloc0
+ .db 0x00,0x10 ;alloc1, low(chk size)
+ .db 0x00,0x02 ;high(chk size), low(offset)
+ .db 0x00,0x00 ;high(offset), fill
+;dpb243
+ .db 0x1A,0x00 ;spt
+ .db 0x03,0x07 ;block shift, bock mask
+ .db 0x00,0xF2 ;extent mask, low(disk size -1),
+ .db 0x00,0x3F ;high(disk size -1), low(dir max)
+ .db 0x00,0xC0 ;high(dir max), alloc0
+ .db 0x00,0x10 ;alloc1, low(chk size)
+ .db 0x00,0x02 ;high(chk size), low(offset)
+ .db 0x00,0x00 ;high(offset), fill
+;dpb243
+ .db 0x1A,0x00 ;spt
+ .db 0x03,0x07 ;block shift, bock mask
+ .db 0x00,0xF2 ;extent mask, low(disk size -1),
+ .db 0x00,0x3F ;high(disk size -1), low(dir max)
+ .db 0x00,0xC0 ;high(dir max), alloc0
+ .db 0x00,0x10 ;alloc1, low(chk size)
+ .db 0x00,0x02 ;high(chk size), low(offset)
+ .db 0x00,0x00 ;high(offset), fill
+;dpb243
+ .db 0x1A,0x00 ;spt
+ .db 0x03,0x07 ;block shift, bock mask
+ .db 0x00,0xF2 ;extent mask, low(disk size -1),
+ .db 0x00,0x3F ;high(disk size -1), low(dir max)
+ .db 0x00,0xC0 ;high(dir max), alloc0
+ .db 0x00,0x10 ;alloc1, low(chk size)
+ .db 0x00,0x02 ;high(chk size), low(offset)
+ .db 0x00,0x00 ;high(offset), fill
;dpb243
.db 0x1A,0x00 ;spt
.db 0x03,0x07 ;block shift, bock mask
pop zh
ret
-; clear drive table
-; for now, only entries 1 - 3 are cleared.
-
; ====================================================================
; Function: Clear drive table
; ====================================================================
; Description:
; ====================================================================
-; For now, only entries 1 - 3 are cleared.
+; For now, only entries 1 - 7 are cleared.
dsk_drvtblinit:
ldsw x,biosdrvtbl
adiw x,2
- ldi temp3,3
+ ldi temp3,7
dsk_drvi_l:
ldi temp,0
ldi temp2,0
cpi temp,dskType_None
brne PC+2
rjmp dsk_read_err
-
; It must be a FAT16-Imagefile or CP/M Partition.
sts unacnt,_0
sbi flags,rsflag ;must read data
-; 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
+
+
; along with avrcpm. If not, see <http://www.gnu.org/licenses/>.
;
; $Id$
-;\r
-\r
-#ifndef RAMDSK_SUPPORT\r
- #define RAMDSK_SUPPORT 0 \r
-#endif\r
-\r
-#if RAMDSK_SUPPORT\r
-\r
+;
+
+#ifndef RAMDSK_SUPPORT
+ #define RAMDSK_SUPPORT 0
+#endif
+
+#if RAMDSK_SUPPORT
+
;-------------------------------------- Defines for RAMDISK Structures
-\r
+
;----------------------------------------------- Start of Data Segment
- .dseg\r
-\r
-rdskbuf: .byte 128 ; Buffer for RAM-Disk interaktions\r
-\r
+ .dseg
+
+rdskbuf: .byte 128 ; Buffer for RAM-Disk interaktions
+
; ---------------------------------------------- Start of Code Segment
- .cseg\r
+ .cseg
-; ====================================================================\r
+; ====================================================================
; Function: Calculate an sets the adress of Sector within the RAMDISK
-; ====================================================================\r
-; Parameters\r
-; --------------------------------------------------------------------\r
-; Registers : none\r
-; Variables : [r] seeksec Sector to read\r
-; [r] seektrk Track to read\r
-; [w] temp3 Number of Bytes per Sector (128) \r
-; --------------------------------------------------------------------\r
-; Description:\r
-; ====================================================================\r
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers : none
+; Variables : [r] seeksec Sector to read
+; [r] seektrk Track to read
+; [w] temp3 Number of Bytes per Sector (128)
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
rdsk_adr:
.endif
ret
-; ====================================================================\r
+; ====================================================================
; Function: Does a read opperation on a RAMDISK
-; ====================================================================\r
-; Parameters\r
-; --------------------------------------------------------------------\r
-; Registers : none\r
-; Variables : [r] seeksec Sector to read\r
-; [r] seektrk Track to read\r
-; [r] flags RW operation Flags\r
-; [w] erflag Error Status of the operation\r
-; --------------------------------------------------------------------\r
-; Description:\r
-; ====================================================================\r
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers : none
+; Variables : [r] seeksec Sector to read
+; [r] seektrk Track to read
+; [r] flags RW operation Flags
+; [w] erflag Error Status of the operation
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
rdsk_read:
-\r
+
.if DISK_DEBUG > 1
printnewline
printstring "rd-adr: "
.endif
rcall rdsk_adr
-\r
+
rdsk_rdl:
DRAM_SETADDR xl, ~(1<<ram_ras),0, ~((1<<ram_oe)), (1<<ram_a8)
cbi P_CAS,ram_cas
brne rdsk_rdstl
ret
-; ====================================================================\r
+; ====================================================================
; Function: Does a write opperation on a RAMDISK
-; ====================================================================\r
-; Parameters\r
-; --------------------------------------------------------------------\r
-; Registers : none\r
-; Variables : [r] seeksec Sector to read\r
-; [r] seektrk Track to read\r
-; [r] flags RW operation Flags\r
-; [w] erflag Error Status of the operation\r
-; --------------------------------------------------------------------\r
-; Description:\r
-; ====================================================================\r
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers : none
+; Variables : [r] seeksec Sector to read
+; [r] seektrk Track to read
+; [r] flags RW operation Flags
+; [w] erflag Error Status of the operation
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
rdsk_write:
.if DISK_DEBUG > 1
ldi temp,~RAM_DQ_MASK | (1<<ram_w) | (1<<ram_cas)
out DDRC,temp
out PORTC,temp
- ret\r
-\r
-\r
-rdsk_add_partition:\r
- ret\r
-\r
-
-#else\r
-\r
-rdsk_read:\r
- ret\r
-rdsk_write:\r
- ret\r
-rdsk_add_partition:\r
- ret\r
-\r
-#endif\r
+ ret
+
+
+rdsk_add_partition:
+ ret
+
+
+#else
+
+rdsk_read:
+ ret
+rdsk_write:
+ ret
+rdsk_add_partition:
+ ret
+
+#endif
; Read first sector of first CP/M partition (ipl)
- lds xl,hostparttbl+1
- lds xh,hostparttbl+2
- lds yl,hostparttbl+3
- lds yh,hostparttbl+4
- rcall mmcReadSect
+; lds xl,hostparttbl+1
+; lds xh,hostparttbl+2
+; lds yl,hostparttbl+3
+; lds yh,hostparttbl+4
+; rcall mmcReadSect
+
+; Disk 0
+ sts seekdsk,_0
+; Track 0
+ sts seektrk,_0
+ sts seektrk+1,_0
+; Sector 0
+ sts seeksec,_0
+
+ rcall dsk_read
; rcall dsk_cboot ;init (de)blocking buffer
.endif
ret
-\r
+
;--------------------------------------------------------------
-; Read word \r
-; TODO: Read Word to ZL,ZH at given ZL/ZH Offset\r
-; Need for reading of single FAT16 Entrys without killing the\r
-; Entrys in hostbuffer...\r
+; Read word
+; TODO: Read Word to ZL,ZH at given ZL/ZH Offset
+; Need for reading of single FAT16 Entrys without killing the
+; Entrys in hostbuffer...
;
; in zh,zl: Pointer to Word within the Sector to read
; in yh..xl: Start sector number (LBA)
-; out zh,zl : word thats been read\r
+; out zh,zl : word thats been read
mmcReadWord:
.if MMC_DEBUG > 1
lds temp,mmcCardType
sbrs temp,log2(CT_BLOCK)
rcall mul_yx_512 ;Convert to byte address (*512)
-\r
+
ldi temp2,CMD17
rcall mmcCmd
ldi temp2,RES_ERROR
mmc_rcvw_rl:
sbiw yl,1
breq mmc_rcvw_rle
- cp zl,_0\r
- cpc zh,_0\r
- breq mmc_rcvw_sto\r
-\r
- sbiw zl,1\r
+ cp zl,_0
+ cpc zh,_0
+ breq mmc_rcvw_sto
+
+ sbiw zl,1
spi_waitm
in temp,SPDR
out SPDR,_255
rjmp mmc_rcvw_rl
-mmc_rcvw_sto:\r
- mov zl,temp\r
+mmc_rcvw_sto:
+ mov zl,temp
spi_waitm
in temp,SPDR
out SPDR,_255
- mov zh,temp\r
-\r
+ mov zh,temp
+
mmc_rcvw_rl2:
sbiw yl,1
breq mmc_rcvw_rle
spi_waitm
in temp,SPDR
out SPDR,_255
- rjmp mmc_rcvw_rl2\r
+ rjmp mmc_rcvw_rl2
mmc_rcvw_rle:
rcall spi_wait ; while SPI module shifts in crc part1.
rcall spi_rcvr ;Read second crc.
rcall printhex
printstring " "
.endif
- ret\r
+ ret
;--------------------------------------------------------------
; Write sector
ld e,0\r
ld c,'I'-'A'\r
call seldsk\r
- jp z,boot1\r
+ jp z,boot1 ;no ram disk\r
\r
call getdpb ;de = dpb of first ram disk\r
\r
ld a,e ;reselection bit\r
rrca\r
jp c,getdph ;skip, if disk already active\r
- in a,(15) ;querry, if disk exists\r
ld hl,0\r
+ in a,(15) ;querry, if disk exists\r
or a\r
- jp z,getdph\r
- xor a\r
- ret\r
+ ret z\r
getdph:\r
ld hl,drvtbl\r
ld b,0\r