;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