⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd_lib.lss

📁 FAT16文件系统源码,很详细,值得参考!
💻 LSS
📖 第 1 页 / 共 5 页
字号:
     5fe:	08 95       	ret
	
	//获取参数
	BPB_BytesPerSec = BPB->BPB_BytesPerSec;
     600:	80 91 bd 00 	lds	r24, 0x00BD
     604:	90 91 be 00 	lds	r25, 0x00BE
     608:	90 93 af 00 	sts	0x00AF, r25
     60c:	80 93 ae 00 	sts	0x00AE, r24
	BPB_SecPerClus = BPB->BPB_SecPerClus;
     610:	80 91 bf 00 	lds	r24, 0x00BF
     614:	80 93 a4 00 	sts	0x00A4, r24
	BPB_RsvdSecCnt = BPB->BPB_RsvdSecCnt;
     618:	80 91 c0 00 	lds	r24, 0x00C0
     61c:	90 91 c1 00 	lds	r25, 0x00C1
     620:	90 93 b3 02 	sts	0x02B3, r25
     624:	80 93 b2 02 	sts	0x02B2, r24
	BPB_NumFATs = BPB->BPB_NumFATs;
     628:	80 91 c2 00 	lds	r24, 0x00C2
     62c:	80 93 ab 00 	sts	0x00AB, r24
	BPB_RootEntCnt = BPB->BPB_RootEntCnt;
     630:	80 91 c3 00 	lds	r24, 0x00C3
     634:	90 91 c4 00 	lds	r25, 0x00C4
     638:	90 93 a6 00 	sts	0x00A6, r25
     63c:	80 93 a5 00 	sts	0x00A5, r24
	BPB_TotSec16 = BPB->BPB_TotSec16;
     640:	80 91 c5 00 	lds	r24, 0x00C5
     644:	90 91 c6 00 	lds	r25, 0x00C6
     648:	90 93 b1 00 	sts	0x00B1, r25
     64c:	80 93 b0 00 	sts	0x00B0, r24
	BPB_FATSz16 = BPB->BPB_FATSz16;
     650:	80 91 c8 00 	lds	r24, 0x00C8
     654:	90 91 c9 00 	lds	r25, 0x00C9
     658:	90 93 ad 00 	sts	0x00AD, r25
     65c:	80 93 ac 00 	sts	0x00AC, r24
	BPB_HiddSec = BPB->BPB_HiddSec;
     660:	80 91 ce 00 	lds	r24, 0x00CE
     664:	90 91 cf 00 	lds	r25, 0x00CF
     668:	a0 91 d0 00 	lds	r26, 0x00D0
     66c:	b0 91 d1 00 	lds	r27, 0x00D1
     670:	80 93 a7 00 	sts	0x00A7, r24
     674:	90 93 a8 00 	sts	0x00A8, r25
     678:	a0 93 a9 00 	sts	0x00A9, r26
     67c:	b0 93 aa 00 	sts	0x00AA, r27
	return SD_SUCC;
     680:	80 e0       	ldi	r24, 0x00	; 0
     682:	90 e0       	ldi	r25, 0x00	; 0
}
     684:	08 95       	ret

00000686 <DirStartSec>:
//-------------------------------------------------------------------------
uint32_t DirStartSec(void){							//获取根目录开始扇区号
	return BPB_RsvdSecCnt+BPB_NumFATs*BPB_FATSz16;
     686:	80 91 ab 00 	lds	r24, 0x00AB
     68a:	28 2f       	mov	r18, r24
     68c:	33 27       	eor	r19, r19
     68e:	80 91 ac 00 	lds	r24, 0x00AC
     692:	90 91 ad 00 	lds	r25, 0x00AD
     696:	28 9f       	mul	r18, r24
     698:	a0 01       	movw	r20, r0
     69a:	29 9f       	mul	r18, r25
     69c:	50 0d       	add	r21, r0
     69e:	38 9f       	mul	r19, r24
     6a0:	50 0d       	add	r21, r0
     6a2:	11 24       	eor	r1, r1
     6a4:	80 91 b2 02 	lds	r24, 0x02B2
     6a8:	90 91 b3 02 	lds	r25, 0x02B3
     6ac:	84 0f       	add	r24, r20
     6ae:	95 1f       	adc	r25, r21
     6b0:	aa 27       	eor	r26, r26
     6b2:	bb 27       	eor	r27, r27
}
     6b4:	bc 01       	movw	r22, r24
     6b6:	cd 01       	movw	r24, r26
     6b8:	08 95       	ret

