Subversion Repositories pentevo

Rev

Rev 290 | Rev 312 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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