Subversion Repositories pentevo

Rev

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
;