Subversion Repositories pentevo

Rev

Rev 312 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  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.         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
  340.  
  341.         LDSW    FAT_ROOTCLS+0
  342.         LDSX    FAT_ROOTCLS+2
  343. ;
  344. ;--------------------------------------
  345. ;
  346. CALCKCLSDIR:
  347.         PUSHW
  348.         PUSHX
  349.         LDI     TEMP,1
  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
  363.         POPX
  364.         POPW
  365.         RET
  366. ;
  367. ;--------------------------------------
  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. ;--------------------------------------
  399. ;чтение сектора данных
  400. LOAD_DATA:
  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:
  418.         LDIZ    BUFSECT
  419.         RCALL   SD_READ_SECTOR  ;читать один сектор
  420.         BREQ    SDERR2
  421. ;        SBRS    FLAGS1,3
  422.         RET
  423. ;        LDIZ    BUFSECT
  424. ;        CALL    UART_DUMP512
  425. ;        RET
  426. ;
  427. ;--------------------------------------
  428. SDERR2: LDI     DATA,2  ;ошибка при чтении сектора
  429. SD_ERROR:
  430.         LDSZ    FAT_ERRHANDLER
  431.         IJMP
  432. ;
  433. ;--------------------------------------
  434. ;чтение сектора служ.инф. (FAT/DIR/...)
  435. LOADLST:
  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
  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
  470.         RCALL   SD_READ_SECTOR  ;читать один сектор
  471.         BREQ    SDERR2
  472.         LDIZ    BUF4FAT
  473.         SBRS    FLAGS1,3
  474.         RET
  475.         CALL    UART_DUMP512
  476. LOADLST9:
  477.         LDIZ    BUF4FAT
  478.         RET
  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
  576.         ANDI    XH,$0F  ;
  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
  615.         PUSHW
  616.         RCALL   LOADLST
  617.         POPW
  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. ;
  817.