000006ba <GetDirSecCount>:
//-------------------------------------------------------------------------
uint16_t GetDirSecCount(void){							//目录项占用的扇区数
	return BPB_RootEntCnt*32/BPB_BytesPerSec;
     6ba:	80 91 a5 00 	lds	r24, 0x00A5
     6be:	90 91 a6 00 	lds	r25, 0x00A6
     6c2:	20 91 ae 00 	lds	r18, 0x00AE
     6c6:	30 91 af 00 	lds	r19, 0x00AF
     6ca:	45 e0       	ldi	r20, 0x05	; 5
     6cc:	88 0f       	add	r24, r24
     6ce:	99 1f       	adc	r25, r25
     6d0:	4a 95       	dec	r20
     6d2:	e1 f7       	brne	.-8      	; 0x6cc <GetDirSecCount+0x12>
     6d4:	b9 01       	movw	r22, r18
     6d6:	0e 94 f4 07 	call	0xfe8 <__udivmodhi4>
     6da:	cb 01       	movw	r24, r22
     6dc:	08 95       	ret

000006de <DataStartSec>:
}
//-------------------------------------------------------------------------
uint32_t DataStartSec(void){							//获取数据区开始扇区号
     6de:	ef 92       	push	r14
     6e0:	ff 92       	push	r15
     6e2:	0f 93       	push	r16
     6e4:	1f 93       	push	r17
	return DirStartSec()+GetDirSecCount();
     6e6:	0e 94 43 03 	call	0x686 <DirStartSec>
     6ea:	7b 01       	movw	r14, r22
     6ec:	8c 01       	movw	r16, r24
     6ee:	0e 94 5d 03 	call	0x6ba <GetDirSecCount>
     6f2:	aa 27       	eor	r26, r26
     6f4:	bb 27       	eor	r27, r27
     6f6:	8e 0d       	add	r24, r14
     6f8:	9f 1d       	adc	r25, r15
     6fa:	a0 1f       	adc	r26, r16
     6fc:	b1 1f       	adc	r27, r17
}
     6fe:	bc 01       	movw	r22, r24
     700:	cd 01       	movw	r24, r26
     702:	1f 91       	pop	r17
     704:	0f 91       	pop	r16
     706:	ff 90       	pop	r15
     708:	ef 90       	pop	r14
     70a:	08 95       	ret

0000070c <ClusConvLBA>:
//-------------------------------------------------------------------------
uint32_t ClusConvLBA(uint16_t ClusID){					//获取一个簇的开始扇区
     70c:	0f 93       	push	r16
     70e:	1f 93       	push	r17
     710:	8c 01       	movw	r16, r24
	return DataStartSec()+BPB_SecPerClus*(ClusID-2);
     712:	0e 94 6f 03 	call	0x6de <DataStartSec>
     716:	9b 01       	movw	r18, r22
     718:	ac 01       	movw	r20, r24
     71a:	80 91 a4 00 	lds	r24, 0x00A4
     71e:	99 27       	eor	r25, r25
     720:	02 50       	subi	r16, 0x02	; 2
     722:	10 40       	sbci	r17, 0x00	; 0
     724:	80 9f       	mul	r24, r16
     726:	b0 01       	movw	r22, r0
     728:	81 9f       	mul	r24, r17
     72a:	70 0d       	add	r23, r0
     72c:	90 9f       	mul	r25, r16
     72e:	70 0d       	add	r23, r0
     730:	11 24       	eor	r1, r1
     732:	cb 01       	movw	r24, r22
     734:	aa 27       	eor	r26, r26
     736:	bb 27       	eor	r27, r27
     738:	82 0f       	add	r24, r18
     73a:	93 1f       	adc	r25, r19
     73c:	a4 1f       	adc	r26, r20
     73e:	b5 1f       	adc	r27, r21
}
     740:	bc 01       	movw	r22, r24
     742:	cd 01       	movw	r24, r26
     744:	1f 91       	pop	r17
     746:	0f 91       	pop	r16
     748:	08 95       	ret

