logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

FAT32, Asembler: Nowy folder

michalmily 28 Paź 2009 07:48 1325 8
REKLAMA
  • #1 7184194
    michalmily
    Poziom 13  
    Witam serdecznie, od dłuższego czas zajmuję się obsługą karty SD z systemem plików FAT, do odczytu plików korzystam z poniższej biblioteki:
    Link
    Działa ona bez zarzutu, jednak pozwala jedynie na odczyt danych. Zdecydowałem więc, że sam napiszę procedury do zapisu. Do tej pory udało mi się stworzyć procedurę do tworzenia nowego folderu i tu pojawia się problem. Załóżmy, że na karcie w katalogu głównym istnieje dowolny folder o nazwie np. "FOLDER" (utworzony na PC), otwieram go i chcę utworzyć nowy wewnątrz tego, wywołuję zatem swoją procedurę. Jej działanie polega na znalezieniu wolnego klastra w FAT, wolnego wpisu w wybranym katalogu i dokonaniu odpowiednich wpisów. W WinHexie wszystko wygląda poprawnie, wpisy dokonywane są w odpowiednich miejscach i przypuszczam, że odpowiedniej treści. Nawet w WinHex struktura jest poprawnie odtwarzana. Problem w tym, że explorer nie widzi nowo utworzonego folderu, a w momencie chęci dodania nowego, nadpisuje "niewidoczny" katalog. Dodam jeszcze, że w telefonie komórkowym struktura katalogów jest odczytywana poprawnie. Nie wiem gdzie popełniłem błąd, może o czymś zapomniałem.... Dzięki za ewentualna pomoc i pozdrawiam....
  • REKLAMA
  • #2 7184567
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7184880
    michalmily
    Poziom 13  
    Oczywiście, przepraszam i wklejam poniżej:

    
    ;SzukajWolnegoKlastra:
    ; czytamy sektory tablicy alokacji plików w poszukiwaniu wolnego klastra danych
    	ldi r22, 0		; Adres wolnej JAP
    	ldi r23, 0		
    	ldi r24, 0
    	ldi r25, 0
    
    	ldi r21, 1		; do zwiększania numeru JAP
    
    
    	Lds R16,BeginOfAlocationTable_Half
    	Lds R17,BeginOfAlocationTable_Half+1
    	Ldi R18,0
    	Ldi R19,0
    	mov r8, r16
    	mov r9, r17
    
    
    	nastepny_sektor:
    	Ldi Xl,Low(BytesBufferLocationInRam)
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdReadSector
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Zl,Low(MMC_SECTOR_SIZE)
    	Ldi Zh,High(MMC_SECTOR_SIZE)
    
    	clc				; podzielenie rozmiaru przez 4 - 4 bajty na adres JAP
    	Lsr zh
    	ror zl
    	Lsr zh
    	ror zl
    	Lsr zh
    	ror zl
    	Lsr zh
    	ror zl
    
    
    	ldi r20, 0
    
    	dalej33:
    	ld r16, X+
    	ld r17, X+
    	ld r18, X+
    	ld r19, X+
    	
    	cp r16, r20
    	cpc r17, r20
    	cpc r18, r20
    	cpc r19, r20
    	breq koniec33
    		add r22, r21			; zwiększ numer JAP	
    		adc r23, r20
    		adc r24, r20
    		adc r25, r20
    		sbiw Z, 1
    		brne dalej22
    			mov r16, r8
    			mov r17, r9
    			add r16, r21		
    			adc r17, r20
    			mov r8, r16
    			mov r9, r17
    			clr r18
    			clr r19
    			rjmp nastepny_sektor
    		dalej22:
    		rjmp dalej33
    	koniec33:
    
    	sts NumerJAP, r22
    	sts NumerJAP+1, r23
    	sts NumerJAP+2, r24
    	sts NumerJAP+3, r25
    ; zawiera numer wolnego klastra
    
    ; SzukajWolnegoWpisu:
    ; czytamy sektory otwartego katalogu w poszukiwaniu wolnego wpisu
    	ldi r22, 0		; Adres 
    	ldi r23, 0		
    	ldi r24, 0
    	ldi r25, 0
    
    	lds r21, SectorsPerCluster_Byte			; oblicz numer sektora do odczytu- początek danych + numer klastra obecnego folderu * liczba sektorów w klastrze
    
    	Lds R16,ObecnyKatalog
    	Lds R17,ObecnyKatalog+1
    	Lds R18,ObecnyKatalog+2
    	Lds R19,ObecnyKatalog+3
    
    	ldi r20, 2								; odejmij 2, sekcja danych zaczyna się od 2 klastra
    	sub r16, r20
    	sbc r17, r22
    	sbc r18, r22
    	sbc r19, r22
    
    	clr r8
    	clr r9
    	clr r10
    	clr r11
    
    	dodajdalej:
    		add r8, r16
    		adc r9, r17
    		adc r10, r18
    		adc r11, r19
    		subi r21, 1
    	brne dodajdalej
    
    
    	ldi r21, 1		; do zwiększania adresu
    
    
    	Lds R16,BeginOfDataSection_Word
    	Lds R17,BeginOfDataSection_Word+1
    	Lds R18,BeginOfDataSection_Word+2
    	Lds R19,BeginOfDataSection_Word+3
    
    
    	add r8, r16
    	adc r9, r17
    	adc r10, r18
    	adc r11, r19
    
    	mov r16, r8
    	mov r17, r9
    	mov r18, r10
    	mov r19, r11
    
    
    	nastepny_sektor1:							; szukaj
    	Ldi Xl,Low(BytesBufferLocationInRam)
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdReadSector
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Zl,Low(MMC_SECTOR_SIZE/32)				; podzielenie rozmiaru 32 - 32bajty to opis dla każdego katalogu, skok co 32 bajty
    	Ldi Zh,High(MMC_SECTOR_SIZE/32)
    
    	ldi r20, 0
    
    	dalej331:
    
    	ldi r16, 32
    	mov r4, r16
    
    	ld r16, X
    	
    	add xl, r4
    	adc xh, r20
    
    	
    	cpi r16, 0
    	breq koniec331
    		cpi r16, 0xE5
    		breq koniec331
    			add r22, r21			; zwiększ numer o 32
    			adc r23, r20
    			adc r24, r20
    			adc r25, r20
    			sbiw Z, 1
    			brne dalej221
    				mov r16, r8
    				mov r17, r9
    				mov r18, r10
    				mov r19, r11
    				add r16, r21		
    				adc r17, r20
    				adc r18, r20
    				adc r19, r20
    				mov r8, r16
    				mov r9, r17
    				mov r10, r18
    				mov r11, r19
    				rjmp nastepny_sektor1
    			dalej221:
    			rjmp dalej331
    	koniec331:
    	
    
    	sts WolnyKatalog, r22
    	sts WolnyKatalog+1, r23
    	sts WolnyKatalog+2, r24
    	sts WolnyKatalog+3, r25
    
    ; zawiera numer wolnego wpisu w obecnym katalogu
    
    ; CzyscKlaster:
    	ldi r20, 0
    	ldi r21, 2
    
    	lds r16, NumerJAP
    	lds r17, NumerJAP+1
    	lds r18, NumerJAP+2
    	lds r19, NumerJAP+3
    
    	sub r16, r21							; odejmij 2, sekcja danych zaczyna się od 2 klastra
    	sbc r17, r20
    	sbc r18, r20
    	sbc r19, r20
    
    	lds r21, SectorsPerCluster_Byte			; oblicz numer sektora do odczytu- początek danych + numer klastra obecnego folderu * liczba sektorów w klastrze
    
    	clr r8
    	clr r9
    	clr r10
    	clr r11
    
    	dodajdalej1:
    		add r8, r16
    		adc r9, r17
    		adc r10, r18
    		adc r11, r19
    		subi r21, 1
    	brne dodajdalej1
    
    
    	Lds R16,BeginOfDataSection_Word
    	Lds R17,BeginOfDataSection_Word+1
    	Lds R18,BeginOfDataSection_Word+2
    	Lds R19,BeginOfDataSection_Word+3
    
    
    	add r16, r8
    	adc r17, r9
    	adc r18, r10
    	adc r19, r11
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)			; czyść bufor	
    	Ldi Xh,High(BytesBufferLocationInRam)
    
    	ldi r20, 0										; wartość do wpisu w klastrze
    	ldi r21, 255
    
    	st x+, r20
    	CzyscDalej:
    		st x+, r20
    		subi r21, 1
    	brne CzyscDalej
    
    	st x+, r20
    	ldi r21, 255
    	CzyscDalej1:
    		st x+, r20
    		subi r21, 1
    	brne CzyscDalej1
    
    
    ; dwa pierwsze wpisy zawierające "." i ".."
    	Ldi Xl,Low(BytesBufferLocationInRam)
    	Ldi Xh,High(BytesBufferLocationInRam)
    
    
    ; "."
    	ldi r22, 0x2E
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x10
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x76
    	st x+, r22
    	ldi r22, 0x8F
    	st x+, r22
    	ldi r22, 0x53
    	st x+, r22
    
    	ldi r22, 0x5A
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	ldi r22, 0x5A
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	lds r22, NumerJAP+2				; numer pierwszej JAP - 2 bajt
    	st x+, r22
    	lds r22, NumerJAP+3				; numer pierwszej JAP - 3 bajt
    	st x+, r22
    	ldi r22, 0x90
    	st x+, r22
    	ldi r22, 0x53
    	st x+, r22
    
    	ldi r22, 0x5A
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	lds r22, NumerJAP				; numer pierwszej JAP - 0 bajt
    	st x+, r22
    	lds r22, NumerJAP+1				; numer pierwszej JAP - 1 bajt
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    
    
    
    
    
    ; ".."
    	ldi r22, 0x2E
    	st x+, r22
    	ldi r22, 0x2E
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x10
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x76
    	st x+, r22
    	ldi r22, 0x8F
    	st x+, r22
    	ldi r22, 0x53
    	st x+, r22
    
    	ldi r22, 0x5A
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	ldi r22, 0x5A
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	lds r22, ObecnyKatalog+2				; numer pierwszej JAP - 2 bajt
    	st x+, r22
    	lds r22, ObecnyKatalog+3				; numer pierwszej JAP - 3 bajt
    	st x+, r22
    	ldi r22, 0x90
    	st x+, r22
    	ldi r22, 0x53
    	st x+, r22
    
    	ldi r22, 0x5A
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	lds r22, ObecnyKatalog				; numer pierwszej JAP - 0 bajt
    	st x+, r22
    	lds r22, ObecnyKatalog+1				; numer pierwszej JAP - 1 bajt
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdWriteSector	
    
    	ldi r20, 0										; wartość do wpisu w klastrze
    	ldi r21, 255
    
    	Ldi Xl,Low(BytesBufferLocationInRam)
    	Ldi Xh,High(BytesBufferLocationInRam)
    
    	st x+, r20
    	CzyscDalej2:
    		st x+, r20
    		subi r21, 1
    	brne CzyscDalej2
    
    	st x+, r20
    	ldi r21, 255
    	CzyscDalej3:
    		st x+, r20
    		subi r21, 1
    	brne CzyscDalej3
    
    
    	ldi r20, 0
    	ldi r21, 1
    	
    	add r16, r21
    	adc r17, r20
    	adc r18, r20
    	adc r19, r20
    
    
    	lds r22, SectorsPerCluster_Byte
    	subi r22, 2
    	zapisz1:
    		Ldi Xl,Low(BytesBufferLocationInRam)				
    		Ldi Xh,High(BytesBufferLocationInRam)
    		Ldi Yl,Low(MMC_SECTOR_SIZE)
    		Ldi Yh,High(MMC_SECTOR_SIZE)
    		push r22
    		Call SdWriteSector	
    		pop r22
    		add r16, r21
    		adc r17, r20
    		adc r18, r20
    		adc r19, r20
    		subi r22, 1
    	brne zapisz1
    
    ; ##########################################
    ; pobranie potrzebnego fragmentu tablicy FAT1 i dokonanie wpisu
    	Lds R16,BeginOfAlocationTable_Half	; załaduj początek FAT
    	Lds R17,BeginOfAlocationTable_Half+1
    	Ldi R18,0
    	Ldi R19,0
    
    	ldi r20, 0
    	ldi r21, 2
    
    	lds r22, NumerJAP						; załaduj numer wolnej JAP
    	lds r23, NumerJAP+1
    	lds r24, NumerJAP+2
    	lds r25, NumerJAP+3
    
    	sub r22, r21							; odejmij 2, sekcja danych zaczyna się od 2 klastra
    	sbc r23, r20
    	sbc r24, r20
    	sbc r25, r20
    
    
    	clc							; podziel numer wolnej JAP przez 4, by wskazać numer sektora do zmiany
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    
    	add r16, r22				; teraz jest to numer sektora FAT do zmiany
    	adc r17, r23
    	adc r18, r24
    	adc r19, r25
    
    
    
    	push r16
    	push r17
    	push r18
    	push r19
    
    	Ldi Xl,Low(BytesBufferLocationInRam)				
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdReadSector							; pobierz sektor
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)		; pobierz adres bufora
    	Ldi Xh,High(BytesBufferLocationInRam)
    
    	lds r22, NumerJAP					; załaduj numer wolnej JAP, 
    	lds r23, NumerJAP+1					; tu nie trzeba odejmować, bo 2 pierwsze wpisy trzeba pominąć
    	lds r24, NumerJAP+2
    	lds r25, NumerJAP+3
    
    
    
    	clc							; pomnóż numer wolnej JAP razy 4, by wskazać numer bajtów do zmiany
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    	clc
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    
    
    
    	add Xl, r22
    	adc Xh, r23
    
    
    	ldi r22, 0xFF				; koniec pliku
    	ldi r23, 0x0F
    
    	st x+, r22
    	st x+, r22
    	st x+, r22
    	st x+, r23
    
    	pop r19
    	pop r18
    	pop r17
    	pop r16
    
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)				
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdWriteSector	
    
    
    
    ;					FAT2
    ; ##########################################
    ; pobranie potrzebnego fragmentu tablicy FAT2 i dokonanie wpisu
    	Lds R16,BeginOfAlocationTable_Half	; załaduj początek FAT
    	Lds R17,BeginOfAlocationTable_Half+1
    	Ldi R18,0
    	Ldi R19,0
    
    	lds r22, AlocationTableSize_Byte						; do początku FAT1 dodaj rozmiar tablicy, co da początek FAT2
    	lds r23, AlocationTableSize_Byte+1
    	lds r24, AlocationTableSize_Byte+2
    	lds r25, AlocationTableSize_Byte+3
    
    	add r16, r22
    	adc r17, r23
    	adc r18, r24
    	adc r19, r25
    
    
    	ldi r20, 0
    	ldi r21, 2
    
    	lds r22, NumerJAP						; załaduj numer wolnej JAP
    	lds r23, NumerJAP+1
    	lds r24, NumerJAP+2
    	lds r25, NumerJAP+3
    
    	sub r22, r21							; odejmij 2, sekcja danych zaczyna się od 2 klastra
    	sbc r23, r20
    	sbc r24, r20
    	sbc r25, r20
    
    
    	clc							; podziel numer wolnej JAP przez 4, by wskazać numer sektora do zmiany
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    
    	add r16, r22				; teraz jest to numer sektora FAT2 do zmiany
    	adc r17, r23
    	adc r18, r24
    	adc r19, r25
    
    
    
    	push r16
    	push r17
    	push r18
    	push r19
    
    	Ldi Xl,Low(BytesBufferLocationInRam)				
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdReadSector							; pobierz sektor
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)		; pobierz adres bufora
    	Ldi Xh,High(BytesBufferLocationInRam)
    
    	lds r22, NumerJAP					; załaduj numer wolnej JAP, 
    	lds r23, NumerJAP+1					; tu nie trzeba odejmować, bo 2 pierwsze wpisy trzeba pominąć
    	lds r24, NumerJAP+2
    	lds r25, NumerJAP+3
    
    
    
    	clc							; pomnóż numer wolnej JAP razy 4, by wskazać numer bajtów do zmiany
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    	clc
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    
    
    
    	add Xl, r22
    	adc Xh, r23
    
    
    	ldi r22, 0xFF				; koniec pliku
    	ldi r23, 0x0F
    
    	st x+, r22
    	st x+, r22
    	st x+, r22
    	st x+, r23
    
    	pop r19
    	pop r18
    	pop r17
    	pop r16
    
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)				
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdWriteSector	
    
    ; ##########################################
    ; pobranie sektora katalogu i zmiana wpisu
    	lds r21, SectorsPerCluster_Byte			; oblicz numer sektora do odczytu- początek danych + numer klastra obecnego folderu * liczba sektorów w klastrze
    
    	Lds R16,ObecnyKatalog
    	Lds R17,ObecnyKatalog+1
    	Lds R18,ObecnyKatalog+2
    	Lds R19,ObecnyKatalog+3
    
    	ldi r20, 2								; odejmij 2, sekcja danych zaczyna się od 2 klastra
    	ldi r26, 0
    	sub r16, r20
    	sbc r17, r26
    	sbc r18, r26
    	sbc r19, r26
    
    	clr r8
    	clr r9
    	clr r10
    	clr r11
    
    	dodajdalej2:
    		add r8, r16
    		adc r9, r17
    		adc r10, r18
    		adc r11, r19
    		subi r21, 1
    	brne dodajdalej2
    
    
    	Lds R16,BeginOfDataSection_Word
    	Lds R17,BeginOfDataSection_Word+1
    	Lds R18,BeginOfDataSection_Word+2
    	Lds R19,BeginOfDataSection_Word+3
    
    
    	add r16, r8
    	adc r17, r9
    	adc r18, r10
    	adc r19, r11
    
    
    	lds r22, WolnyKatalog			; załaduj numer katalogu
    	lds r23, WolnyKatalog+1
    	lds r24, WolnyKatalog+2
    	lds r25, WolnyKatalog+3
    
    
    	clc								; podziel przez 16
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc							
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc								
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    	clc
    	lsr r25
    	ror r24
    	ror r23
    	ror r22
    
    
    	add r16, r22				; teraz jest to numer sektora katalogu do zmiany
    	adc r17, r23
    	adc r18, r24
    	adc r19, r25
    
    
    
    
    	push r16
    	push r17
    	push r18
    	push r19
    
    	Ldi Xl,Low(BytesBufferLocationInRam)				
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdReadSector							; pobierz sektor
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)		; pobierz adres bufora
    	Ldi Xh,High(BytesBufferLocationInRam)
    
    	lds r22, WolnyKatalog					; załaduj numer wolnej JAP
    	lds r23, WolnyKatalog+1
    	lds r24, WolnyKatalog+2
    	lds r25, WolnyKatalog+3
    
    
    	clc							; pomnóż numer wolnej JAP razy 32, by wskazać numer bajtów do zmiany
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    	clc
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    	clc
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    	clc
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    	clc
    	lsl r22
    	rol r23
    	rol r24
    	rol r25
    
    
    
    	add Xl, r22
    	adc Xh, r23
    
    ; wpis o katalogu 32 bajty
    	ldi r22, 0x46
    	st x+, r22
    	ldi r22, 0x4F
    	st x+, r22
    	ldi r22, 0x4C
    	st x+, r22
    	ldi r22, 0x44
    	st x+, r22
    	ldi r22, 0x45
    	st x+, r22
    	ldi r22, 0x52
    	st x+, r22
    	ldi r22, 0x38
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x20
    	st x+, r22
    	ldi r22, 0x10
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x09
    	st x+, r22
    	ldi r22, 0xAD
    	st x+, r22
    	ldi r22, 0x81
    	st x+, r22
    
    	ldi r22, 0x58
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	ldi r22, 0x58
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	lds r22, NumerJAP+2				; numer pierwszej JAP - 2 bajt
    	st x+, r22
    	lds r22, NumerJAP+3				; numer pierwszej JAP - 3 bajt
    	st x+, r22
    	ldi r22, 0xAE
    	st x+, r22
    	ldi r22, 0x81
    	st x+, r22
    
    	ldi r22, 0x58
    	st x+, r22
    	ldi r22, 0x3B
    	st x+, r22
    	lds r22, NumerJAP				; numer pierwszej JAP - 0 bajt
    	st x+, r22
    	lds r22, NumerJAP+1				; numer pierwszej JAP - 1 bajt
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    	ldi r22, 0x00
    	st x+, r22
    ; koniec
    
    
    	pop r19
    	pop r18
    	pop r17
    	pop r16
    
    
    	Ldi Xl,Low(BytesBufferLocationInRam)				
    	Ldi Xh,High(BytesBufferLocationInRam)
    	Ldi Yl,Low(MMC_SECTOR_SIZE)
    	Ldi Yh,High(MMC_SECTOR_SIZE)
    	Call SdWriteSector	
    


    Jak widać sam kod jest wysoce nieoptymalny, optymalizacją zamierzam zająć się później. Dzięki za odpowiedź, pozdrawiam....
  • #4 7185203
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 7185268
    tzok
    Moderator Samochody
    Nic z tego kodu nie rozumiem, ale czy aktualizujesz obydwie kopie tablicy FAT?

    P.S.
    Skojarzył mi się taki żart - co zrobić jeśli w Twoim programie w C jest błąd i nie możesz go znaleźć? Przepisz swój kod w Assemblerze, błędu to nie wyeliminuje, ale zyskasz pewność, że nikt inny go nie znajdzie i Ci go nie wytknie...
  • #6 7185318
    Konto nie istnieje
    Poziom 1  
  • #7 7185428
    michalmily
    Poziom 13  
    Za kod przepraszam, faktycznie trudno cokolwiek z niego odczytać.
    Porównałem oba przypadki, znalazłem różnicę ale już poprawiłem (w klastrze nowego folderu jako początek sektora dla wpisu ".." wpisywałem numer sektora katalogu nadrzędnego jako 00000002h- w tym sektorze znajduje się katalog główny, trzeba ten wpis pomniejszyć o 2 niewykorzystywane klastry). Mimo to system ciągle go nie widzi. Jeżeli chodzi o zapis do drugiej tablicy FAT, to również wpis jest dokonywany.
  • REKLAMA
  • #8 7185437
    Konto nie istnieje
    Poziom 1  
  • #9 7185470
    michalmily
    Poziom 13  
    Już chyba wiem co jest nie tak, znalazłem problem. Moja głupota nie zna granic.... Gdy testowałem co zapisuje układ na karcie, przekładałem kartę z czytnika do układu i z powrotem. Nie wystarczyło jednak wyciągnąć karty i włożyć z powrotem, trzeba za każdym razem czytnik odłączyć.... Teraz wszystko działa jak powinno. :) Dzięki wszystkim za zainteresowanie i przepraszam za kłopot (udało się przynajmniej znaleźć jeden błąd). Pozdrawiam....
REKLAMA