Subversion Repositories pentevo

Rev

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