0000074a <ReadFAT>:
//-------------------------------------------------------------------------
uint16_t ReadFAT(uint16_t Index){						//读取文件分配表的指定项
     74a:	0f 93       	push	r16
     74c:	1f 93       	push	r17
     74e:	8c 01       	movw	r16, r24
	uint16_t *RAM=(uint16_t*)BUFFER;
	uint32_t SecID;
	
	SecID=BPB_RsvdSecCnt+Index/256;
     750:	29 2f       	mov	r18, r25
     752:	33 27       	eor	r19, r19
     754:	80 91 b2 02 	lds	r24, 0x02B2
     758:	90 91 b3 02 	lds	r25, 0x02B3
     75c:	82 0f       	add	r24, r18
     75e:	93 1f       	adc	r25, r19
     760:	aa 27       	eor	r26, r26
     762:	bb 27       	eor	r27, r27
	ReadFatBlock(SecID);
     764:	bc 01       	movw	r22, r24
     766:	cd 01       	movw	r24, r26
     768:	0e 94 9c 02 	call	0x538 <ReadFatBlock>
	return RAM[Index%256];
     76c:	10 70       	andi	r17, 0x00	; 0
     76e:	00 0f       	add	r16, r16
     770:	11 1f       	adc	r17, r17
     772:	0e 54       	subi	r16, 0x4E	; 78
     774:	1f 4f       	sbci	r17, 0xFF	; 255
}
     776:	f8 01       	movw	r30, r16
     778:	80 81       	ld	r24, Z
     77a:	91 81       	ldd	r25, Z+1	; 0x01
     77c:	1f 91       	pop	r17
     77e:	0f 91       	pop	r16
     780:	08 95       	ret

