Rev 312 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
261 | ddp | 1 | ; |
2 | .DSEG |
||
277 | ddp | 3 | SD_CARDTYPE: .BYTE 1 ;.0-SDv1; .1-SDv2; .2-SDv2HC; .4-MMC |
4 | ; на данный момент имеет значение только это ^^^^^^^^^ |
||
5 | ; |
||
261 | ddp | 6 | FAT_CAL_FAT: .BYTE 1 ;тип обнаруженной FAT |
7 | FAT_MANYFAT: .BYTE 1 ;количество FAT-таблиц |
||
8 | FAT_BYTSSEC: .BYTE 1 ;количество секторов в кластере |
||
9 | FAT_ROOTCLS: .BYTE 4 ;КЛАСТЕР начала root директории |
||
10 | FAT_SEC_FAT: .BYTE 4 ;количество секторов одной FAT |
||
11 | FAT_RSVDSEC: .BYTE 2 ;размер резервной области |
||
12 | FAT_STARTRZ: .BYTE 4 ;начало диска/раздела |
||
13 | FAT_FRSTDAT: .BYTE 4 ;адрес первого сектора данных от BPB |
||
14 | FAT_SEC_DSC: .BYTE 4 ;количество секторов на диске/разделе |
||
15 | FAT_CLS_DSC: .BYTE 4 ;количество кластеров на диске/разделе |
||
16 | FAT_FATSTR0: .BYTE 4 ;начало первой FAT таблицы |
||
17 | FAT_FATSTR1: .BYTE 4 ;начало второй FAT таблицы |
||
18 | FAT_TEK_DIR: .BYTE 4 ;кластер текущей директории |
||
19 | FAT_KCLSDIR: .BYTE 1 ;кол-во кластеров директории |
||
20 | FAT_NUMSECK: .BYTE 1 ;счетчик секторов в кластере |
||
21 | FAT_TFILCLS: .BYTE 4 ;текущий кластер |
||
22 | FAT_MPHWOST: .BYTE 1 ;кол-во секторов в последнем кластере |
||
23 | FAT_KOL_CLS: .BYTE 4 ;кол-во кластеров файла минус 1 |
||
24 | FAT_LASTSECFLAG:.BYTE 1 |
||
25 | FAT_ERRHANDLER: .BYTE 2 |
||
290 | ddp | 26 | FAT_LST0ZAP: .BYTE 4 |
261 | ddp | 27 | .CSEG |
28 | ; |
||
277 | ddp | 29 | CMD00: .DB $40,$00,$00,$00,$00,$95 |
30 | CMD08: .DB $48,$00,$00,$01,$AA,$87 |
||
31 | CMD16: .DB $50,$00,$00,$02,$00,$FF |
||
32 | ; |
||
261 | ddp | 33 | ;инициализация SD карточки |
34 | ;out: XW == номер кластера root-директории |
||
35 | SD_FAT_INIT: |
||
36 | STSZ FAT_ERRHANDLER |
||
37 | |||
38 | LDI TEMP,SD_CS1 |
||
39 | SER DATA |
||
40 | CALL FPGA_REG |
||
41 | LDI TEMP,32 |
||
42 | RCALL SD_RD_DUMMY |
||
43 | |||
44 | LDI TEMP,SD_CS0 |
||
45 | SER DATA |
||
46 | CALL FPGA_REG |
||
47 | SER COUNT |
||
277 | ddp | 48 | SDINIT1:LDIZ CMD00*2 ;CMD0 (go_idle_state) |
261 | ddp | 49 | RCALL SD_WR_PGM_6 |
50 | DEC COUNT |
||
51 | BRNE SDINIT2 |
||
277 | ddp | 52 | LDI DATA,1 ;нет карты |
261 | ddp | 53 | RJMP SD_ERROR |
54 | SDINIT2:CPI DATA,$01 |
||
55 | BRNE SDINIT1 |
||
56 | |||
277 | ddp | 57 | LDIZ CMD08*2 ;CMD8 (send_if_cond) |
261 | ddp | 58 | RCALL SD_WR_PGM_6 |
59 | LDI WL,$00 |
||
60 | SBRS DATA,2 |
||
61 | LDI WL,$40 |
||
62 | LDI TEMP,4 |
||
63 | RCALL SD_RD_DUMMY |
||
64 | |||
277 | ddp | 65 | SDINIT3:LDI DATA,$40+55 ;CMD55 |
66 | RCALL SD_WR_CMD |
||
261 | ddp | 67 | LDI TEMP,2 |
68 | RCALL SD_RD_DUMMY |
||
277 | ddp | 69 | LDI DATA,$40+41 ;ACMD41 (sd_send_op_cond) |
261 | ddp | 70 | RCALL SD_EXCHANGE |
71 | MOV DATA,WL |
||
72 | RCALL SD_EXCHANGE |
||
277 | ddp | 73 | RCALL SD_WR_CMX4 |
261 | ddp | 74 | TST DATA |
277 | ddp | 75 | BREQ SDINIT5 |
76 | SBRS DATA,2 |
||
77 | RJMP SDINIT3 |
||
261 | ddp | 78 | |
277 | ddp | 79 | SDINIT4:LDI DATA,$40+1 ;CMD1 (send_op_cond) |
80 | RCALL SD_WR_CMD |
||
261 | ddp | 81 | TST DATA |
82 | BRNE SDINIT4 |
||
277 | ddp | 83 | RCALL SD_CRC_OFF |
84 | RCALL SD_SETBLKLEN |
||
85 | LDI TEMP,0B00010000 |
||
86 | RJMP SDINIT9 |
||
261 | ddp | 87 | |
277 | ddp | 88 | SDINIT5:RCALL SD_CRC_OFF |
89 | RCALL SD_SETBLKLEN |
||
261 | ddp | 90 | |
277 | ddp | 91 | LDI TEMP,0B00000001 |
92 | TST WL |
||
93 | BREQ SDINIT9 |
||
94 | LDI DATA,$40+58 ;CMD58 (read_ocr) |
||
95 | RCALL SD_WR_CMD |
||
261 | ddp | 96 | RCALL SD_RECEIVE |
277 | ddp | 97 | PUSH DATA |
261 | ddp | 98 | LDI TEMP,3+2 |
99 | RCALL SD_RD_DUMMY |
||
277 | ddp | 100 | POP DATA |
101 | LDI TEMP,0B00000010 |
||
102 | SBRC DATA,6 |
||
103 | LDI TEMP,0B00000110 |
||
104 | SDINIT9:STS SD_CARDTYPE,TEMP |
||
261 | ddp | 105 | ; |
106 | ; - - - - - - - - - - - - - - - - - - - |
||
107 | ;поиск FAT, инициализация переменных |
||
290 | ddp | 108 | WC_FAT: LDIZ FAT_LST0ZAP |
109 | ST Z+,FF |
||
110 | ST Z+,FF |
||
111 | ST Z+,FF |
||
112 | ST Z,FF |
||
113 | LDIW 0 |
||
261 | ddp | 114 | LDIX 0 |
115 | RCALL LOADLST |
||
277 | ddp | 116 | RCALL FAT_CHKSIGN |
117 | BREQ WC_FAT1 |
||
118 | SDERR3: LDI DATA,3 ;не найдена FAT |
||
119 | RJMP SD_ERROR |
||
120 | WC_FAT1:LDI ZL,$BE |
||
261 | ddp | 121 | LD DATA,Z |
277 | ddp | 122 | ANDI DATA,$7F |
261 | ddp | 123 | BRNE RDFAT05 |
124 | LDI ZL,$C2 |
||
125 | LD DATA,Z |
||
126 | CPI DATA,$01 |
||
127 | BREQ RDFAT06 |
||
290 | ddp | 128 | CPI DATA,$04 |
129 | BREQ RDFAT06 |
||
130 | CPI DATA,$06 |
||
131 | BREQ RDFAT06 |
||
261 | ddp | 132 | CPI DATA,$0B |
133 | BREQ RDFAT06 |
||
134 | CPI DATA,$0C |
||
135 | BREQ RDFAT06 |
||
136 | CPI DATA,$0E |
||
137 | BRNE RDFAT05 |
||
290 | ddp | 138 | RDFAT06:LDI ZL,$C6 |
261 | ddp | 139 | LD WL,Z+ |
140 | LD WH,Z+ |
||
141 | LD XL,Z+ |
||
142 | LD XH,Z |
||
143 | RJMP RDFAT00 |
||
144 | RDFAT05:LDIZ BUF4FAT |
||
290 | ddp | 145 | LDD BITS,Z+13 ;BPB_SecPerClus |
261 | ddp | 146 | LDI DATA,0 |
147 | LDI TEMP,0 |
||
148 | LDI COUNT,8 |
||
149 | RDF051: ROR BITS |
||
150 | ADC DATA,NULL |
||
151 | DEC COUNT |
||
152 | BRNE RDF051 |
||
153 | DEC DATA |
||
154 | BRNE RDF052 |
||
155 | INC TEMP |
||
290 | ddp | 156 | RDF052: LDD DATA,Z+14 ;BPB_RsvdSecCnt |
157 | LDD R0,Z+15 ;BPB_RsvdSecCnt |
||
261 | ddp | 158 | OR DATA,R0 |
159 | BREQ RDF053 |
||
160 | INC TEMP |
||
290 | ddp | 161 | RDF053: LDD DATA,Z+19 ;BPB_TotSec16 |
162 | LDD R0,Z+20 ;BPB_TotSec16 |
||
261 | ddp | 163 | OR DATA,R0 |
164 | BRNE RDF054 |
||
165 | INC TEMP |
||
290 | ddp | 166 | RDF054: LDD DATA,Z+32 ;BPB_TotSec32 |
167 | LDD R0,Z+33 ;BPB_TotSec32 |
||
261 | ddp | 168 | OR DATA,R0 |
290 | ddp | 169 | LDD R0,Z+34 ;BPB_TotSec32 |
261 | ddp | 170 | OR DATA,R0 |
290 | ddp | 171 | LDD R0,Z+35 ;BPB_TotSec32 |
261 | ddp | 172 | OR DATA,R0 |
173 | BRNE RDF055 |
||
174 | INC TEMP |
||
290 | ddp | 175 | RDF055: LDD DATA,Z+21 ;BPB_Media |
261 | ddp | 176 | ANDI DATA,$F0 |
177 | CPI DATA,$F0 |
||
178 | BRNE RDF056 |
||
179 | INC TEMP |
||
180 | RDF056: CPI TEMP,4 |
||
181 | BREQ RDF057 |
||
277 | ddp | 182 | RJMP SDERR3 |
290 | ddp | 183 | ; |
184 | RDF057: LDIW 0 |
||
261 | ddp | 185 | LDIX 0 |
186 | RDFAT00:STSW FAT_STARTRZ+0 |
||
187 | STSX FAT_STARTRZ+2 |
||
188 | RCALL LOADLST |
||
277 | ddp | 189 | RCALL FAT_CHKSIGN |
190 | BREQ RDF011 |
||
191 | RJMP SDERR3 |
||
192 | RDF011: LDIZ BUF4FAT |
||
290 | ddp | 193 | LDD DATA,Z+11 ;BPB_BytsPerSec |
277 | ddp | 194 | TST DATA |
195 | BRNE SDERR4 |
||
290 | ddp | 196 | LDD DATA,Z+12 ;BPB_BytsPerSec |
277 | ddp | 197 | CPI DATA,$02 |
198 | BREQ RDF012 |
||
199 | SDERR4: LDI DATA,4 ;ошибка FAT (сектор не 512 байт) |
||
200 | RJMP SD_ERROR |
||
201 | RDF012: LDIX 0 |
||
290 | ddp | 202 | LDD WL,Z+22 ;BPB_FATSz16 |
203 | LDD WH,Z+23 ;BPB_FATSz16 |
||
261 | ddp | 204 | MOV DATA,WH |
205 | OR DATA,WL |
||
290 | ddp | 206 | BRNE RDFAT01 ;если BPB_FATSz16==0 то берем BPB_FATSz32 |
207 | LDD WL,Z+36 ;BPB_FATSz32 |
||
208 | LDD WH,Z+37 ;BPB_FATSz32 |
||
209 | LDD XL,Z+38 ;BPB_FATSz32 |
||
210 | LDD XH,Z+39 ;BPB_FATSz32 |
||
261 | ddp | 211 | RDFAT01:STSW FAT_SEC_FAT+0 |
290 | ddp | 212 | STSX FAT_SEC_FAT+2 ;число секторов на FAT-таблицу |
261 | ddp | 213 | LDIX 0 |
290 | ddp | 214 | LDD WL,Z+19 ;BPB_TotSec16 |
215 | LDD WH,Z+20 ;BPB_TotSec16 |
||
261 | ddp | 216 | MOV DATA,WH |
217 | OR DATA,WL |
||
290 | ddp | 218 | BRNE RDFAT02 ;если BPB_TotSec16==0 то берем из BPB_TotSec32 |
219 | LDD WL,Z+32 ;BPB_TotSec32 |
||
220 | LDD WH,Z+33 ;BPB_TotSec32 |
||
221 | LDD XL,Z+34 ;BPB_TotSec32 |
||
222 | LDD XH,Z+35 ;BPB_TotSec32 |
||
261 | ddp | 223 | RDFAT02:STSW FAT_SEC_DSC+0 |
224 | STSX FAT_SEC_DSC+2 ;к-во секторов на диске/разделе |
||
225 | ;вычисляем rootdirsectors |
||
290 | ddp | 226 | LDD WL,Z+17 ;BPB_RootEntCnt |
227 | LDD WH,Z+18 ;BPB_RootEntCnt |
||
261 | ddp | 228 | LDIX 0 |
229 | MOV DATA,WH |
||
290 | ddp | 230 | OR DATA,WL ;в FAT32 поле BPB_RootEntCnt всегда 0 |
231 | BREQ RDFAT03 ;поэтому для FAT32 RootDirSectors всегда 0 |
||
261 | ddp | 232 | LDI DATA,$10 |
233 | RCALL BCDE_A |
||
290 | ddp | 234 | MOVW XL,WL |
235 | RDFAT03:PUSH XH ;RootDirSectors в X |
||
261 | ddp | 236 | PUSH XL |
290 | ddp | 237 | LDD DATA,Z+16 ;BPB_NumFATs |
261 | ddp | 238 | STS FAT_MANYFAT,DATA |
239 | LDSW FAT_SEC_FAT+0 |
||
240 | LDSX FAT_SEC_FAT+2 |
||
241 | DEC DATA |
||
242 | RDF031: LSL WL |
||
243 | ROL WH |
||
244 | ROL XL |
||
245 | ROL XH |
||
246 | DEC DATA |
||
247 | BRNE RDF031 |
||
248 | POP TMP2 |
||
249 | POP TMP3 |
||
290 | ddp | 250 | ;полный размер FAT-области в секторах |
251 | RCALL HLDEPBC ;прибавили RootDirSectors |
||
252 | LDD TMP2,Z+14 ;BPB_RsvdSecCnt |
||
253 | LDD TMP3,Z+15 ;BPB_RsvdSecCnt |
||
261 | ddp | 254 | STS FAT_RSVDSEC+0,TMP2 |
255 | STS FAT_RSVDSEC+1,TMP3 |
||
290 | ddp | 256 | RCALL HLDEPBC ;прибавили BPB_RsvdSecCnt |
261 | ddp | 257 | STSW FAT_FRSTDAT+0 |
258 | STSX FAT_FRSTDAT+2 ;положили номер первого сектора данных |
||
259 | LDIZ FAT_SEC_DSC |
||
260 | RCALL BCDEHLM ;вычли из полного к-ва секторов раздела |
||
261 | LDIZ BUF4FAT |
||
290 | ddp | 262 | LDD DATA,Z+13 ;BPB_SecPerClus |
277 | ddp | 263 | CPI DATA,65 |
264 | BRCS RDF032 |
||
290 | ddp | 265 | RJMP SDERR4 ;ошибка FAT (кластер>32Kb, ограничения флешера) |
277 | ddp | 266 | RDF032: STS FAT_BYTSSEC,DATA |
261 | ddp | 267 | RCALL BCDE_A ;разделили на к-во секторов в кластере |
268 | STSW FAT_CLS_DSC+0 |
||
269 | STSX FAT_CLS_DSC+2 ;положили кол-во кластеров на разделе |
||
270 | |||
290 | ddp | 271 | ;microsoft-recommended FAT type determination (FAT12 <4085; FAT16 <65525; else FAT32) |
272 | LDI DATA,2 |
||
273 | TST XH |
||
261 | ddp | 274 | BRNE RDFAT04 |
290 | ddp | 275 | TST XL |
276 | BRNE RDFAT04 |
||
277 | CPI WL,$F5 |
||
278 | CPC WH,FF |
||
279 | BRCC RDFAT04 |
||
261 | ddp | 280 | LDI DATA,1 |
290 | ddp | 281 | LDI TEMP,$0F |
282 | CPI WL,$F5 |
||
283 | CPC WH,TEMP |
||
284 | BRCC RDFAT04 |
||
285 | LDI DATA,0 |
||
286 | ;alternative FAT type determination |
||
287 | ; PUSHX |
||
288 | ; PUSHW |
||
289 | ; LSL WL |
||
290 | ; ROL WH |
||
291 | ; ROL XL |
||
292 | ; ROL XH |
||
293 | ; RCALL RASCHET |
||
294 | ; LDI DATA,1 |
||
295 | ; POPW |
||
296 | ; POPX |
||
297 | ; BREQ RDFAT04 |
||
298 | ; LSL WL |
||
299 | ; ROL WH |
||
300 | ; ROL XL |
||
301 | ; ROL XH |
||
302 | ; LSL WL |
||
303 | ; ROL WH |
||
304 | ; ROL XL |
||
305 | ; ROL XH |
||
306 | ; RCALL RASCHET |
||
307 | ; LDI DATA,2 |
||
308 | ; BREQ RDFAT04 |
||
309 | ; CLR DATA |
||
261 | ddp | 310 | RDFAT04:STS FAT_CAL_FAT,DATA |
290 | ddp | 311 | |
312 | ;для FAT12/16 вычисляем адрес первого сектора директории |
||
313 | ;для FAT32 берем по смещемию +44 |
||
314 | ;на выходе XW == кластер rootdir |
||
261 | ddp | 315 | LDIW 0 |
316 | LDIX 0 |
||
317 | TST DATA |
||
318 | BREQ FSRROO2 |
||
319 | DEC DATA |
||
320 | BREQ FSRROO2 |
||
321 | LDD WL,Z+44 |
||
322 | LDD WH,Z+45 |
||
323 | LDD XL,Z+46 |
||
324 | LDD XH,Z+47 |
||
325 | FSRROO2:STSW FAT_ROOTCLS+0 |
||
326 | STSX FAT_ROOTCLS+2 ;КЛАСТЕР root директории |
||
327 | STSW FAT_TEK_DIR+0 |
||
328 | STSX FAT_TEK_DIR+2 |
||
290 | ddp | 329 | |
261 | ddp | 330 | LDSW FAT_RSVDSEC |
331 | LDIX 0 |
||
332 | LDIZ FAT_STARTRZ |
||
333 | RCALL BCDEHLP |
||
334 | STSW FAT_FATSTR0+0 |
||
335 | STSX FAT_FATSTR0+2 |
||
336 | LDIZ FAT_SEC_FAT |
||
337 | RCALL BCDEHLP |
||
338 | STSW FAT_FATSTR1+0 |
||
339 | STSX FAT_FATSTR1+2 |
||
315 | ddp | 340 | |
341 | LDSW FAT_ROOTCLS+0 |
||
342 | LDSX FAT_ROOTCLS+2 |
||
290 | ddp | 343 | ; |
344 | ;-------------------------------------- |
||
345 | ; |
||
346 | CALCKCLSDIR: |
||
315 | ddp | 347 | PUSHW |
348 | PUSHX |
||
277 | ddp | 349 | LDI TEMP,1 |
290 | ddp | 350 | MOV R0,WL |
351 | OR R0,WH |
||
352 | OR R0,XL |
||
353 | OR R0,XH |
||
354 | BREQ LASTCLS |
||
355 | NEXTCLS:PUSH TEMP |
||
356 | RCALL RDFATZP |
||
357 | RCALL LST_CLS |
||
358 | POP TEMP |
||
359 | BRCC LASTCLS |
||
360 | INC TEMP |
||
361 | RJMP NEXTCLS |
||
362 | LASTCLS:STS FAT_KCLSDIR,TEMP |
||
315 | ddp | 363 | POPX |
364 | POPW |
||
261 | ddp | 365 | RET |
366 | ; |
||
367 | ;-------------------------------------- |
||
277 | ddp | 368 | ; |
369 | SD_CRC_OFF: |
||
370 | LDI DATA,$40+59 ;CMD59 (crc_on_off) |
||
371 | RCALL SD_WR_CMD |
||
372 | TST DATA |
||
373 | BRNE SD_CRC_OFF |
||
374 | RET |
||
375 | ; |
||
376 | ;-------------------------------------- |
||
377 | ; |
||
378 | SD_SETBLKLEN: |
||
379 | LDIZ CMD16*2 ;CMD16 (set_blocklen) |
||
380 | RCALL SD_WR_PGM_6 |
||
381 | TST DATA |
||
382 | BRNE SD_SETBLKLEN |
||
383 | RET |
||
384 | ; |
||
385 | ;-------------------------------------- |
||
386 | ;out: sreg.Z SET==signature exist |
||
387 | ; Z==BUF4FAT+$01FF |
||
388 | FAT_CHKSIGN: |
||
389 | LDIZ BUF4FAT+$01FE |
||
390 | LD DATA,Z+ |
||
391 | CPI DATA,$55 |
||
392 | LD DATA,Z |
||
393 | BRNE FAT_CHKSIG9 |
||
394 | CPI DATA,$AA |
||
395 | FAT_CHKSIG9: |
||
396 | RET |
||
397 | ; |
||
398 | ;-------------------------------------- |
||
261 | ddp | 399 | ;чтение сектора данных |
400 | LOAD_DATA: |
||
277 | ddp | 401 | SBRS FLAGS1,3 |
402 | RJMP LOAD_DAT1 |
||
403 | PUSH FLAGS1 |
||
404 | CBR FLAGS1,0B00001101 |
||
405 | SBR FLAGS1,0B00000010 |
||
406 | LDIZ MSG_TSD_READSECTOR*2 |
||
407 | CALL PRINTSTRZ |
||
408 | MOV DATA,XH |
||
409 | CALL HEXBYTE |
||
410 | MOV DATA,XL |
||
411 | CALL HEXBYTE |
||
412 | MOV DATA,WH |
||
413 | CALL HEXBYTE |
||
414 | MOV DATA,WL |
||
415 | CALL HEXBYTE |
||
416 | POP FLAGS1 |
||
417 | LOAD_DAT1: |
||
261 | ddp | 418 | LDIZ BUFSECT |
419 | RCALL SD_READ_SECTOR ;читать один сектор |
||
420 | BREQ SDERR2 |
||
277 | ddp | 421 | ; SBRS FLAGS1,3 |
261 | ddp | 422 | RET |
277 | ddp | 423 | ; LDIZ BUFSECT |
424 | ; CALL UART_DUMP512 |
||
425 | ; RET |
||
261 | ddp | 426 | ; |
427 | ;-------------------------------------- |
||
290 | ddp | 428 | SDERR2: LDI DATA,2 ;ошибка при чтении сектора |
429 | SD_ERROR: |
||
430 | LDSZ FAT_ERRHANDLER |
||
431 | IJMP |
||
432 | ; |
||
433 | ;-------------------------------------- |
||
261 | ddp | 434 | ;чтение сектора служ.инф. (FAT/DIR/...) |
277 | ddp | 435 | LOADLST: |
290 | ddp | 436 | LDIZ FAT_LST0ZAP |
437 | LD DATA,Z+ |
||
438 | CP DATA,WL |
||
439 | BRNE LOADLST2 |
||
440 | LD DATA,Z+ |
||
441 | CP DATA,WH |
||
442 | BRNE LOADLST2 |
||
443 | LD DATA,Z+ |
||
444 | CP DATA,XL |
||
445 | BRNE LOADLST2 |
||
446 | LD DATA,Z+ |
||
447 | CP DATA,XH |
||
448 | BREQ LOADLST9 |
||
449 | LOADLST2: |
||
450 | STSW FAT_LST0ZAP+0 |
||
451 | STSX FAT_LST0ZAP+2 |
||
277 | ddp | 452 | SBRS FLAGS1,3 |
453 | RJMP LOADLST1 |
||
454 | PUSH FLAGS1 |
||
455 | CBR FLAGS1,0B00001101 |
||
456 | SBR FLAGS1,0B00000010 |
||
457 | LDIZ MSG_TSD_READSECTOR*2 |
||
458 | CALL PRINTSTRZ |
||
459 | MOV DATA,XH |
||
460 | CALL HEXBYTE |
||
461 | MOV DATA,XL |
||
462 | CALL HEXBYTE |
||
463 | MOV DATA,WH |
||
464 | CALL HEXBYTE |
||
465 | MOV DATA,WL |
||
466 | CALL HEXBYTE |
||
467 | POP FLAGS1 |
||
468 | LOADLST1: |
||
469 | LDIZ BUF4FAT |
||
261 | ddp | 470 | RCALL SD_READ_SECTOR ;читать один сектор |
471 | BREQ SDERR2 |
||
472 | LDIZ BUF4FAT |
||
277 | ddp | 473 | SBRS FLAGS1,3 |
261 | ddp | 474 | RET |
277 | ddp | 475 | CALL UART_DUMP512 |
290 | ddp | 476 | LOADLST9: |
277 | ddp | 477 | LDIZ BUF4FAT |
478 | RET |
||
261 | ddp | 479 | ; |
480 | ;-------------------------------------- |
||
481 | ;чтение сектора dir по номеру описателя (W) |
||
482 | ;на выходе: DATA=#ff (sreg.Z=0) выход за пределы dir |
||
483 | RDDIRSC:PUSHW |
||
484 | LDI TEMP,SD_CS0 |
||
485 | SER DATA |
||
486 | CALL FPGA_REG |
||
487 | |||
488 | LDIX 0 |
||
489 | LDI DATA,$10 |
||
490 | RCALL BCDE_A |
||
491 | PUSH WL |
||
492 | LDS DATA,FAT_BYTSSEC |
||
493 | PUSH DATA |
||
494 | RCALL BCDE_A |
||
495 | LDS DATA,FAT_KCLSDIR |
||
496 | DEC DATA |
||
497 | CP DATA,WL |
||
498 | BRCC RDDIRS3 |
||
499 | POP DATA |
||
500 | POP DATA |
||
501 | POPW |
||
502 | SER DATA |
||
503 | TST DATA |
||
504 | RET |
||
505 | RDDIRS3:LDSX FAT_TEK_DIR+2 |
||
506 | MOV DATA,WL |
||
507 | TST DATA |
||
508 | LDSW FAT_TEK_DIR+0 |
||
509 | BREQ RDDIRS1 |
||
510 | RDDIRS2:PUSH DATA |
||
511 | RCALL RDFATZP |
||
512 | POP DATA |
||
513 | DEC DATA |
||
514 | BRNE RDDIRS2 |
||
515 | RDDIRS1:RCALL REALSEC |
||
516 | POP R0 |
||
517 | DEC R0 |
||
518 | POP DATA |
||
519 | AND DATA,R0 |
||
520 | ADD WL,DATA |
||
521 | ADC WH,NULL |
||
522 | ADC XL,NULL |
||
523 | ADC XH,NULL |
||
524 | RCALL LOADLST |
||
525 | POPW |
||
526 | CLR DATA |
||
527 | RET |
||
528 | ; |
||
529 | ;-------------------------------------- |
||
530 | ;out: sreg.C == CLR - EOCmark |
||
531 | ;(chng: TEMP) |
||
532 | LST_CLS:LDI TEMP,$0F |
||
533 | LDS DATA,FAT_CAL_FAT |
||
534 | TST DATA |
||
535 | BRNE LST_CL1 |
||
536 | CPI WL,$F7 |
||
537 | CPC WH,TEMP |
||
538 | RET |
||
539 | LST_CL1:DEC DATA |
||
540 | BRNE LST_CL2 |
||
541 | CPI WL,$F7 |
||
542 | CPC WH,FF |
||
543 | RET |
||
544 | LST_CL2:CPI WL,$F7 |
||
545 | CPC WH,FF |
||
546 | CPC XL,FF |
||
547 | CPC XH,TEMP |
||
548 | RET |
||
549 | ; |
||
550 | ;-------------------------------------- |
||
551 | ; |
||
552 | RDFATZP: |
||
553 | LDI TEMP,SD_CS0 |
||
554 | SER DATA |
||
555 | CALL FPGA_REG |
||
556 | |||
557 | LDS DATA,FAT_CAL_FAT |
||
558 | TST DATA |
||
559 | BREQ RDFATS0 ;FAT12 |
||
560 | DEC DATA |
||
561 | BREQ RDFATS1 ;FAT16 |
||
562 | ;FAT32 |
||
563 | LSL WL |
||
564 | ROL WH |
||
565 | ROL XL |
||
566 | ROL XH |
||
567 | MOV DATA,WL |
||
568 | MOV WL,WH |
||
569 | MOV WH,XL |
||
570 | MOV XL,XH |
||
571 | CLR XH |
||
572 | RCALL RDFATS2 |
||
573 | ADIW ZL,1 |
||
574 | LD XL,Z+ |
||
575 | LD XH,Z |
||
312 | ddp | 576 | ANDI XH,$0F ; |
261 | ddp | 577 | RET |
578 | ;FAT16 |
||
579 | RDFATS1:LDIX 0 |
||
580 | MOV DATA,WL |
||
581 | MOV WL,WH |
||
582 | CLR WH |
||
583 | RDFATS2:PUSH DATA |
||
584 | PUSHX |
||
585 | LDIZ FAT_FATSTR0 |
||
586 | RCALL BCDEHLP |
||
587 | RCALL LOADLST |
||
588 | POPX |
||
589 | POP DATA |
||
590 | ADD ZL,DATA |
||
591 | ADC ZH,NULL |
||
592 | ADD ZL,DATA |
||
593 | ADC ZH,NULL |
||
594 | LD WL,Z+ |
||
595 | LD WH,Z |
||
596 | RET |
||
597 | ;FAT12 |
||
598 | RDFATS0:MOVW ZL,WL |
||
599 | LSL ZL |
||
600 | ROL ZH |
||
601 | ADD ZL,WL |
||
602 | ADC ZH,WH |
||
603 | LSR ZH |
||
604 | ROR ZL |
||
605 | MOV DATA,WL |
||
606 | MOV WL,ZH |
||
607 | CLR WH |
||
608 | CLR XL |
||
609 | CLR XH |
||
610 | LSR WL |
||
611 | PUSH DATA |
||
612 | PUSHZ |
||
613 | LDIZ FAT_FATSTR0 |
||
614 | RCALL BCDEHLP |
||
277 | ddp | 615 | PUSHW |
261 | ddp | 616 | RCALL LOADLST |
277 | ddp | 617 | POPW |
261 | ddp | 618 | POPX |
619 | ANDI XH,$01 |
||
620 | ADD ZL,XL |
||
621 | ADC ZH,XH |
||
622 | LD XL,Z+ |
||
623 | CPI ZH,HIGH(BUF4FAT+512) |
||
624 | BRNE RDFATS4 |
||
625 | PUSH XL |
||
626 | LDIX 0 |
||
627 | ADIW WL,1 |
||
628 | RCALL LOADLST |
||
629 | POP XL |
||
630 | RDFATS4:POP DATA |
||
631 | LD WH,Z |
||
632 | MOV WL,XL |
||
633 | LDIX 0 |
||
634 | LSR DATA |
||
635 | BRCC RDFATS3 |
||
636 | LSR WH |
||
637 | ROR WL |
||
638 | LSR WH |
||
639 | ROR WL |
||
640 | LSR WH |
||
641 | ROR WL |
||
642 | LSR WH |
||
643 | ROR WL |
||
644 | RDFATS3:ANDI WH,$0F |
||
645 | RET |
||
646 | ; |
||
647 | ;-------------------------------------- |
||
648 | ;вычисление реального сектора |
||
649 | ;на входе XW==номер FAT |
||
650 | ;на выходе XW==адрес сектора |
||
651 | REALSEC:MOV DATA,XH |
||
652 | OR DATA,XL |
||
653 | OR DATA,WH |
||
654 | OR DATA,WL |
||
655 | BRNE REALSE1 |
||
656 | LDIZ FAT_FATSTR1 |
||
657 | LDSW FAT_SEC_FAT+0 |
||
658 | LDSX FAT_SEC_FAT+2 |
||
659 | RJMP BCDEHLP |
||
660 | REALSE1:SBIW WL,2 ;номер кластера-2 |
||
661 | SBC XL,NULL |
||
662 | SBC XH,NULL |
||
663 | LDS DATA,FAT_BYTSSEC |
||
664 | RJMP REALSE2 |
||
665 | REALSE3:LSL WL |
||
666 | ROL WH |
||
667 | ROL XL |
||
668 | ROL XH |
||
669 | REALSE2:LSR DATA |
||
670 | BRCC REALSE3 |
||
671 | ;умножили на размер кластера |
||
672 | LDIZ FAT_STARTRZ |
||
673 | RCALL BCDEHLP ;прибавили смещение от начала диска |
||
674 | LDIZ FAT_FRSTDAT |
||
675 | RJMP BCDEHLP ;прибавили смещение от начала раздела |
||
676 | ; |
||
677 | ;-------------------------------------- |
||
678 | ;XW>>9 (деление на 512) |
||
679 | BCDE200:MOV WL,WH |
||
680 | MOV WH,XL |
||
681 | MOV XL,XH |
||
682 | LDI XH,0 |
||
683 | LDI DATA,1 |
||
684 | ; - - - - - - - - - - - - - - - - - - - |
||
685 | ;XWDATA>>до"переноса" |
||
686 | ;если в DATA вкл.только один бит, то получается |
||
687 | ;XW=XW/DATA |
||
688 | BCDE_A1:LSR XH |
||
689 | ROR XL |
||
690 | ROR WH |
||
691 | ROR WL |
||
692 | BCDE_A: ROR DATA |
||
693 | BRCC BCDE_A1 |
||
694 | RET |
||
695 | ; |
||
696 | ;-------------------------------------- |
||
697 | ;XW=[Z]-XW |
||
698 | BCDEHLM:LD DATA,Z+ |
||
699 | SUB DATA,WL |
||
700 | MOV WL,DATA |
||
701 | LD DATA,Z+ |
||
702 | SBC DATA,WH |
||
703 | MOV WH,DATA |
||
704 | LD DATA,Z+ |
||
705 | SBC DATA,XL |
||
706 | MOV XL,DATA |
||
707 | LD DATA,Z |
||
708 | SBC DATA,XH |
||
709 | MOV XH,DATA |
||
710 | RET |
||
711 | ; |
||
712 | ;-------------------------------------- |
||
713 | ;XW=XW+[Z] |
||
714 | BCDEHLP:LD DATA,Z+ |
||
715 | ADD WL,DATA |
||
716 | LD DATA,Z+ |
||
717 | ADC WH,DATA |
||
718 | LD DATA,Z+ |
||
719 | ADC XL,DATA |
||
720 | LD DATA,Z |
||
721 | ADC XH,DATA |
||
722 | RET |
||
723 | ; |
||
724 | ;-------------------------------------- |
||
725 | ;XW=XW+TMP3TMP2 |
||
726 | HLDEPBC:ADD WL,TMP2 |
||
727 | ADC WH,TMP3 |
||
728 | ADC XL,NULL |
||
729 | ADC XH,NULL |
||
730 | RET |
||
731 | ; |
||
732 | ;-------------------------------------- |
||
733 | ; |
||
734 | RASCHET:RCALL BCDE200 |
||
735 | LDIZ FAT_SEC_FAT |
||
736 | RCALL BCDEHLM |
||
737 | MOV DATA,WL |
||
738 | ANDI DATA,$F0 |
||
739 | OR DATA,WH |
||
740 | OR DATA,XL |
||
741 | OR DATA,XH |
||
742 | RET |
||
743 | ; |
||
744 | ;-------------------------------------- |
||
745 | ;чтение очередного сектора файла в BUFFER |
||
746 | ;out: DATA == 0 - считан последний сектор файла |
||
747 | NEXTSEC: |
||
748 | LDI TEMP,SD_CS0 |
||
749 | SER DATA |
||
750 | CALL FPGA_REG |
||
751 | |||
752 | LDIZ FAT_KOL_CLS |
||
753 | LD DATA,Z+ |
||
754 | LD TEMP,Z+ |
||
755 | OR DATA,TEMP |
||
756 | LD TEMP,Z+ |
||
757 | OR DATA,TEMP |
||
758 | LD TEMP,Z+ |
||
759 | OR DATA,TEMP |
||
760 | BREQ LSTCLSF |
||
761 | LDSW FAT_TFILCLS+0 |
||
762 | LDSX FAT_TFILCLS+2 |
||
763 | RCALL REALSEC |
||
764 | LDS DATA,FAT_NUMSECK |
||
765 | ADD WL,DATA |
||
766 | ADC WH,NULL |
||
767 | ADC XL,NULL |
||
768 | ADC XH,NULL |
||
769 | RCALL LOAD_DATA |
||
770 | LDSW FAT_TFILCLS+0 |
||
771 | LDSX FAT_TFILCLS+2 |
||
772 | LDS DATA,FAT_NUMSECK |
||
773 | INC DATA |
||
774 | STS FAT_NUMSECK,DATA |
||
775 | LDS TEMP,FAT_BYTSSEC |
||
776 | CP TEMP,DATA |
||
777 | BRNE NEXT_OK |
||
778 | |||
779 | STS FAT_NUMSECK,NULL |
||
780 | RCALL RDFATZP |
||
781 | STSW FAT_TFILCLS+0 |
||
782 | STSX FAT_TFILCLS+2 |
||
783 | LDIZ FAT_KOL_CLS |
||
784 | LD DATA,Z |
||
785 | SUBI DATA,1 |
||
786 | ST Z+,DATA |
||
787 | LD DATA,Z |
||
788 | SBC DATA,NULL |
||
789 | ST Z+,DATA |
||
790 | LD DATA,Z |
||
791 | SBC DATA,NULL |
||
792 | ST Z+,DATA |
||
793 | LD DATA,Z |
||
794 | SBC DATA,NULL |
||
795 | ST Z+,DATA |
||
796 | NEXT_OK:SER DATA |
||
797 | RET |
||
798 | |||
799 | LSTCLSF:LDSW FAT_TFILCLS+0 |
||
800 | LDSX FAT_TFILCLS+2 |
||
801 | RCALL REALSEC |
||
802 | LDS DATA,FAT_NUMSECK |
||
803 | ADD WL,DATA |
||
804 | ADC WH,NULL |
||
805 | ADC XL,NULL |
||
806 | ADC XH,NULL |
||
807 | RCALL LOAD_DATA |
||
808 | LDS DATA,FAT_NUMSECK |
||
809 | INC DATA |
||
810 | STS FAT_NUMSECK,DATA |
||
811 | LDS TEMP,FAT_MPHWOST |
||
812 | SUB DATA,TEMP |
||
813 | RET |
||
814 | ; |
||
815 | ;-------------------------------------- |
||
816 | ; |