Subversion Repositories pentevo

Rev

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

  1. .NOLIST
  2. .INCLUDE "m128def.inc"
  3. .INCLUDE "_macros.asm"
  4.  
  5. .MACRO  SDCS_SET
  6.         SBI     PORTB,0
  7. .ENDMACRO
  8.  
  9. .MACRO  SDCS_CLR
  10.         CBI     PORTB,0
  11. .ENDMACRO
  12.  
  13. .MACRO  LED_ON
  14.         CBI     PORTB,7
  15. .ENDMACRO
  16.  
  17. .MACRO  LED_OFF
  18.         SBI     PORTB,7
  19. .ENDMACRO
  20.  
  21. .LIST
  22. .LISTMAC
  23.  
  24. .DEF    POLY_LO =R06    ;всегда = $21
  25. .DEF    POLY_HI =R07    ;всегда = $10
  26. .DEF    FF_FL   =R08
  27. .DEF    CRC_LO  =R09
  28. .DEF    CRC_HI  =R10
  29. .DEF    ADR1    =R11
  30. .DEF    ADR2    =R12
  31. .DEF    FF      =R13    ;всегда = $FF
  32. .DEF    ONE     =R14    ;всегда = $01
  33. .DEF    NULL    =R15    ;всегда = $00
  34. .DEF    DATA    =R16
  35. .DEF    TEMP    =R17
  36. .DEF    COUNT   =R18
  37. .DEF    BITS    =R19
  38. .DEF    GUARD   =R22
  39. ;локально используются: R0,R1,R20,R21,R24,R25
  40.  
  41. .EQU    DBSIZE_HI       =HIGH(4096)
  42. .EQU    DBMASK_HI       =HIGH(4095)
  43. .EQU    nCONFIG         =PORTF0
  44. .EQU    nSTATUS         =PORTF1
  45. .EQU    CONF_DONE       =PORTF2
  46.  
  47. .EQU    SOH             =$01
  48. .EQU    EOT             =$04
  49. .EQU    ACK             =$06
  50. .EQU    NAK             =$15
  51. .EQU    CAN             =$18
  52.  
  53. .EQU    CMD_17          =$51    ;read_single_block
  54. .EQU    ACMD_41         =$69    ;sd_send_op_cond
  55.  
  56. .EQU    ANSI_RED        =$31
  57. .EQU    ANSI_GREEN      =$32
  58. .EQU    ANSI_YELLOW     =$33
  59. .EQU    ANSI_WHITE      =$37
  60.  
  61. .EQU    FLASHSIZE=480   ;размер обновляемой области FLASH в блоках по 256 байт
  62. .EQU    MAIN_VERS=$EFF8 ;указатель на описатель версии осн.прошивки
  63. ;
  64. ;--------------------------------------
  65. ;
  66. .DSEG
  67.         .ORG    $0100
  68. BUFFER:                 ;главный буфер
  69.         .ORG    $0200
  70. BUFSECT:                ;буфер сектора
  71.         .ORG    $0400
  72. BUF4FAT:                ;временный буфер (FAT и т.п.)
  73.         .ORG    $0600
  74. HEADER:                 ;заголовок файла
  75.         .ORG    $0680
  76. CAL_FAT:.BYTE   1       ;тип обнаруженной FAT
  77. MANYFAT:.BYTE   1       ;количество FAT-таблиц
  78. BYTSSEC:.BYTE   1       ;количество секторов в кластере
  79. ROOTCLS:.BYTE   4       ;сектор начала root директории
  80. SEC_FAT:.BYTE   4       ;количество секторов одной FAT
  81. RSVDSEC:.BYTE   2       ;размер резервной области
  82. STARTRZ:.BYTE   4       ;начало диска/раздела
  83. FRSTDAT:.BYTE   4       ;адрес первого сектора данных от BPB
  84. SEC_DSC:.BYTE   4       ;количество секторов на диске/разделе
  85. CLS_DSC:.BYTE   4       ;количество кластеров на диске/разделе
  86. FATSTR0:.BYTE   4       ;начало первой FAT таблицы
  87. FATSTR1:.BYTE   4       ;начало второй FAT таблицы
  88. TEK_DIR:.BYTE   4       ;кластер текущей директории
  89. KCLSDIR:.BYTE   1       ;кол-во кластеров директории
  90. NUMSECK:.BYTE   1       ;счетчик секторов в кластере
  91. TFILCLS:.BYTE   4       ;текущий кластер
  92. MPHWOST:.BYTE   1       ;кол-во секторов в последнем кластере
  93. KOL_CLS:.BYTE   4       ;кол-во кластеров файла минус 1
  94. SDHC:   .BYTE   1
  95. STEP:
  96. SDERROR:.BYTE   1
  97. LASTSECFLAG:
  98.         .BYTE   1
  99. ;
  100. ;--------------------------------------
  101. ;
  102. .CSEG
  103.         .ORG    $F000
  104. BOOTLOADER_BEGIN:
  105. RESET:  CLI
  106. ;Причина реcета? Если Watchdog то на основную программу
  107.         IN      DATA,MCUCSR
  108.         ANDI    DATA,0B00001000
  109.         BREQ    START1
  110.         JMP     0
  111. ;
  112. BAD_BOOTLDR_CRC:
  113. START1: CLR     NULL
  114.         LDI     GUARD,$5A
  115.         LDI     TEMP,$01
  116.         MOV     ONE,TEMP
  117.         LDI     TEMP,$FF
  118.         MOV     FF,TEMP
  119.         LDI     TEMP,$21
  120.         MOV     POLY_LO,TEMP
  121.         LDI     TEMP,$10
  122.         MOV     POLY_HI,TEMP
  123. ;WatchDog OFF, если вдруг включен
  124.         LDI     TEMP,0B00011111
  125.         OUT     WDTCR,TEMP
  126.         OUT     WDTCR,NULL
  127. ;
  128.         LED_ON
  129.         SBI     DDRB,7
  130. ;стек
  131.         LDI     TEMP,LOW(RAMEND)
  132.         OUT     SPL,TEMP
  133.         LDI     TEMP,HIGH(RAMEND)
  134.         OUT     SPH,TEMP
  135. ;проверка CRC загрузчика
  136.         LDIZ    BOOTLOADER_BEGIN*2              ;адрес в байтах
  137.         OUT     RAMPZ,ONE
  138.         LDIY    BOOTLOADER_END-BOOTLOADER_BEGIN ;длина в словах
  139.         RCALL   CALK_CRC_FLASH
  140.         BRNE    BAD_BOOTLDR_CRC ;что делать, если не правильная crc у bootloaderа ? я делаю перезапуск.
  141. ;хочет ли пользователь обновиться ?
  142.         SBIS    PINC,7           ;нажат "SoftReset" ?
  143.         RJMP    UPDATE_ME
  144. ;проверка CRC осн.программы
  145. START8: RCALL   CRCMAIN
  146.         BRNE    UPDATE_ME        ;если некорректная CRC
  147. ;
  148. ;запуск watchdog-а (по срабатыванию переход на осн.программу)
  149. START9: CBI     PORTE,6
  150.         LDI     TEMP,0B00011000
  151.         OUT     WDTCR,TEMP
  152. GAVGAV: RJMP    GAVGAV
  153. ;
  154. ;--------------------------------------
  155. ;проверка CRC осн.программы после обновления
  156. CHECKIT:RCALL   NEWLINE
  157.         LDIZ    MSG_RECHECK*2
  158.         RCALL   PRINTSTRZ
  159.         RCALL   CRCMAIN
  160.         BRNE    CHK_BAD
  161.         LDIZ    MSG_MAINOK*2
  162.         RCALL   PRINTSTRZ
  163.         RCALL   NEWLINE2
  164.         LDIZ    MSG_MAIN*2
  165.         RCALL   PRINTSTRZ
  166.         LDIZ    MAIN_VERS*2
  167.         RCALL   PRINTVERS
  168.         RCALL   NEWLINE2
  169.         RJMP    START9
  170. ;
  171. CHK_BAD:LDI     DATA,ANSI_RED
  172.         RCALL   ANSI_COLOR
  173.         LDIZ    MSG_MAINBAD*2
  174.         RCALL   PRINTSTRZ
  175.         RCALL   DELAY_3SEC
  176. ;
  177. ;--------------------------------------
  178. ;
  179. UPDATE_ME:
  180.         LDI     TEMP,      0B01111001 ;
  181.         OUT     PORTB,TEMP
  182.         LDI     TEMP,      0B10000111 ; LED on, spi outs
  183.         OUT     DDRB,TEMP
  184.  
  185.         LDI     TEMP,      0B00001000 ; ATX on
  186.         OUTPORT DDRF,TEMP
  187.         OUTPORT PORTF,TEMP
  188. ;SPI init
  189.         LDI     TEMP,(1<<SPI2X)
  190.         OUT     SPSR,TEMP
  191.         LDI     TEMP,(1<<SPE)|(1<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
  192.         OUT     SPCR,TEMP
  193. ;UART1 Set baud rate
  194.         OUTPORT UBRR1H,NULL
  195.         LDI     TEMP,5     ;115200 baud @ 11059.2 kHz, Normal speed
  196.         OUTPORT UBRR1L,TEMP
  197. ;UART1 Normal Speed
  198.         OUTPORT UCSR1A,NULL
  199. ;UART1 data8bit, 2stopbits
  200.         LDI     TEMP,(1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS)
  201.         OUTPORT UCSR1C,TEMP
  202. ;UART1 Разрешаем передачу
  203.         LDI     TEMP,(1<<TXEN)
  204.         OUTPORT UCSR1B,TEMP
  205. ;вывод информации о версиях
  206.         LDIZ    MSG_TITLE*2
  207.         RCALL   PRINTSTRZ
  208.         LDIZ    MSG_BOOT*2
  209.         RCALL   PRINTSTRZ
  210.         LDIZ    BOOT_VERS*2
  211.         RCALL   PRINTVERS
  212.         RCALL   NEWLINE
  213.         LDIZ    MSG_MAIN*2
  214.         RCALL   PRINTSTRZ
  215.         TST     CRC_LO
  216.         BREQ    UP01
  217.         LDIZ    MSG_BADCRC*2
  218.         RCALL   PRINTSTRZ
  219.         RJMP    UP02
  220. UP01:   LDIZ    MAIN_VERS*2
  221.         RCALL   PRINTVERS
  222. UP02:   RCALL   NEWLINE
  223. ;ждём включения ATX, а потом ещё чуть-чуть.
  224. UP11:   SBIS    PINF,0 ;PINC,5 ; а если powergood нет вообще ?
  225.         RJMP    UP11
  226.         LDI     DATA,5
  227.         RCALL   DELAY
  228.  
  229.         LDIZ    MSG_CFGFPGA*2
  230.         RCALL   PRINTSTRZ
  231. ;загрузка FPGA
  232.         INPORT  TEMP,DDRF
  233.         SBR     TEMP,(1<<nCONFIG)
  234.         OUTPORT DDRF,TEMP
  235.  
  236.         LDI     TEMP,147 ;40 us @ 11.0592 MHz
  237. LDFPGA1:DEC     TEMP    ;1
  238.         BRNE    LDFPGA1 ;2
  239.  
  240.         INPORT  TEMP,DDRF
  241.         CBR     TEMP,(1<<nCONFIG)
  242.         OUTPORT DDRF,TEMP
  243.  
  244. LDFPGA2:SBIS    PINF,nSTATUS
  245.         RJMP    LDFPGA2
  246.  
  247.         LDIZ    PACKED_FPGA*2
  248.         OUT     RAMPZ,ONE
  249.         LDIY    BUFFER
  250. ;(не трогаем стек! всё ОЗУ под буфер)
  251.         LDI     TEMP,$80
  252. MS:     ELPM    R0,Z+
  253.         ST      Y+,R0
  254. ;-begin-PUT_BYTE_1---
  255.         OUT     SPDR,R0
  256. PUTB1:  SBIS    SPSR,SPIF
  257.         RJMP    PUTB1
  258. ;-end---PUT_BYTE_1---
  259.         SUBI    YH,HIGH(BUFFER) ;
  260.         ANDI    YH,DBMASK_HI    ;Y warp
  261.         ADDI    YH,HIGH(BUFFER) ;
  262. M0:     LDI     R21,$02
  263.         LDI     R20,$FF
  264. M1:
  265. M1X:    ADD     TEMP,TEMP
  266.         BRNE    M2
  267.         ELPM    TEMP,Z+
  268.         ROL     TEMP
  269. M2:     ROL     R20
  270.         BRCC    M1X
  271.         DEC     R21
  272.         BRNE    X2
  273.         LDI     DATA,2
  274.         ASR     R20
  275.         BRCS    N1
  276.         INC     DATA
  277.         INC     R20
  278.         BREQ    N2
  279.         LDI     R21,$03
  280.         LDI     R20,$3F
  281.         RJMP    M1
  282. X2:     DEC     R21
  283.         BRNE    X3
  284.         LSR     R20
  285.         BRCS    MS
  286.         INC     R21
  287.         RJMP    M1
  288. X6:     ADD     DATA,R20
  289. N2:     LDI     R21,$04
  290.         LDI     R20,$FF
  291.         RJMP    M1
  292. N1:     INC     R20
  293.         BRNE    M4
  294.         INC     R21
  295. N5:     ROR     R20
  296.         BRCS    DEMLZEND
  297.         ROL     R21
  298.         ADD     TEMP,TEMP
  299.         BRNE    N6
  300.         ELPM    TEMP,Z+
  301.         ROL     TEMP
  302. N6:     BRCC    N5
  303.         ADD     DATA,R21
  304.         LDI     R21,6
  305.         RJMP    M1
  306. X3:     DEC     R21
  307.         BRNE    X4
  308.         LDI     DATA,1
  309.         RJMP    M3
  310. X4:     DEC     R21
  311.         BRNE    X5
  312.         INC     R20
  313.         BRNE    M4
  314.         LDI     R21,$05
  315.         LDI     R20,$1F
  316.         RJMP    M1
  317. X5:     DEC     R21
  318.         BRNE    X6
  319.         MOV     R21,R20
  320. M4:     ELPM    R20,Z+
  321. M3:     DEC     R21
  322.         MOV     XL,R20
  323.         MOV     XH,R21
  324.         ADD     XL,YL
  325.         ADC     XH,YH
  326. LDIRLOOP:
  327.         SUBI    XH,HIGH(BUFFER) ;
  328.         ANDI    XH,DBMASK_HI    ;X warp
  329.         ADDI    XH,HIGH(BUFFER) ;
  330.         LD      R0,X+
  331.         ST      Y+,R0
  332. ;-begin-PUT_BYTE_2---
  333.         OUT     SPDR,R0
  334. PUTB2:  SBIS    SPSR,SPIF
  335.         RJMP    PUTB2
  336. ;-end---PUT_BYTE_2---
  337.         SUBI    YH,HIGH(BUFFER) ;
  338.         ANDI    YH,DBMASK_HI    ;Y warp
  339.         ADDI    YH,HIGH(BUFFER) ;
  340.         DEC     DATA
  341.         BRNE    LDIRLOOP
  342.         RJMP    M0
  343. ;теперь можно юзать стек
  344. DEMLZEND:
  345.         SBIS    PINF,CONF_DONE
  346.         RJMP    DEMLZEND
  347. ;SPI reinit
  348.         LDI     TEMP,(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
  349.         OUT     SPCR,TEMP
  350.         SBI     PORTE,6
  351.         LED_OFF
  352.         RCALL   NEWLINE
  353.         LDIZ    MSG_TRYUPDATE*2
  354.         RCALL   PRINTSTRZ
  355.         LDIZ    MSG__SDCARD*2
  356.         RCALL   PRINTSTRZ
  357. ;
  358. ;--------------------------------------
  359. ;инициализация SD карточки
  360.         STS     SDHC,NULL
  361.         SDCS_SET
  362.         LDI     TEMP,32
  363.         RCALL   SD_RD_DUMMY
  364.         SDCS_CLR
  365.         SER     COUNT
  366. SDINIT1:LDIZ    CMD00*2     ;CMD0 (go_idle_state)
  367.         RCALL   SD_WR_PGM_6
  368.         DEC     COUNT
  369.         BRNE    SDINIT2
  370.         LDI     DATA,1  ;нет карты
  371.         RJMP    SD_ERROR
  372. SDINIT2:CPI     DATA,$01
  373.         BRNE    SDINIT1
  374.  
  375.         LDIZ    CMD08*2     ;CMD8 (send_if_cond)
  376.         RCALL   SD_WR_PGM_6
  377.         LDI     R24,$00
  378.         SBRS    DATA,2
  379.         LDI     R24,$40
  380.         LDI     TEMP,4
  381.         RCALL   SD_RD_DUMMY
  382.  
  383. SDINIT3:LDI     DATA,$40+55 ;CMD55
  384.         RCALL   SD_WR_CMD
  385.         LDI     TEMP,2
  386.         RCALL   SD_RD_DUMMY
  387.         LDI     DATA,$40+41 ;ACMD41 (sd_send_op_cond)
  388.         RCALL   SD_EXCHANGE
  389.         MOV     DATA,R24
  390.         RCALL   SD_EXCHANGE
  391.         RCALL   SD_WR_CMX4
  392.         TST     DATA
  393.         BREQ    SDINIT5
  394.         SBRS    DATA,2
  395.         RJMP    SDINIT3
  396.  
  397. SDINIT4:LDI     DATA,$40+1  ;CMD1 (send_op_cond)
  398.         RCALL   SD_WR_CMD
  399.         TST     DATA
  400.         BRNE    SDINIT4
  401.         RCALL   SD_CRC_OFF
  402.         ;RCALL   SD_SETBLKLEN
  403.         RJMP    SDINIT9
  404.  
  405. SDINIT5:RCALL   SD_CRC_OFF
  406.         ;RCALL   SD_SETBLKLEN
  407.         TST     R24
  408.         BREQ    SDINIT9
  409.         LDI     DATA,$40+58 ;CMD58 (read_ocr)
  410.         RCALL   SD_WR_CMD
  411.         RCALL   SD_RECEIVE
  412.         STS     SDHC,DATA
  413.         LDI     TEMP,3+2
  414.         RCALL   SD_RD_DUMMY
  415. SDINIT9:
  416. ;
  417. ;--------------------------------------
  418. ;поиск FAT, инициализация переменных
  419. WC_FAT: LDIX    0
  420.         LDIY    0
  421.         RCALL   LOADLST
  422.         RCALL   FAT_CHKSIGN
  423.         BREQ    WC_FAT1
  424. SDERR3: LDI     DATA,3  ;не найдена FAT
  425.         RJMP    SD_ERROR
  426. WC_FAT1:LDI     ZL,$BE
  427.         LD      DATA,Z
  428.         ANDI    DATA,$7F
  429.         BRNE    RDFAT05
  430.         LDI     ZL,$C2
  431.         LD      DATA,Z
  432.         CPI     DATA,$01
  433.         BREQ    RDFAT06
  434.         CPI     DATA,$04
  435.         BREQ    RDFAT06
  436.         CPI     DATA,$06
  437.         BREQ    RDFAT06
  438.         CPI     DATA,$0B
  439.         BREQ    RDFAT06
  440.         CPI     DATA,$0C
  441.         BREQ    RDFAT06
  442.         CPI     DATA,$0E
  443.         BRNE    RDFAT05
  444. RDFAT06:LDI     ZL,$C6
  445.         LD      XL,Z+
  446.         LD      XH,Z+
  447.         LD      YL,Z+
  448.         LD      YH,Z
  449.         RJMP    RDFAT00
  450. RDFAT05:LDIZ    BUF4FAT
  451.         LDD     BITS,Z+$0D
  452.         LDI     DATA,0
  453.         LDI     TEMP,0
  454.         LDI     COUNT,8
  455. RDF051: ROR     BITS
  456.         ADC     DATA,NULL
  457.         DEC     COUNT
  458.         BRNE    RDF051
  459.         DEC     DATA
  460.         BRNE    RDF052
  461.         INC     TEMP
  462. RDF052: LDD     DATA,Z+$0E
  463.         LDD     R0,Z+$0F
  464.         OR      DATA,R0
  465.         BREQ    RDF053
  466.         INC     TEMP
  467. RDF053: LDD     DATA,Z+$13
  468.         LDD     R0,Z+$14
  469.         OR      DATA,R0
  470.         BRNE    RDF054
  471.         INC     TEMP
  472. RDF054: LDD     DATA,Z+$20
  473.         LDD     R0,Z+$21
  474.         OR      DATA,R0
  475.         LDD     R0,Z+$22
  476.         OR      DATA,R0
  477.         LDD     R0,Z+$23
  478.         OR      DATA,R0
  479.         BRNE    RDF055
  480.         INC     TEMP
  481. RDF055: LDD     DATA,Z+$15
  482.         ANDI    DATA,$F0
  483.         CPI     DATA,$F0
  484.         BRNE    RDF056
  485.         INC     TEMP
  486. RDF056: CPI     TEMP,4
  487.         BREQ    RDF057
  488.         RJMP    SDERR3
  489. ;
  490. RDF057: LDIY    0
  491.         LDIX    0
  492. RDFAT00:STSX    STARTRZ+0
  493.         STSY    STARTRZ+2
  494.         RCALL   LOADLST
  495.         RCALL   FAT_CHKSIGN
  496.         BREQ    RDF011
  497. SDERR3A:RJMP    SDERR3
  498. RDF011: LDIZ    BUF4FAT
  499.         LDD     DATA,Z+11       ;BPB_BytsPerSec
  500.         TST     DATA
  501.         BRNE    SDERR3A
  502.         LDD     DATA,Z+12       ;BPB_BytsPerSec
  503.         CPI     DATA,$02
  504.         BRNE    SDERR3A
  505. RDF012: LDIY    0
  506.         LDD     XL,Z+22
  507.         LDD     XH,Z+23         ;bpb_fatsz16
  508.         MOV     DATA,XH
  509.         OR      DATA,XL
  510.         BRNE    RDFAT01         ;если не fat12/16 (bpb_fatsz16=0)
  511.         LDD     XL,Z+36         ;то берем bpb_fatsz32 из смещения +36
  512.         LDD     XH,Z+37
  513.         LDD     YL,Z+38
  514.         LDD     YH,Z+39
  515. RDFAT01:STSX    SEC_FAT+0
  516.         STSY    SEC_FAT+2       ;число секторов на fat-таблицу
  517.         LDIY    0
  518.         LDD     XL,Z+19
  519.         LDD     XH,Z+20         ;bpb_totsec16
  520.         MOV     DATA,XH
  521.         OR      DATA,XL
  522.         BRNE    RDFAT02         ;если не fat12/16 (bpb_totsec16=0)
  523.         LDD     XL,Z+32         ;то берем из bpb_totsec32 смещения +32
  524.         LDD     XH,Z+33
  525.         LDD     YL,Z+34
  526.         LDD     YH,Z+35
  527. RDFAT02:STSX    SEC_DSC+0
  528.         STSY    SEC_DSC+2       ;к-во секторов на диске/разделе
  529. ;вычисляем rootdirsectors
  530.         LDD     XL,Z+17
  531.         LDD     XH,Z+18         ;bpb_rootentcnt
  532.         LDIY    0
  533.         MOV     DATA,XH
  534.         OR      DATA,XL
  535.         BREQ    RDFAT03
  536.         LDI     DATA,$10
  537.         RCALL   BCDE_A
  538.         MOVW    YL,XL           ;это реализована формула
  539.                                 ;rootdirsectors = ( (bpb_rootentcnt*32)+(bpb_bytspersec-1) )/bpb_bytspersec
  540.                                 ;в Y rootdirsectors
  541.                                 ;если fat32, то Y=0 всегда
  542. RDFAT03:PUSH    YH
  543.         PUSH    YL
  544.         LDD     DATA,Z+16       ;bpb_numfats
  545.         STS     MANYFAT,DATA
  546.         LDSX    SEC_FAT+0
  547.         LDSY    SEC_FAT+2
  548.         DEC     DATA
  549. RDF031: LSL     XL
  550.         ROL     XH
  551.         ROL     YL
  552.         ROL     YH
  553.         DEC     DATA
  554.         BRNE    RDF031
  555.         POP     R24
  556.         POP     R25
  557.                                 ;полный размер fat-области в секторах
  558.         RCALL   HLDEPBC         ;прибавили rootdirsectors
  559.         LDD     R24,Z+14
  560.         LDD     R25,Z+15        ;bpb_rsvdseccnt
  561.         STS     RSVDSEC+0,R24
  562.         STS     RSVDSEC+1,R25
  563.         RCALL   HLDEPBC         ;прибавили bpb_resvdseccnt
  564.         STSX    FRSTDAT+0
  565.         STSY    FRSTDAT+2       ;положили номер первого сектора данных
  566.         LDIZ    SEC_DSC
  567.         RCALL   BCDEHLM         ;вычли из полного к-ва секторов раздела
  568.         LDIZ    BUF4FAT
  569.         LDD     DATA,Z+13
  570.         STS     BYTSSEC,DATA
  571.         RCALL   BCDE_A          ;разделили на к-во секторов в кластере
  572.         STSX    CLS_DSC+0
  573.         STSY    CLS_DSC+2       ;положили кол-во кластеров на разделе
  574.  
  575. ;microsoft-recommended FAT type determination (FAT12 <4085; FAT16 <65525; else FAT32)
  576.         LDI     DATA,2
  577.         TST     YH
  578.         BRNE    RDFAT04
  579.         TST     YL
  580.         BRNE    RDFAT04
  581.         CPI     XL,$F5
  582.         CPC     XH,FF
  583.         BRCC    RDFAT04
  584.         LDI     DATA,1
  585.         LDI     TEMP,$0F
  586.         CPI     XL,$F5
  587.         CPC     XH,TEMP
  588.         BRCC    RDFAT04
  589.         LDI     DATA,0
  590. ;alternative FAT type determination
  591. ;        PUSHY
  592. ;        PUSHX
  593. ;        LSL     XL
  594. ;        ROL     XH
  595. ;        ROL     YL
  596. ;        ROL     YH
  597. ;        RCALL   RASCHET
  598. ;        LDI     DATA,1
  599. ;        POPX
  600. ;        POPY
  601. ;        BREQ    RDFAT04
  602. ;        LSL     XL
  603. ;        ROL     XH
  604. ;        ROL     YL
  605. ;        ROL     YH
  606. ;        LSL     XL
  607. ;        ROL     XH
  608. ;        ROL     YL
  609. ;        ROL     YH
  610. ;        RCALL   RASCHET
  611. ;        LDI     DATA,2
  612. ;        BREQ    RDFAT04
  613. ;        CLR     DATA
  614. RDFAT04:STS     CAL_FAT,DATA
  615. ;для fat12/16 вычисляем адрес первого сектора директории
  616. ;для fat32 берем по смещемию +44
  617. ;на выходе YX == сектор rootdir
  618.         LDIX    0
  619.         LDIY    0
  620.         TST     DATA
  621.         BREQ    FSRROO2
  622.         DEC     DATA
  623.         BREQ    FSRROO2
  624.         LDD     XL,Z+44
  625.         LDD     XH,Z+45
  626.         LDD     YL,Z+46
  627.         LDD     YH,Z+47
  628. FSRROO2:STSX    ROOTCLS+0
  629.         STSY    ROOTCLS+2       ;сектор root директории
  630.         STSX    TEK_DIR+0
  631.         STSY    TEK_DIR+2
  632.  
  633. FSRR121:PUSHX
  634.         PUSHY
  635.         LDSX    RSVDSEC
  636.         LDIY    0
  637.         LDIZ    STARTRZ
  638.         RCALL   BCDEHLP
  639.         STSX    FATSTR0+0
  640.         STSY    FATSTR0+2
  641.         LDIZ    SEC_FAT
  642.         RCALL   BCDEHLP
  643.         STSX    FATSTR1+0
  644.         STSY    FATSTR1+2
  645.         POPY
  646.         POPX
  647.  
  648.         LDI     TEMP,1
  649.         MOV     R0,XL
  650.         OR      R0,XH
  651.         OR      R0,YL
  652.         OR      R0,YH
  653.         BREQ    LASTCLS
  654. NEXTCLS:PUSH    TEMP
  655.         RCALL   RDFATZP
  656.         RCALL   LST_CLS
  657.         POP     TEMP
  658.         BRCC    LASTCLS
  659.         INC     TEMP
  660.         RJMP    NEXTCLS
  661. LASTCLS:STS     KCLSDIR,TEMP
  662.         LDIY    0
  663.         RCALL   RDDIRSC
  664. ;
  665. ;--------------------------------------
  666. ;поиск файла в директории
  667.         LDIY    0               ;номер описателя файла
  668.         RJMP    FNDMP32
  669.  
  670. FNDMP31:ADIW    YL,1            ;номер++               ─────────┐
  671.         ADIW    ZL,$20          ;следующий описатель             │
  672.         CPI     ZH,HIGH(BUF4FAT+512);                            │
  673.                                 ;вылезли за сектор?              │
  674.         BRNE    FNDMP32         ;нет ещё                         │
  675.         RCALL   RDDIRSC         ;считываем следующий             │
  676.         BRNE    FNDMP37         ;кончились сектора в директории ═│═╗
  677. FNDMP32:LDD     DATA,Z+$0B      ;атрибуты                        │ ║
  678.         SBRC    DATA,3          ;длиное имя/имя диска?           │ ║
  679.         RJMP    FNDMP31         ;да ────────────────────────────┤ ║
  680.         SBRC    DATA,4          ;директория?                     │ ║
  681.         RJMP    FNDMP31         ;да ────────────────────────────┤ ║
  682.         LD      DATA,Z          ;первый символ                   │ ║
  683.         CPI     DATA,$E5        ;удалённый файл?                 │ ║
  684.         BREQ    FNDMP31         ;да ────────────────────────────┘ ║
  685.         TST     DATA            ;пустой описатель? (конец списка)  ╚═ в этой директории
  686.         BREQ    FNDMP37         ;да ═════════════════════════════════ нет нашёго файла
  687.         PUSH    ZL
  688.         MOVW    XL,ZL
  689.         LDIZ    FILENAME*2
  690. ;        OUT     RAMPZ,ONE
  691. DALSHE: ELPM    DATA,Z+
  692.         TST     DATA
  693.         BREQ    NASHEL
  694.         LD      TEMP,X+
  695.         CP      DATA,TEMP
  696.         BREQ    DALSHE
  697. ;не совпало
  698.         MOV     ZH,XH
  699.         POP     ZL
  700.         RJMP    FNDMP31
  701. ;нет такого файла
  702. FNDMP37:
  703.         LDI     DATA,4  ;нет файла
  704.         RJMP    SD_ERROR
  705. ;найден описатель
  706. NASHEL: MOV     ZH,XH
  707.         POP     ZL
  708. ;
  709. ;--------------------------------------
  710. ;инициализация переменных
  711. ;для последующего чтения файла
  712. ;Z указывает на описатель файла
  713.         LDD     XL,Z+$1A
  714.         LDD     XH,Z+$1B
  715.         LDD     YL,Z+$14
  716.         LDD     YH,Z+$15        ;считали номер первого кластера файла
  717.         STSX    TFILCLS+0
  718.         STSY    TFILCLS+2
  719.         LDD     XL,Z+$1C
  720.         LDD     XH,Z+$1D
  721.         LDD     YL,Z+$1E
  722.         LDD     YH,Z+$1F        ;считали длину файла
  723.         MOV     DATA,XL
  724.         OR      DATA,XH
  725.         OR      DATA,YL
  726.         OR      DATA,YH
  727.         BRNE    F01
  728.         RJMP    SDUPD_ERR
  729. F01:    LDI     R24,LOW(511)
  730.         LDI     R25,HIGH(511)
  731.         RCALL   HLDEPBC
  732.         RCALL   BCDE200         ;получили кол-во секторов
  733.         SBIW    XL,1
  734.         SBC     YL,NULL
  735.         SBC     YH,NULL
  736.         LDS     DATA,BYTSSEC
  737.         DEC     DATA
  738.         AND     DATA,XL
  739.         INC     DATA
  740.         STS     MPHWOST,DATA    ;кол-во секторов в последнем кластере
  741.         LDS     DATA,BYTSSEC
  742.         RCALL   BCDE_A
  743.         STSX    KOL_CLS+0
  744.         STSY    KOL_CLS+2
  745.         STS     NUMSECK,NULL
  746. ;
  747. ;--------------------------------------
  748. ;загружаем данные из файла, шьём во флеш
  749.         RCALL   NEXTSEC
  750.         STS     LASTSECFLAG,DATA
  751.         STS     STEP,NULL
  752.  
  753.         LDIY    BUFSECT
  754.         LDIX    HEADER
  755.         CLR     CRC_LO
  756.         CLR     CRC_HI
  757.         LDI     R20,128
  758. SDUPD01:LD      DATA,Y+
  759.         ST      X+,DATA
  760.         RCALL   CRC_UPDATE
  761.         DEC     R20
  762.         BRNE    SDUPD01
  763.         OR      CRC_LO,CRC_HI
  764.         BRNE    SDUPD_ERR
  765.         RCALL   CHECK_SIGNATURE
  766.         BRNE    SDUPD_ERR
  767.  
  768.         LDI     XL,LOW(HEADER+$40)
  769. ;        LDI     XH,HIGH(HEADER+$40)
  770.         CLR     ADR1
  771.         CLR     ADR2
  772. SDUPD13:LDI     COUNT,8
  773.         LD      BITS,X+
  774. SDUPD12:LSR     BITS
  775.         BRCS    SDUPD20
  776. ;"пустой" блок
  777.         MOV     FF_FL,FF
  778.         RCALL   BLOCK_FLASH
  779.         BREQ    SDUPD50
  780.  
  781. SDUPD11:LED_OFF
  782.         SBRS    ADR1,5
  783.         LED_ON  ;мигать при обновлении
  784.  
  785.         DEC     COUNT
  786.         BRNE    SDUPD12
  787.         RJMP    SDUPD13
  788. ;
  789. SDUPD_ERR:RJMP  SDUPD_ERR1
  790. ;
  791. ;подготавливаем данные
  792. ;если необходимо загружаем с SD
  793. SDUPD20:PUSHX
  794.         PUSH    BITS
  795.         PUSH    COUNT
  796.         LDS     DATA,STEP
  797.         TST     DATA
  798.         BRNE    SDUPD30
  799. ;
  800.         LDIY    BUFSECT+128
  801.         LDIX    BUFFER
  802.         CLR     R20
  803. SDUPD21:LD      DATA,Y+
  804.         ST      X+,DATA
  805.         DEC     R20
  806.         BRNE    SDUPD21
  807.         STS     STEP,ONE
  808.         RJMP    SDUPD40
  809. ;
  810. SDUPD30:LDIY    BUFSECT+384
  811.         LDIX    BUFFER
  812.         LDI     R20,128
  813. SDUPD31:LD      DATA,Y+
  814.         ST      X+,DATA
  815.         DEC     R20
  816.         BRNE    SDUPD31
  817.  
  818.         LDS     DATA,LASTSECFLAG
  819.         TST     DATA
  820.         BREQ    SDUPD_ERR
  821.         RCALL   NEXTSEC
  822.         STS     LASTSECFLAG,DATA
  823.         STS     STEP,NULL
  824.  
  825.         LDIY    BUFSECT
  826.         LDIX    BUFFER+128
  827.         LDI     R20,128
  828. SDUPD32:LD      DATA,Y+
  829.         ST      X+,DATA
  830.         DEC     R20
  831.         BRNE    SDUPD32
  832. ;шьём блок
  833. SDUPD40:POP     COUNT
  834.         POP     BITS
  835.         POPX
  836.         CLR     FF_FL
  837.         RCALL   BLOCK_FLASH
  838.         BRNE    SDUPD11
  839. ;
  840. SDUPD50:
  841.         CLR     ADR1
  842.         CLR     ADR2
  843. SDUPD53:LDI     COUNT,8
  844.         LD      BITS,X+
  845. SDUPD52:LSR     BITS
  846.         BRCS    SDUPD60
  847. ;"пустой" блок
  848.         RCALL   INCEEADR
  849.         BREQ    SDUPD90
  850. SDUPD51:
  851.         DEC     COUNT
  852.         BRNE    SDUPD52
  853.         RJMP    SDUPD53
  854. ;подготавливаем данные
  855. ;если необходимо загружаем с SD
  856. SDUPD60:PUSHX
  857.         PUSH    BITS
  858.         PUSH    COUNT
  859.         LDS     DATA,STEP
  860.         TST     DATA
  861.         BRNE    SDUPD70
  862. ;
  863.         LDIY    BUFSECT+128
  864.         LDIX    BUFFER
  865.         CLR     R20
  866. SDUPD61:LD      DATA,Y+
  867.         ST      X+,DATA
  868.         DEC     R20
  869.         BRNE    SDUPD61
  870.         STS     STEP,ONE
  871.         RJMP    SDUPD80
  872.  
  873. SDUPD70:LDIY    BUFSECT+384
  874.         LDIX    BUFFER
  875.         LDI     R20,128
  876. SDUPD71:LD      DATA,Y+
  877.         ST      X+,DATA
  878.         DEC     R20
  879.         BRNE    SDUPD71
  880.  
  881.         LDS     DATA,LASTSECFLAG
  882.         TST     DATA
  883.         BREQ    SDUPD_ERR1
  884.         RCALL   NEXTSEC
  885.         STS     LASTSECFLAG,DATA
  886.         STS     STEP,NULL
  887.  
  888.         LDIY    BUFSECT
  889.         LDIX    BUFFER+128
  890.         LDI     R20,128
  891. SDUPD72:LD      DATA,Y+
  892.         ST      X+,DATA
  893.         DEC     R20
  894.         BRNE    SDUPD72
  895. ;пишем блок EEPROM
  896. SDUPD80:POP     COUNT
  897.         POP     BITS
  898.         POPX
  899.         RCALL   BLOCK_EEWRITE
  900.         BRNE    SDUPD51
  901.  
  902. SDUPD90:RJMP    CHECKIT ;проверка CRC основной программы и если всё Ok её запуск.
  903. ;
  904. SDUPD_ERR1:
  905.         LDI     DATA,5  ;ошибка в файле (CRC/signature/length)
  906. ;
  907. ;--------------------------------------
  908. ;ошибка при попытке обновления с SD
  909. SD_ERROR:
  910.         STS     SDERROR,DATA
  911.         SDCS_SET
  912.         LDI     TEMP,LOW(RAMEND)
  913.         OUT     SPL,TEMP
  914.         LDI     TEMP,HIGH(RAMEND)
  915.         OUT     SPH,TEMP
  916.  
  917.         RCALL   NEWLINE
  918.         LDIZ    MSG_SDERROR*2
  919.         RCALL   PRINTSTRZ
  920.         LDI     DATA,ANSI_RED
  921.         RCALL   ANSI_COLOR
  922.         LDS     DATA,SDERROR
  923.         CPI     DATA,1
  924.         BRNE    SD_ERR2
  925.         LDIZ    MSG_CARD*2
  926.         RCALL   PRINTSTRZ
  927.         RJMP    SD_NOTFOUND
  928. SD_ERR2:
  929.         CPI     DATA,2
  930.         BRNE    SD_ERR3
  931.         LDIZ    MSG_READERROR*2
  932.         RCALL   PRINTSTRZ
  933.         RJMP    SD_ERR9
  934. SD_ERR3:
  935.         CPI     DATA,3
  936.         BRNE    SD_ERR4
  937.         LDIZ    MSG_FAT*2
  938.         RCALL   PRINTSTRZ
  939.         RJMP    SD_NOTFOUND
  940. SD_ERR4:
  941.         CPI     DATA,4
  942.         BRNE    SD_ERR5
  943.         LDIZ    MSG_FILE*2
  944.         RCALL   PRINTSTRZ
  945. SD_NOTFOUND:
  946.         LDIZ    MSG_NOTFOUND*2
  947.         RCALL   PRINTSTRZ
  948.         RJMP    SD_ERR9
  949. SD_ERR5:
  950.         LDIZ    MSG_WRONGFILE*2
  951.         RCALL   PRINTSTRZ
  952. SD_ERR9:
  953. ;
  954.         LDS     ZL,SDERROR
  955. SD_ERR1:LED_OFF
  956.         LDI     DATA,5
  957.         RCALL   BEEP
  958.         LED_ON
  959.         LDI     DATA,5
  960.         RCALL   DELAY
  961.         DEC     ZL
  962.         BRNE    SD_ERR1
  963. ;обновление по RS-232
  964. ;UART1 Разрешаем приём/передачу
  965.         LDI     TEMP,(1<<RXEN)|(1<<TXEN)
  966.         OUTPORT UCSR1B,TEMP
  967. ;
  968.         RCALL   NEWLINE
  969.         LDIZ    MSG_TRYUPDATE*2
  970.         RCALL   PRINTSTRZ
  971.         LDIZ    MSG__RS232*2
  972.         RCALL   PRINTSTRZ
  973. ;инициируем обмен по протоколу XModem-CRC
  974.         LDI     TEMP,20 ;если в течении ~60 секунд не начнётся обмен - будет перезагрузка бутлоадера (20*timeout=60)
  975. UUPD00: PUSH    TEMP
  976.         LDI     DATA,$43
  977.         LDIY    HEADER
  978.         RCALL   XMODEM_PACKET_RECEIVER
  979.         POP     TEMP
  980.         BRNE    UUPD01
  981.         DEC     TEMP
  982.         BRNE    UUPD00
  983.         RJMP    START8  ;проверка CRC основной программы и если всё Ok её запуск.
  984.  
  985. UUPD01: OR      CRC_LO,CRC_HI
  986.         BREQ    UUPD03
  987. UUPD04:
  988.         LDI     DATA,CAN
  989.         RCALL   WRUART
  990.         RCALL   WRUART
  991.         RCALL   WRUART
  992.         RCALL   WRUART
  993.         RCALL   WRUART
  994.         RCALL   DELAY_3SEC
  995.         LDIZ    MSG_CLRCURRLINE*2
  996.         RCALL   PRINTSTRZ
  997.         RCALL   NEWLINE
  998.         LDI     DATA,ANSI_RED
  999.         RCALL   ANSI_COLOR
  1000.         LDIZ    MSG_WRONGDATA*2
  1001.         RCALL   PRINTSTRZ
  1002.         RCALL   DELAY_3SEC
  1003.         RJMP    START8  ;проверка CRC основной программы и если всё Ok её запуск.
  1004. UUPD03:
  1005.         RCALL   CHECK_SIGNATURE
  1006.         BRNE    UUPD04
  1007. ;-------
  1008.         LDI     XL,LOW(HEADER+$40)
  1009. ;        LDI     XH,HIGH(HEADER+$40)
  1010.         CLR     ADR1
  1011.         CLR     ADR2
  1012. UUPD13: LDI     COUNT,8
  1013.         LD      BITS,X+
  1014. UUPD12: LSR     BITS
  1015.         BRCS    UUPD14
  1016. ;пропускаем "пустой" блок
  1017.         RCALL   INCADR
  1018.         BREQ    UUPD20
  1019. UUPD11: DEC     COUNT
  1020.         BRNE    UUPD12
  1021.         RJMP    UUPD13
  1022. ;загружаем блок
  1023. UUPD14: LDIY    BUFFER
  1024.         LDI     DATA,ACK
  1025. UUPD15: RCALL   XMODEM_PACKET_RECEIVER
  1026.         BRNE    UUPD16
  1027.         CPI     DATA,EOT
  1028.         BREQ    UUPD19
  1029.         LDI     DATA,NAK
  1030.         RJMP    UUPD15
  1031. UUPD16: LDI     DATA,ACK
  1032. UUPD17: RCALL   XMODEM_PACKET_RECEIVER
  1033.         BRNE    UUPD18
  1034.         CPI     DATA,EOT
  1035.         BREQ    UUPD19
  1036.         LDI     DATA,NAK
  1037.         RJMP    UUPD17
  1038.  
  1039. UUPD19: RJMP    UUPD_F3
  1040.  
  1041. ;шьём принятый блок (два XModem-ых пакета по 128 байт)
  1042. UUPD18: CLR     FF_FL
  1043.         RCALL   BLOCK_FLASH
  1044.         BRNE    UUPD11
  1045. ;-------
  1046. UUPD20:
  1047.         LDI     XL,LOW(HEADER+$40)
  1048. ;        LDI     XH,HIGH(HEADER+$40)
  1049.         CLR     ADR1
  1050.         CLR     ADR2
  1051. UUPD23: LDI     COUNT,8
  1052.         LD      BITS,X+
  1053. UUPD22: LSR     BITS
  1054.         BRCC    UUPD24
  1055. ;пропускаем блок
  1056.         RCALL   INCADR
  1057.         BREQ    UUPD30
  1058. UUPD21: DEC     COUNT
  1059.         BRNE    UUPD22
  1060.         RJMP    UUPD23
  1061. ;стираем "пустой" блок
  1062. UUPD24: MOV     FF_FL,FF
  1063.         RCALL   BLOCK_FLASH
  1064.         BRNE    UUPD21
  1065. ;-------
  1066. UUPD30: CLR     ADR1
  1067.         CLR     ADR2
  1068. UUPD33: LDI     COUNT,8
  1069.         LD      BITS,X+
  1070. UUPD32: LSR     BITS
  1071.         BRCS    UUPD34
  1072. ;пропускаем "пустой" блок
  1073.         RCALL   INCEEADR
  1074.         BREQ    UUPD_FINISH
  1075. UUPD31: DEC     COUNT
  1076.         BRNE    UUPD32
  1077.         RJMP    UUPD33
  1078. ;загружаем блок
  1079. UUPD34: LDIY    BUFFER
  1080.         LDI     DATA,ACK
  1081. UUPD35: RCALL   XMODEM_PACKET_RECEIVER
  1082.         BRNE    UUPD36
  1083.         CPI     DATA,EOT
  1084.         BREQ    UUPD39
  1085.         LDI     DATA,NAK
  1086.         RJMP    UUPD35
  1087. UUPD36: LDI     DATA,ACK
  1088. UUPD37: RCALL   XMODEM_PACKET_RECEIVER
  1089.         BRNE    UUPD38
  1090.         CPI     DATA,EOT
  1091.         BREQ    UUPD39
  1092.         LDI     DATA,NAK
  1093.         RJMP    UUPD37
  1094.  
  1095. UUPD39: RJMP    UUPD_F3
  1096.  
  1097. ;пишем в EEPROM принятый блок (два XModem-ых пакета по 128 байт)
  1098. UUPD38: RCALL   BLOCK_EEWRITE
  1099.         BRNE    UUPD31
  1100. ;-------
  1101. UUPD_FINISH:
  1102.         LDI     DATA,ACK
  1103.         RCALL   WRUART
  1104.         RCALL   RDUART
  1105. UUPD_F3:CPI     DATA,EOT ; обязательно должно придти EOT
  1106.         LDI     DATA,ACK
  1107.         BREQ    UUPD_F1
  1108. UUPD_F2:LDI     DATA,CAN
  1109.         RCALL   WRUART
  1110.         RCALL   WRUART
  1111.         RCALL   WRUART
  1112.         RCALL   WRUART
  1113. UUPD_F1:RCALL   WRUART
  1114.         RCALL   DELAY_3SEC
  1115.         LDIZ    MSG_CLRCURRLINE*2
  1116.         RCALL   PRINTSTRZ
  1117.         RJMP    CHECKIT ;проверка CRC основной программы и если всё Ok её запуск.
  1118. ;
  1119. ;--------------------------------------
  1120. ;XMODEM_PACKET_RECEIVER
  1121. ;in:    DATA == <C>, <NAK> или <ACK>
  1122. ;       Y == указатель на буфер
  1123. ;out:   sreg.Z == SET - timeout (Y без изменений)
  1124. ;                 CLR - Ok! (Y=+128)
  1125. XMRXERR:SUBI    YL,128
  1126.         SBC     YH,NULL
  1127.         LDI     DATA,NAK
  1128. ;
  1129. XMODEM_PACKET_RECEIVER:
  1130.         RCALL   WRUART
  1131.         LDI     TEMP,6 ;таймаут 3 сек.
  1132.  
  1133. XMRX3:  LED_OFF
  1134.         SBRC    TEMP,0
  1135.         LED_ON  ;мигать при ожидании
  1136.  
  1137.         LDI     R20,$00 ;\
  1138.         LDI     R21,$70 ; > ~0,5 сек
  1139.         LDI     ZL,$05  ;/
  1140. XMRX1:  SUBI    R20,1
  1141.         SBCI    R21,0
  1142.         SBCI    ZL,0
  1143.         BRNE    XMRX2
  1144.         DEC     TEMP
  1145.         BRNE    XMRX3
  1146.         CLR     DATA
  1147. XMRX9:  RET
  1148.  
  1149. XMRX2:  RCALL   INUART
  1150.         BREQ    XMRX1
  1151.         CPI     DATA,EOT
  1152.         BREQ    XMRX9
  1153.         CPI     DATA,SOH
  1154.         BRNE    XMRX1
  1155.  
  1156.         LED_OFF
  1157.         SBRS    ADR1,1
  1158.         LED_ON
  1159.  
  1160.         RCALL   RDUART  ;block num
  1161.         RCALL   RDUART  ;block num (inverted)
  1162.         CLR     CRC_LO
  1163.         CLR     CRC_HI
  1164.         LDI     R20,128
  1165. XMRX4:  RCALL   RDUART
  1166.         ST      Y+,DATA
  1167.         RCALL   CRC_UPDATE
  1168.         DEC     R20
  1169.         BRNE    XMRX4
  1170.  
  1171.         RCALL   RDUART
  1172.         MOV     TEMP,DATA
  1173.         RCALL   RDUART
  1174.         CP      DATA,CRC_LO
  1175.         BRNE    XMRXERR
  1176.         CP      TEMP,CRC_HI
  1177.         BRNE    XMRXERR
  1178.         CLZ
  1179.         RET
  1180. ;
  1181. ;--------------------------------------
  1182. ;
  1183. CHECK_SIGNATURE:
  1184.         LDIZ    SIGNATURE*2
  1185.         OUT     RAMPZ,ONE
  1186.         LDIX    HEADER
  1187. CHKSIG1:ELPM    DATA,Z+
  1188.         LD      TEMP,X+
  1189.         CP      DATA,TEMP
  1190.         BRNE    CHKSIG9
  1191.         CPI     DATA,$1A
  1192.         BRNE    CHKSIG1
  1193. CHKSIG9:RET
  1194. ;
  1195. ;======================================
  1196. ;out:   DATA
  1197. SD_RECEIVE:
  1198.         SER     DATA
  1199. ; - - - - - - - - - - - - - - - - - - -
  1200. ;in:    DATA
  1201. ;out:   DATA
  1202. SD_EXCHANGE:
  1203.         OUT     SPDR,DATA
  1204. SDEXCH: SBIS    SPSR,SPIF
  1205.         RJMP    SDEXCH
  1206.         IN      DATA,SPDR
  1207.         RET
  1208. ;
  1209. ;--------------------------------------
  1210. ;in;    TEMP - n
  1211. SD_RD_DUMMY:
  1212.         SER     DATA
  1213.         RCALL   SD_EXCHANGE
  1214.         DEC     TEMP
  1215.         BRNE    SD_RD_DUMMY
  1216.         RET
  1217. ;
  1218. ;--------------------------------------
  1219. ;in:    DATA
  1220. SD_WR_CMD:
  1221.         PUSH    DATA
  1222.         LDI     TEMP,2
  1223.         RCALL   SD_RD_DUMMY
  1224.         POP     DATA
  1225.         RCALL   SD_EXCHANGE
  1226.         CLR     DATA
  1227.         RCALL   SD_EXCHANGE
  1228. SD_WR_CMX4:
  1229.         CLR     DATA
  1230.         RCALL   SD_EXCHANGE
  1231.         CLR     DATA
  1232.         RCALL   SD_EXCHANGE
  1233.         CLR     DATA
  1234.         RCALL   SD_EXCHANGE
  1235.         SER     DATA
  1236.         RCALL   SD_EXCHANGE
  1237.         RJMP    SD_WAIT_NOTFF
  1238. ;
  1239. ;--------------------------------------
  1240. ;in:    Z
  1241. SD_WR_PGM_6:
  1242.         LDI     TEMP,2
  1243.         RCALL   SD_RD_DUMMY
  1244.         LDI     TEMP,6
  1245. SD_WR_PGX:
  1246.         OUT     RAMPZ,ONE
  1247. SDWRP61:ELPM    DATA,Z+
  1248.         RCALL   SD_EXCHANGE
  1249.         DEC     TEMP
  1250.         BRNE    SDWRP61
  1251. ; - - - - - - - - - - - - - - - - - - -
  1252. ;out:   DATA
  1253. SD_WAIT_NOTFF:
  1254.         LDI     TEMP,255
  1255. SDWNFF2:SER     DATA
  1256.         RCALL   SD_EXCHANGE
  1257.         CPI     DATA,$FF
  1258.         BRNE    SDWNFF1
  1259.         DEC     TEMP
  1260.         BRNE    SDWNFF2
  1261. SDWNFF1:RET
  1262. ;
  1263. ;--------------------------------------
  1264. ;in:    Z - куда
  1265. ;       Y,X - №сектора
  1266. SD_READ_SECTOR:
  1267.         SDCS_CLR
  1268.  
  1269.         PUSHZ
  1270.         LDS     DATA,SDHC
  1271.         SBRC    DATA,6
  1272.         RJMP    SDRDSE1
  1273.         LSL     XL
  1274.         ROL     XH
  1275.         ROL     YL
  1276.         MOV     YH,YL
  1277.         MOV     YL,XH
  1278.         MOV     XH,XL
  1279.         CLR     XL
  1280. SDRDSE1:
  1281.         LDI     TEMP,3+2
  1282.         RCALL   SD_RD_DUMMY
  1283.  
  1284.         LDI     DATA,CMD_17
  1285.         RCALL   SD_EXCHANGE
  1286.         MOV     DATA,YH
  1287.         RCALL   SD_EXCHANGE
  1288.         MOV     DATA,YL
  1289.         RCALL   SD_EXCHANGE
  1290.         MOV     DATA,XH
  1291.         RCALL   SD_EXCHANGE
  1292.         MOV     DATA,XL
  1293.         RCALL   SD_EXCHANGE
  1294.         SER     DATA
  1295.         RCALL   SD_EXCHANGE
  1296.  
  1297.         SER     R24
  1298. SDRDSE2:RCALL   SD_WAIT_NOTFF
  1299.         DEC     R24
  1300.         BREQ    SDRDSE8
  1301.         CPI     DATA,$FE
  1302.         BRNE    SDRDSE2
  1303.  
  1304.         POPZ
  1305.         LDI     R24,$00
  1306.         LDI     R25,$02
  1307. SDRDSE3:RCALL   SD_RECEIVE
  1308.         ST      Z+,DATA
  1309.         SBIW    R24,1
  1310.         BRNE    SDRDSE3
  1311.  
  1312.         LDI     TEMP,2+2
  1313.         RCALL   SD_RD_DUMMY
  1314. ;SDRDSE4:RCALL   SD_WAIT_NOTFF
  1315. ;        CPI     DATA,$FF
  1316. ;        BRNE    SDRDSE4
  1317.  
  1318.         SDCS_SET
  1319.         RET
  1320.  
  1321. SDRDSE8:LDI     DATA,2  ;ошибка при чтении сектора
  1322.         RJMP    SD_ERROR
  1323. ;
  1324. ;--------------------------------------
  1325. ;
  1326. SD_CRC_OFF:
  1327.         LDI     DATA,$40+59 ;CMD59 (crc_on_off)
  1328.         RCALL   SD_WR_CMD
  1329.         TST     DATA
  1330.         BRNE    SD_CRC_OFF
  1331. ;        RET
  1332. SD_SETBLKLEN:
  1333.         LDIZ    CMD16*2     ;CMD16 (set_blocklen)
  1334.         RCALL   SD_WR_PGM_6
  1335.         TST     DATA
  1336.         BRNE    SD_SETBLKLEN
  1337.         RET
  1338. ;
  1339. ;--------------------------------------
  1340. ;out:   sreg.Z  SET==signature exist
  1341. ;       Z==BUF4FAT+$01FF
  1342. FAT_CHKSIGN:
  1343.         LDIZ    BUF4FAT+$01FE
  1344.         LD      DATA,Z+
  1345.         CPI     DATA,$55
  1346.         LD      DATA,Z
  1347.         BRNE    FAT_CHKSIG9
  1348.         CPI     DATA,$AA
  1349. FAT_CHKSIG9:
  1350.         RET
  1351. ;
  1352. ;--------------------------------------
  1353. ;чтение сектора данных
  1354. LOAD_DATA:
  1355.         LDIZ    BUFSECT
  1356.         RCALL   SD_READ_SECTOR  ;читать один сектор
  1357.         RET
  1358. ;
  1359. ;--------------------------------------
  1360. ;чтение сектора служ.инф. (FAT/DIR/...)
  1361. LOADLST:LDIZ    BUF4FAT
  1362.         RCALL   SD_READ_SECTOR  ;читать один сектор
  1363.         LDIZ    BUF4FAT
  1364.         RET
  1365. ;
  1366. ;--------------------------------------
  1367. ;чтение сектора dir по номеру описателя (Y)
  1368. ;на выходе: DATA=#ff (sreg.Z=0) выход за пределы dir
  1369. RDDIRSC:PUSHY
  1370.         MOVW    XL,YL
  1371.         LDIY    0
  1372.         LDI     DATA,$10
  1373.         RCALL   BCDE_A
  1374.         PUSH    XL
  1375.         LDS     DATA,BYTSSEC
  1376.         PUSH    DATA
  1377.         RCALL   BCDE_A
  1378.         LDS     DATA,KCLSDIR
  1379.         DEC     DATA
  1380.         CP      DATA,XL
  1381.         BRCC    RDDIRS3
  1382.         POP     YL
  1383.         POP     YL
  1384.         POPY
  1385.         SER     DATA
  1386.         TST     DATA
  1387.         RET
  1388. RDDIRS3:LDSY    TEK_DIR+2
  1389.         MOV     DATA,XL
  1390.         TST     DATA
  1391.         LDSX    TEK_DIR+0
  1392.         BREQ    RDDIRS1
  1393. RDDIRS2:PUSH    DATA
  1394.         RCALL   RDFATZP
  1395.         POP     DATA
  1396.         DEC     DATA
  1397.         BRNE    RDDIRS2
  1398. RDDIRS1:RCALL   REALSEC
  1399.         POP     R0
  1400.         DEC     R0
  1401.         POP     DATA
  1402.         AND     DATA,R0
  1403.         ADD     XL,DATA
  1404.         ADC     XH,NULL
  1405.         ADC     YL,NULL
  1406.         ADC     YH,NULL
  1407.         RCALL   LOADLST
  1408.         POPY
  1409.         CLR     DATA
  1410.         RET
  1411. ;
  1412. ;--------------------------------------
  1413. ;out:   sreg.C == CLR - EOCmark
  1414. ;(chng: TEMP)
  1415. LST_CLS:LDI     TEMP,$0F
  1416.         LDS     DATA,CAL_FAT
  1417.         TST     DATA
  1418.         BRNE    LST_CL1
  1419.         CPI     XL,$F7
  1420.         CPC     XH,TEMP
  1421.         RET
  1422. LST_CL1:DEC     DATA
  1423.         BRNE    LST_CL2
  1424.         CPI     XL,$F7
  1425.         CPC     XH,FF
  1426.         RET
  1427. LST_CL2:CPI     XL,$F7
  1428.         CPC     XH,FF
  1429.         CPC     YL,FF
  1430.         CPC     YH,TEMP
  1431.         RET
  1432. ;
  1433. ;--------------------------------------
  1434. ;
  1435. RDFATZP:LDS     DATA,CAL_FAT
  1436.         TST     DATA
  1437.         BREQ    RDFATS0         ;FAT12
  1438.         DEC     DATA
  1439.         BREQ    RDFATS1         ;FAT16
  1440. ;FAT32
  1441.         LSL     XL
  1442.         ROL     XH
  1443.         ROL     YL
  1444.         ROL     YH
  1445.         MOV     DATA,XL
  1446.         MOV     XL,XH
  1447.         MOV     XH,YL
  1448.         MOV     YL,YH
  1449.         CLR     YH
  1450.         RCALL   RDFATS2
  1451.         ADIW    ZL,1
  1452.         LD      YL,Z+
  1453.         LD      YH,Z
  1454.         ANDI    YH,$0F  ;
  1455.         RET
  1456. ;FAT16
  1457. RDFATS1:LDIY    0
  1458.         MOV     DATA,XL
  1459.         MOV     XL,XH
  1460.         CLR     XH
  1461. RDFATS2:PUSH    DATA
  1462.         PUSHY
  1463.         LDIZ    FATSTR0
  1464.         RCALL   BCDEHLP
  1465.         RCALL   LOADLST
  1466.         POPY
  1467.         POP     DATA
  1468.         ADD     ZL,DATA
  1469.         ADC     ZH,NULL
  1470.         ADD     ZL,DATA
  1471.         ADC     ZH,NULL
  1472.         LD      XL,Z+
  1473.         LD      XH,Z
  1474.         RET
  1475. ;FAT12
  1476. RDFATS0:MOVW    ZL,XL
  1477.         LSL     ZL
  1478.         ROL     ZH
  1479.         ADD     ZL,XL
  1480.         ADC     ZH,XH
  1481.         LSR     ZH
  1482.         ROR     ZL
  1483.         MOV     DATA,XL
  1484.         MOV     XL,ZH
  1485.         CLR     XH
  1486.         CLR     YL
  1487.         CLR     YH
  1488.         LSR     XL
  1489.         PUSH    DATA
  1490.         PUSHZ
  1491.         LDIZ    FATSTR0
  1492.         RCALL   BCDEHLP
  1493.         PUSHX
  1494.         RCALL   LOADLST
  1495.         POPX
  1496.         POPY
  1497.         ANDI    YH,$01
  1498.         ADD     ZL,YL
  1499.         ADC     ZH,YH
  1500.         LD      YL,Z+
  1501.         CPI     ZH,HIGH(BUF4FAT+512)
  1502.         BRNE    RDFATS4
  1503.         PUSH    YL
  1504.         LDIY    0
  1505.         ADIW    XL,1
  1506.         RCALL   LOADLST
  1507.         POP     YL
  1508. RDFATS4:POP     DATA
  1509.         LD      XH,Z
  1510.         MOV     XL,YL
  1511.         LDIY    0
  1512.         LSR     DATA
  1513.         BRCC    RDFATS3
  1514.         LSR     XH
  1515.         ROR     XL
  1516.         LSR     XH
  1517.         ROR     XL
  1518.         LSR     XH
  1519.         ROR     XL
  1520.         LSR     XH
  1521.         ROR     XL
  1522. RDFATS3:ANDI    XH,$0F
  1523.         RET
  1524. ;
  1525. ;--------------------------------------
  1526. ;вычисление реального сектора
  1527. ;на входе YX==номер FAT
  1528. ;на выходе YX==адрес сектора
  1529. REALSEC:MOV     DATA,YH
  1530.         OR      DATA,YL
  1531.         OR      DATA,XH
  1532.         OR      DATA,XL
  1533.         BRNE    REALSE1
  1534.         LDIZ    FATSTR1
  1535.         LDSX    SEC_FAT+0
  1536.         LDSY    SEC_FAT+2
  1537.         RJMP    BCDEHLP
  1538. REALSE1:SBIW    XL,2            ;номер кластера-2
  1539.         SBC     YL,NULL
  1540.         SBC     YH,NULL
  1541.         LDS     DATA,BYTSSEC
  1542.         RJMP    REALSE2
  1543. REALSE3:LSL     XL
  1544.         ROL     XH
  1545.         ROL     YL
  1546.         ROL     YH
  1547. REALSE2:LSR     DATA
  1548.         BRCC    REALSE3
  1549.                                 ;умножили на размер кластера
  1550.         LDIZ    STARTRZ
  1551.         RCALL   BCDEHLP         ;прибавили смещение от начала диска
  1552.         LDIZ    FRSTDAT
  1553.         RJMP    BCDEHLP         ;прибавили смещение от начала раздела
  1554. ;
  1555. ;--------------------------------------
  1556. ;YX>>9 (деление на 512)
  1557. BCDE200:MOV     XL,XH
  1558.         MOV     XH,YL
  1559.         MOV     YL,YH
  1560.         LDI     YH,0
  1561.         LDI     DATA,1
  1562. ; - - - - - - - - - - - - - - - - - - -
  1563. ;YXDATA>>до"переноса"
  1564. ;если в DATA вкл.только один бит, то получается
  1565. ;YX=YX/DATA
  1566. BCDE_A1:LSR     YH
  1567.         ROR     YL
  1568.         ROR     XH
  1569.         ROR     XL
  1570. BCDE_A: ROR     DATA
  1571.         BRCC    BCDE_A1
  1572.         RET
  1573. ;
  1574. ;--------------------------------------
  1575. ;YX=[Z]-YX
  1576. BCDEHLM:LD      DATA,Z+
  1577.         SUB     DATA,XL
  1578.         MOV     XL,DATA
  1579.         LD      DATA,Z+
  1580.         SBC     DATA,XH
  1581.         MOV     XH,DATA
  1582.         LD      DATA,Z+
  1583.         SBC     DATA,YL
  1584.         MOV     YL,DATA
  1585.         LD      DATA,Z
  1586.         SBC     DATA,YH
  1587.         MOV     YH,DATA
  1588.         RET
  1589. ;
  1590. ;--------------------------------------
  1591. ;YX=YX+[Z]
  1592. BCDEHLP:LD      DATA,Z+
  1593.         ADD     XL,DATA
  1594.         LD      DATA,Z+
  1595.         ADC     XH,DATA
  1596.         LD      DATA,Z+
  1597.         ADC     YL,DATA
  1598.         LD      DATA,Z
  1599.         ADC     YH,DATA
  1600.         RET
  1601. ;
  1602. ;--------------------------------------
  1603. ;YX=YX+R25R24
  1604. HLDEPBC:ADD     XL,R24
  1605.         ADC     XH,R25
  1606.         ADC     YL,NULL
  1607.         ADC     YH,NULL
  1608.         RET
  1609. ;
  1610. ;--------------------------------------
  1611. ;
  1612. RASCHET:RCALL   BCDE200
  1613.         LDIZ    SEC_FAT
  1614.         RCALL   BCDEHLM
  1615.         MOV     DATA,XL
  1616.         ANDI    DATA,$F0
  1617.         OR      DATA,XH
  1618.         OR      DATA,YL
  1619.         OR      DATA,YH
  1620.         RET
  1621. ;
  1622. ;--------------------------------------
  1623. ;чтение очередного сектора файла в BUFSECT
  1624. ;out:   DATA == 0 - считан последний сектор файла
  1625. NEXTSEC:LDIZ    KOL_CLS
  1626.         LD      DATA,Z+
  1627.         LD      TEMP,Z+
  1628.         OR      DATA,TEMP
  1629.         LD      TEMP,Z+
  1630.         OR      DATA,TEMP
  1631.         LD      TEMP,Z+
  1632.         OR      DATA,TEMP
  1633.         BREQ    LSTCLSF
  1634.         LDSX    TFILCLS+0
  1635.         LDSY    TFILCLS+2
  1636.         RCALL   REALSEC
  1637.         LDS     DATA,NUMSECK
  1638.         ADD     XL,DATA
  1639.         ADC     XH,NULL
  1640.         ADC     YL,NULL
  1641.         ADC     YH,NULL
  1642.         RCALL   LOAD_DATA
  1643.         LDSX    TFILCLS+0
  1644.         LDSY    TFILCLS+2
  1645.         LDS     DATA,NUMSECK
  1646.         INC     DATA
  1647.         STS     NUMSECK,DATA
  1648.         LDS     TEMP,BYTSSEC
  1649.         CP      TEMP,DATA
  1650.         BRNE    NEXT_OK
  1651.  
  1652.         STS     NUMSECK,NULL
  1653.         RCALL   RDFATZP
  1654.         STSX    TFILCLS+0
  1655.         STSY    TFILCLS+2
  1656.         LDIZ    KOL_CLS
  1657.         LD      DATA,Z
  1658.         SUBI    DATA,1
  1659.         ST      Z+,DATA
  1660.         LD      DATA,Z
  1661.         SBC     DATA,NULL
  1662.         ST      Z+,DATA
  1663.         LD      DATA,Z
  1664.         SBC     DATA,NULL
  1665.         ST      Z+,DATA
  1666.         LD      DATA,Z
  1667.         SBC     DATA,NULL
  1668.         ST      Z+,DATA
  1669. NEXT_OK:SER     DATA
  1670.         RET
  1671.  
  1672. LSTCLSF:LDSX    TFILCLS+0
  1673.         LDSY    TFILCLS+2
  1674.         RCALL   REALSEC
  1675.         LDS     DATA,NUMSECK
  1676.         ADD     XL,DATA
  1677.         ADC     XH,NULL
  1678.         ADC     YL,NULL
  1679.         ADC     YH,NULL
  1680.         RCALL   LOAD_DATA
  1681.         LDS     DATA,NUMSECK
  1682.         INC     DATA
  1683.         STS     NUMSECK,DATA
  1684.         LDS     TEMP,MPHWOST
  1685.         SUB     DATA,TEMP
  1686.         RET
  1687. ;
  1688. ;======================================
  1689. ;
  1690. PRINTVERS:
  1691.         LDI     DATA,ANSI_GREEN
  1692.         RCALL   ANSI_COLOR
  1693.         LDI     COUNT,12
  1694. PRVERS2:ELPM    DATA,Z+
  1695.         TST     DATA
  1696.         BREQ    PRVERS1
  1697.         BRMI    PRVERS1
  1698.         RCALL   WRUART
  1699.         DEC     COUNT
  1700.         BRNE    PRVERS2
  1701. PRVERS1:LDI     DATA,$20
  1702.         RCALL   WRUART
  1703.         LDI     ZL,$FC
  1704.         ELPM    XL,Z+
  1705.         ELPM    XH,Z+
  1706.         MOV     DATA,XL
  1707.         ANDI    DATA,$1F
  1708.         BREQ    PRVERS9
  1709.         MOV     TEMP,XH
  1710.         LSL     XL
  1711.         ROL     TEMP
  1712.         LSL     XL
  1713.         ROL     TEMP
  1714.         LSL     XL
  1715.         ROL     TEMP
  1716.         ANDI    TEMP,$0F
  1717.         BREQ    PRVERS9
  1718.         CPI     TEMP,13
  1719.         BRCC    PRVERS9
  1720.         MOV     COUNT,XH
  1721.         LSR     COUNT
  1722.         ANDI    COUNT,$3F
  1723.         CPI     COUNT,9
  1724.         BRCS    PRVERS9
  1725.         RCALL   DECBYTE
  1726.         LDI     DATA,$2E
  1727.         RCALL   WRUART
  1728.         MOV     DATA,TEMP
  1729.         RCALL   DECBYTE
  1730.         LDI     DATA,$2E
  1731.         RCALL   WRUART
  1732.         LDI     DATA,$20
  1733.         RCALL   HEXBYTE
  1734.         MOV     DATA,COUNT
  1735.         RCALL   DECBYTE
  1736.         SBRC    XH,7
  1737. PRVERS9:RET
  1738. ;
  1739. ;--------------------------------------
  1740. ;
  1741. BETA:   LDIZ    MSG_BETA*2
  1742.         RJMP    PRINTSTRZ
  1743. ;
  1744. ;--------------------------------------
  1745. ;
  1746. ANSI_COLOR:
  1747.         PUSH    DATA
  1748.         LDI     DATA,$1B
  1749.         RCALL   WRUART
  1750.         LDI     DATA,$5B
  1751.         RCALL   WRUART
  1752.         POP     DATA
  1753.         RCALL   HEXBYTE
  1754.         LDI     DATA,$6D
  1755.         RJMP    WRUART
  1756. ;
  1757. ;--------------------------------------
  1758. ;
  1759. NEWLINE2:
  1760.         LDIZ    MSG_NEWLINE2*2
  1761.         RJMP    PRINTSTRZ
  1762. ;
  1763. NEWLINE:LDIZ    MSG_NEWLINE*2
  1764. ;
  1765. ; - - - - - - - - - - - - - - - - - - -
  1766. ;in:    Z == указательна строку (в старших 64K)
  1767. PRINTSTRZ:
  1768.         OUT     RAMPZ,ONE
  1769. PRSTRZ1:ELPM    DATA,Z+
  1770.         TST     DATA
  1771.         BREQ    PRSTRZ2
  1772.         RCALL   WRUART
  1773.         RJMP    PRSTRZ1
  1774. PRSTRZ2:RET
  1775. ;
  1776. ;--------------------------------------
  1777. ;byte in dec to uart
  1778. ;in:    DATA == byte (0..99)
  1779. DECBYTE:SUBI    DATA,208
  1780.         SBRS    DATA,7
  1781.         SUBI    DATA,48
  1782.         SUBI    DATA,232
  1783.         SBRS    DATA,6
  1784.         SUBI    DATA,24
  1785.         SUBI    DATA,244
  1786.         SBRS    DATA,5
  1787.         SUBI    DATA,12
  1788.         SUBI    DATA,250
  1789.         SBRS    DATA,4
  1790.         SUBI    DATA,6
  1791. ;
  1792. ; - - - - - - - - - - - - - - - - - - -
  1793. ;byte in hex to uart
  1794. ;in:    DATA == byte
  1795. HEXBYTE:PUSH    DATA
  1796.         SWAP    DATA
  1797.         RCALL   HEXHALF
  1798.         POP     DATA
  1799. HEXHALF:ANDI    DATA,$0F
  1800.         CPI     DATA,$0A
  1801.         BRCS    HEXBYT1
  1802.         ADDI    DATA,$07
  1803. HEXBYT1:ADDI    DATA,$30
  1804. ;
  1805. ; - - - - - - - - - - - - - - - - - - -
  1806. ;in:    DATA == передаваемый байт
  1807. WRUART: PUSH    TEMP
  1808. WRU_1:  INPORT  TEMP,UCSR1A
  1809.         SBRS    TEMP,UDRE
  1810.         RJMP    WRU_1
  1811.         OUTPORT UDR1,DATA
  1812.         POP     TEMP
  1813.         RET
  1814. ;
  1815. ;--------------------------------------
  1816. ;out:   DATA == принятый байт
  1817. RDUART: INPORT  DATA,UCSR1A
  1818.         SBRS    DATA,RXC
  1819.         RJMP    RDUART
  1820.         INPORT  DATA,UDR1
  1821.         RET
  1822. ;
  1823. ;--------------------------------------
  1824. ;out:   sreg.Z == CLR - есть данные (DATA == принятый байт)
  1825. ;                 SET - нет данных
  1826. INUART: INPORT  DATA,UCSR1A
  1827.         SBRS    DATA,RXC
  1828.         RJMP    INU9
  1829.         INPORT  DATA,UDR1
  1830.         CLZ
  1831. INU9:   RET
  1832. ;
  1833. ;--------------------------------------
  1834. ;in:    DATA == продолжительность *0.1 сек
  1835. BEEP:   OUT     SPCR,NULL       ;SPI off
  1836. BEE2:   LDI     TEMP,100;100 периодов 1кГц
  1837. BEE1:   SBI     DDRE,6
  1838.         CBI     PORTE,6
  1839.         RCALL   BEEPDLY
  1840.         CBI     DDRE,6
  1841.         SBI     PORTE,6
  1842.         RCALL   BEEPDLY
  1843.         DEC     TEMP
  1844.         BRNE    BEE1
  1845.         DEC     DATA
  1846.         BRNE    BEE2
  1847.         RET
  1848.  
  1849. BEEPDLY:LDI     R24,$64
  1850.         LDI     R25,$05
  1851. BEEPDL1:SBIW    R24,1
  1852.         BRNE    BEEPDL1
  1853.         RET
  1854. ;
  1855. ;--------------------------------------
  1856. ;
  1857. DELAY_3SEC:
  1858.         LDI     DATA,30
  1859. ; - - - - - - - - - - - - - - - - - - -
  1860. ;in:    DATA == продолжительность *0.1 сек
  1861. DELAY:
  1862.         LDI     R20,$1E ;\
  1863.         LDI     R21,$FE ;/ 0,1 сек @ 11.0592MHz
  1864. DELAY1: LPM             ;3
  1865.         LPM             ;3
  1866.         LPM             ;3
  1867.         LPM             ;3
  1868.         SUBI    R20,1   ;1
  1869.         SBCI    R21,0   ;1
  1870.         SBCI    DATA,0  ;1
  1871.         BRNE    DELAY1  ;2(1)
  1872.         RET
  1873. ;
  1874. ;--------------------------------------
  1875. ;проверка CRC осн.программы
  1876. CRCMAIN:LDIZ    $0000                           ;адрес в байтах
  1877.         OUT     RAMPZ,NULL
  1878.         LDIY    FLASHSIZE<<7                    ;длина в словах
  1879. ; - - - - - - - - - - - - - - - - - - -
  1880. ;in:    Z == адрес в байтах
  1881. ;       Y == кол-во слов
  1882. ;out:   sreg.Z == SET - crc ok!
  1883. CALK_CRC_FLASH:
  1884.         MOV     CRC_LO,FF
  1885.         MOV     CRC_HI,FF
  1886. CCRCFL1:ELPM    DATA,Z+
  1887.         RCALL   CRC_UPDATE
  1888.         ELPM    DATA,Z+
  1889.         RCALL   CRC_UPDATE
  1890.  
  1891.         LED_OFF
  1892.         SBRS    ZH,5
  1893.         LED_ON  ;мигать при подсчёте CRC
  1894.  
  1895.         SBIW    YL,1
  1896.         BRNE    CCRCFL1
  1897.         OR      CRC_LO,CRC_HI
  1898.         RET
  1899. ;
  1900. ;--------------------------------------
  1901. ;in:    DATA - byte
  1902. ;       CRC_LO,CRC_HI
  1903. ;out:   CRC_LO,CRC_HI
  1904. ;cng:   TEMP
  1905. CRC_UPDATE:
  1906.         EOR     CRC_HI,DATA
  1907.         LDI     TEMP,8
  1908. CRC_UP2:LSL     CRC_LO
  1909.         ROL     CRC_HI
  1910.         BRCC    CRC_UP1
  1911.         EOR     CRC_LO,POLY_LO
  1912.         EOR     CRC_HI,POLY_HI
  1913. CRC_UP1:DEC     TEMP
  1914.         BRNE    CRC_UP2
  1915.         RET
  1916. ;
  1917. ;--------------------------------------
  1918. ;in:    [BUFFER] == data
  1919. ;       ADR1 == mid address
  1920. ;       ADR2 == high address
  1921. ;       FF_FL == $FF - erase only
  1922. ;out:   sreg.Z == SET - это был последний блок (выше по адресам обновлять запрещено!)
  1923. ;       ADR1 == mid address
  1924. ;       ADR2 == high address
  1925. BLOCK_FLASH:
  1926.         CLR     ZL
  1927.         MOV     ZH,ADR1
  1928.         OUT     RAMPZ,ADR2
  1929.         LDI     GUARD,$A5
  1930.         LDI     DATA,(1<<PGERS)|(1<<SPMEN) ;page erase
  1931.         RCALL   DO_SPM
  1932.  
  1933.         INC     FF_FL
  1934.         BREQ    BLKFL1
  1935.  
  1936.         CLR     ZL
  1937.         MOV     ZH,ADR1
  1938.         OUT     RAMPZ,ADR2
  1939.         LDIY    BUFFER
  1940.         LDI     TEMP,$80
  1941. BLKFL2: LD      R0,Y+
  1942.         LD      R1,Y+
  1943.         LDI     DATA,(1<<SPMEN) ;transfer data from RAM to Flash page buffer
  1944.         RCALL   DO_SPM
  1945.         ADIW    ZL,2
  1946.         DEC     TEMP
  1947.         BRNE    BLKFL2
  1948.  
  1949.         CLR     ZL
  1950.         MOV     ZH,ADR1
  1951.         OUT     RAMPZ,ADR2
  1952.         LDI     DATA,(1<<PGWRT)|(1<<SPMEN)  ;execute page write
  1953.         RCALL   DO_SPM
  1954. BLKFL1:
  1955.         LDI     DATA,(1<<RWWSRE)|(1<<SPMEN) ;re-enable the RWW section
  1956.         RCALL   DO_SPM
  1957.         LDI     GUARD,$5A
  1958.  
  1959.         TST     FF_FL
  1960.         BREQ    INCADR
  1961.  
  1962.         LDIY    BUFFER
  1963.         CLR     ZL
  1964.         MOV     ZH,ADR1
  1965.         OUT     RAMPZ,ADR2
  1966.         CLR     R20
  1967. BLKFL3: ELPM    DATA,Z+
  1968.         LD      TEMP,Y+
  1969.         CP      DATA,TEMP
  1970.         BRNE    FLASH_ERROR
  1971.         DEC     R20
  1972.         BRNE    BLKFL3
  1973. ;
  1974. ;--------------------------------------
  1975. ;out:   sreg.Z == SET - это был последний блок (выше по адресам обновлять запрещено!)
  1976. ;chng:  TEMP
  1977. INCADR:
  1978.         ADD     ADR1,ONE
  1979.         ADC     ADR2,NULL
  1980.         MOV     TEMP,ADR2
  1981.         CPI     TEMP,HIGH(FLASHSIZE)
  1982.         BRNE    INCADR9
  1983.         MOV     TEMP,ADR1
  1984.         CPI     TEMP,LOW(FLASHSIZE)
  1985. INCADR9:RET
  1986. ;
  1987. ;--------------------------------------
  1988. ;in:    [BUFFER] == data
  1989. ;       ADR1 == low address
  1990. ;       ADR2 == high address
  1991. ;out:   sreg.Z == SET - это был последний блок (выше по адресам обновлять запрещено!)
  1992. ;       ADR1 == low address
  1993. ;       ADR2 == high address
  1994. BLOCK_EEWRITE:
  1995.         LDIY    BUFFER
  1996.         LDI     GUARD,$A5
  1997.  
  1998. WEEWE:  SBIC    EECR,EEWE
  1999.         RJMP    WEEWE
  2000. WSPMEN: LDS     TEMP,SPMCSR
  2001.         SBRC    TEMP,SPMEN
  2002.         RJMP    WSPMEN
  2003.         OUT     EEARH,ADR2
  2004.         OUT     EEARL,ADR1
  2005.         LD      DATA,Y+
  2006.         OUT     EEDR,DATA
  2007.         CPI     GUARD,$A5
  2008.         BRNE    CRITICAL_ERROR
  2009.         SBI     EECR,EEMWE
  2010.         SBI     EECR,EEWE
  2011.  
  2012.         LED_OFF
  2013.         SBRS    ADR1,4
  2014.         LED_ON  ;мигать при записи EEPROM
  2015.  
  2016.         INC     ADR1
  2017.         BRNE    WEEWE
  2018.         LDI     GUARD,$5A
  2019. ;
  2020. ;--------------------------------------
  2021. ;out:   sreg.Z == SET - это был последний блок (выше по адресам обновлять запрещено!)
  2022. ;chng:  TEMP
  2023. INCEEADR:
  2024.         ADD     ADR2,ONE
  2025.         MOV     TEMP,ADR2
  2026.         CPI     TEMP,HIGH(4096)
  2027.         RET
  2028. ;
  2029. ;--------------------------------------
  2030. ;
  2031. FLASH_ERROR:
  2032.         LDI     DATA,30
  2033.         RCALL   BEEP
  2034. CRITICAL_ERROR:
  2035.         RJMP    START1
  2036. ;
  2037. ;--------------------------------------
  2038. ;in:    DATA == значение для SPMCSR
  2039. DO_SPM: PUSH    TEMP
  2040. WAIT1SPM:                       ; check for previous SPM complete
  2041.         INPORT  TEMP,SPMCSR
  2042.         SBRC    TEMP,SPMEN
  2043.         RJMP    WAIT1SPM
  2044.         CLI
  2045. WAIT_EE:SBIC    EECR,EEWE       ; check that no EEPROM write access is present
  2046.         RJMP    WAIT_EE
  2047.         OUTPORT SPMCSR,DATA     ; SPM timed sequence
  2048.         CPI     GUARD,$A5       ;1
  2049.         BRNE    CRITICAL_ERROR  ;1
  2050.         SPM
  2051.         NOP
  2052.         NOP
  2053.         NOP
  2054.         NOP
  2055. WAIT2SPM:                       ; check for previous SPM complete
  2056.         INPORT  TEMP,SPMCSR
  2057.         SBRC    TEMP,SPMEN
  2058.         RJMP    WAIT2SPM
  2059.         POP     TEMP
  2060.         RET
  2061. ;
  2062. ;--------------------------------------
  2063. ;
  2064. CMD00:  .DB     $40,$00,$00,$00,$00,$95
  2065. CMD08:  .DB     $48,$00,$00,$01,$AA,$87
  2066. CMD16:  .DB     $50,$00,$00,$02,$00,$FF
  2067. FILENAME:       .DB     "ZXEVO_FWBIN",0
  2068. SIGNATURE:      .DB     "ZXEVO",$1A
  2069. MSG_NEWLINE2:
  2070.         .DB     $0D,$0A
  2071. MSG_NEWLINE:
  2072.         .DB     $0D,$0A,$1B,"[1",$3B,"37m",0
  2073. MSG_BADCRC:
  2074.         .DB     $1B,"[31mBad CRC!",0
  2075. MSG_BOOT:
  2076.         .DB     "boot: ",0,0
  2077. MSG_BETA:
  2078.         .DB     " beta",0
  2079. MSG_MAIN:
  2080.         .DB     "main: ",0,0
  2081. MSG_SDERROR:
  2082.         .DB     "SD error: ",0,0
  2083. MSG_CARD:
  2084.         .DB     "Card",0,0
  2085. MSG_READERROR:
  2086.         .DB     "Read error",0,0
  2087. MSG_FAT:
  2088.         .DB     "FAT",0
  2089. MSG_FILE:
  2090.         .DB     "File",0,0
  2091. MSG_WRONGFILE:
  2092.         .DB     "Wrong file",0,0
  2093. MSG_NOTFOUND:
  2094.         .DB     " not found",0,0
  2095. MSG_CFGFPGA:
  2096.         .DB     $0D,$0A,"Set temporary configuration...",0,0
  2097. MSG_TRYUPDATE:
  2098.         .DB     "Try update from ",0,0
  2099. MSG__SDCARD:
  2100.         .DB     "SD-card...",0,0
  2101. MSG__RS232:
  2102.         .DB     "RS-232...",$0D,$0A,$1B,"[0mNow, start file transfer using X-Modem-CRC protocol. ",$1B,"[30m",0
  2103. MSG_CLRCURRLINE:
  2104.         .DB     $0D,$1B,"[K",0,0
  2105. MSG_WRONGDATA:
  2106.         .DB     "Data is corrupt! Update is canceled.",0,0
  2107. MSG_RECHECK:
  2108.         .DB     "Recheck flash...   ",0
  2109. MSG_MAINOK:
  2110.         .DB     "Ok!",0
  2111. MSG_MAINBAD:
  2112.         .DB     "Update is failure.",0,0
  2113. MSG_TITLE:
  2114. .INCLUDE "evotitle.inc"
  2115. ;
  2116. PACKED_FPGA:
  2117. .NOLIST
  2118. .INCLUDE "fpga.inc"
  2119. .LIST
  2120. ;
  2121. ;--------------------------------------
  2122. ;
  2123.         .ORG    FLASHEND-$0007
  2124. BOOT_VERS:
  2125.         .DW     0,0,0,0,0,0     ;здесь будет строчка описателя bootloader-а
  2126.         .DW     0               ;здесь будет дата(версия) bootloader-а
  2127.         .DW     0               ;здесь будет CRC bootloader-а
  2128. BOOTLOADER_END:
  2129.