00000782 <WriteFAT>:
//-------------------------------------------------------------------------
void WriteFAT(uint16_t Index,uint16_t Value){			//写文件分配表的指定项
     782:	af 92       	push	r10
     784:	bf 92       	push	r11
     786:	cf 92       	push	r12
     788:	df 92       	push	r13
     78a:	ef 92       	push	r14
     78c:	ff 92       	push	r15
     78e:	0f 93       	push	r16
     790:	1f 93       	push	r17
     792:	8c 01       	movw	r16, r24
     794:	5b 01       	movw	r10, r22
	uint16_t *RAM=(uint16_t*)BUFFER;
	uint32_t SecID;
	
	SecID=BPB_RsvdSecCnt+Index/256;
     796:	29 2f       	mov	r18, r25
     798:	33 27       	eor	r19, r19
     79a:	80 91 b2 02 	lds	r24, 0x02B2
     79e:	90 91 b3 02 	lds	r25, 0x02B3
     7a2:	82 0f       	add	r24, r18
     7a4:	93 1f       	adc	r25, r19
     7a6:	6c 01       	movw	r12, r24
     7a8:	ee 24       	eor	r14, r14
     7aa:	ff 24       	eor	r15, r15
	ReadFatBlock(SecID);
     7ac:	c7 01       	movw	r24, r14
     7ae:	b6 01       	movw	r22, r12
     7b0:	0e 94 9c 02 	call	0x538 <ReadFatBlock>
	RAM[Index%256]=Value;
     7b4:	10 70       	andi	r17, 0x00	; 0
     7b6:	00 0f       	add	r16, r16
     7b8:	11 1f       	adc	r17, r17
     7ba:	0e 54       	subi	r16, 0x4E	; 78
     7bc:	1f 4f       	sbci	r17, 0xFF	; 255
     7be:	f8 01       	movw	r30, r16
     7c0:	b1 82       	std	Z+1, r11	; 0x01
     7c2:	a0 82       	st	Z, r10
	WriteFatBlock(SecID);
     7c4:	c7 01       	movw	r24, r14
     7c6:	b6 01       	movw	r22, r12
     7c8:	0e 94 aa 02 	call	0x554 <WriteFatBlock>
     7cc:	1f 91       	pop	r17
     7ce:	0f 91       	pop	r16
     7d0:	ff 90       	pop	r15
     7d2:	ef 90       	pop	r14
     7d4:	df 90       	pop	r13
     7d6:	cf 90       	pop	r12
     7d8:	bf 90       	pop	r11
     7da:	af 90       	pop	r10
     7dc:	08 95       	ret

000007de <GetEmptyDIR>:
}
//-------------------------------------------------------------------------
uint16_t GetEmptyDIR(void){							//获取根目录中可以使用的一项
     7de:	cf 92       	push	r12
     7e0:	df 92       	push	r13
     7e2:	ef 92       	push	r14
     7e4:	ff 92       	push	r15
     7e6:	0f 93       	push	r16
     7e8:	1f 93       	push	r17
     7ea:	cf 93       	push	r28
     7ec:	df 93       	push	r29
	uint16_t i,DirSecCut,DirStart,m,ID=0;
     7ee:	00 e0       	ldi	r16, 0x00	; 0
     7f0:	10 e0       	ldi	r17, 0x00	; 0
	
	DirSecCut=GetDirSecCount();
     7f2:	0e 94 5d 03 	call	0x6ba <GetDirSecCount>
     7f6:	6c 01       	movw	r12, r24
	DirStart=DirStartSec();
     7f8:	0e 94 43 03 	call	0x686 <DirStartSec>
	for(i=0;i<DirSecCut;i++){
     7fc:	78 01       	movw	r14, r16
     7fe:	0c 15       	cp	r16, r12
     800:	1d 05       	cpc	r17, r13
     802:	f0 f4       	brcc	.+60     	; 0x840 <GetEmptyDIR+0x62>
     804:	eb 01       	movw	r28, r22
		ReadFatBlock(DirStart+i);
     806:	ce 01       	movw	r24, r28
     808:	aa 27       	eor	r26, r26
     80a:	bb 27       	eor	r27, r27
     80c:	bc 01       	movw	r22, r24
     80e:	cd 01       	movw	r24, r26
     810:	0e 94 9c 02 	call	0x538 <ReadFatBlock>
     814:	e2 eb       	ldi	r30, 0xB2	; 178
     816:	f0 e0       	ldi	r31, 0x00	; 0
		for(m=0;m<16;m++){
			if(BUFFER[m*32]==0)return ID;
     818:	80 81       	ld	r24, Z
     81a:	b0 96       	adiw	r30, 0x20	; 32
     81c:	88 23       	and	r24, r24
     81e:	81 f0       	breq	.+32     	; 0x840 <GetEmptyDIR+0x62>
			if(BUFFER[m*32]==0xe5)return ID;
     820:	85 3e       	cpi	r24, 0xE5	; 229
     822:	71 f0       	breq	.+28     	; 0x840 <GetEmptyDIR+0x62>
			ID++;
     824:	0f 5f       	subi	r16, 0xFF	; 255
     826:	1f 4f       	sbci	r17, 0xFF	; 255
     828:	82 e0       	ldi	r24, 0x02	; 2
     82a:	e2 39       	cpi	r30, 0x92	; 146
     82c:	f8 07       	cpc	r31, r24
     82e:	a1 f3       	breq	.-24     	; 0x818 <GetEmptyDIR+0x3a>
     830:	98 f3       	brcs	.-26     	; 0x818 <GetEmptyDIR+0x3a>
     832:	08 94       	sec
     834:	e1 1c       	adc	r14, r1
     836:	f1 1c       	adc	r15, r1
     838:	21 96       	adiw	r28, 0x01	; 1
     83a:	ec 14       	cp	r14, r12
     83c:	fd 04       	cpc	r15, r13
     83e:	18 f3       	brcs	.-58     	; 0x806 <GetEmptyDIR+0x28>
		}
	}
	return ID;
}
     840:	c8 01       	movw	r24, r16
     842:	df 91       	pop	r29
     844:	cf 91       	pop	r28
     846:	1f 91       	pop	r17
     848:	0f 91       	pop	r16
     84a:	ff 90       	pop	r15
     84c:	ef 90       	pop	r14
     84e:	df 90       	pop	r13
     850:	cf 90       	pop	r12
     852:	08 95       	ret

00000854 <GetFileID>:
//-------------------------------------------------------------------------
//获得和文件名对应的目录
uint8_t GetFileID(uint8_t Name[11],DIR *ID,uint16_t *pIndex){
     854:	6f 92       	push	r6
     856:	7f 92       	push	r7
     858:	8f 92       	push	r8
     85a:	9f 92       	push	r9
     85c:	af 92       	push	r10
     85e:	bf 92       	push	r11
     860:	cf 92       	push	r12
     862:	df 92       	push	r13
     864:	ef 92       	push	r14
     866:	ff 92       	push	r15
     868:	0f 93       	push	r16
     86a:	1f 93       	push	r17
     86c:	cf 93       	push	r28
     86e:	df 93       	push	r29
     870:	4c 01       	movw	r8, r24
     872:	3b 01       	movw	r6, r22
     874:	7a 01       	movw	r14, r20
	uint16_t  i,DirSecCut,DirStart,m;
	
	DirSecCut = GetDirSecCount();
     876:	0e 94 5d 03 	call	0x6ba <GetDirSecCount>
     87a:	5c 01       	movw	r10, r24
	DirStart = DirStartSec();
     87c:	0e 94 43 03 	call	0x686 <DirStartSec>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -