Subversion Repositories pentevo

Rev

Rev 411 | 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  SPICS_SET
  6.         SBI     PORTB,0
  7. .ENDMACRO
  8.  
  9. .MACRO  SPICS_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    FF_FL   =R08
  25. .DEF    FF      =R13    ;всегда = $FF
  26. .DEF    ONE     =R14    ;всегда = $01
  27. .DEF    NULL    =R15    ;всегда = $00
  28. .DEF    DATA    =R16
  29. .DEF    TEMP    =R17
  30. .DEF    COUNT   =R18
  31. .DEF    BITS    =R19
  32. ;локально используются: R0,R1,R20,R21,R24,R25
  33.  
  34. .EQU    DBSIZE_HI       =HIGH(4096)
  35. .EQU    DBMASK_HI       =HIGH(4095)
  36. .EQU    nCONFIG         =PORTF0
  37. .EQU    nSTATUS         =PORTF1
  38. .EQU    CONF_DONE       =PORTF2
  39.  
  40. .EQU    CMD_17          =$51    ;read_single_block
  41. .EQU    ACMD_41         =$69    ;sd_send_op_cond
  42.  
  43. .EQU    SD_CS0          =$57
  44. .EQU    SD_CS1          =$5F
  45. .EQU    FLASH_LOADDR    =$F0
  46. .EQU    FLASH_MIDADDR   =$F1
  47. .EQU    FLASH_HIADDR    =$F2
  48. .EQU    FLASH_DATA      =$F3
  49. .EQU    FLASH_CTRL      =$F4
  50. .EQU    SCR_LOADDR      =$40
  51. .EQU    SCR_HIADDR      =$41
  52. .EQU    SCR_CHAR        =$44
  53. .EQU    SCR_MODE        =$4E
  54. ;
  55. ;--------------------------------------
  56. ;
  57. .DSEG
  58.         .ORG    $0100
  59. BUFFER:
  60.         .ORG    $0300
  61. BUF4FAT:
  62.         .ORG    $0500
  63. CAL_FAT:.BYTE   1       ;тип обнаруженной FAT
  64. MANYFAT:.BYTE   1       ;количество FAT-таблиц
  65. BYTSSEC:.BYTE   1       ;количество секторов в кластере
  66. ROOTCLS:.BYTE   4       ;сектор начала root директории
  67. SEC_FAT:.BYTE   4       ;количество секторов одной FAT
  68. RSVDSEC:.BYTE   2       ;размер резервной области
  69. STARTRZ:.BYTE   4       ;начало диска/раздела
  70. FRSTDAT:.BYTE   4       ;адрес первого сектора данных от BPB
  71. SEC_DSC:.BYTE   4       ;количество секторов на диске/разделе
  72. CLS_DSC:.BYTE   4       ;количество кластеров на диске/разделе
  73. FATSTR0:.BYTE   4       ;начало первой FAT таблицы
  74. FATSTR1:.BYTE   4       ;начало второй FAT таблицы
  75. TEK_DIR:.BYTE   4       ;кластер текущей директории
  76. KCLSDIR:.BYTE   1       ;кол-во кластеров директории
  77. NUMSECK:.BYTE   1       ;счетчик секторов в кластере
  78. TFILCLS:.BYTE   4       ;текущий кластер
  79. MPHWOST:.BYTE   1       ;кол-во секторов в последнем кластере
  80. KOL_CLS:.BYTE   4       ;кол-во кластеров файла минус 1
  81. ZTFILCLS:.BYTE  4
  82. ZMPHWOST:.BYTE  1
  83. ZKOL_CLS:.BYTE  4
  84. SDERROR:.BYTE   1
  85. LASTSECFLAG:
  86.         .BYTE   1
  87. F_ADDR0:.BYTE   1
  88. F_ADDR1:.BYTE   1
  89. F_ADDR2:.BYTE   1
  90. ERRFLG1:.BYTE   1
  91. ERRFLG2:.BYTE   1
  92. ;
  93. ;--------------------------------------
  94. ;
  95. .CSEG
  96.         .ORG    0
  97.         JMP     START
  98.         JMP     START   ;EXT_INT0       ; IRQ0 Handler
  99.         JMP     START   ;EXT_INT1       ; IRQ1 Handler
  100.         JMP     START   ;EXT_INT2       ; IRQ2 Handler
  101.         JMP     START   ;EXT_INT3       ; IRQ3 Handler
  102.         JMP     START   ;EXT_INT4       ; IRQ4 Handler
  103.         JMP     START   ;EXT_INT5       ; IRQ5 Handler
  104.         JMP     START   ;EXT_INT6       ; IRQ6 Handler
  105.         JMP     START   ;EXT_INT7       ; IRQ7 Handler
  106.         JMP     START   ;TIM2_COMP      ; Timer2 Compare Handler
  107.         JMP     START   ;TIM2_OVF       ; Timer2 Overflow Handler
  108.         JMP     START   ;TIM1_CAPT      ; Timer1 Capture Handler
  109.         JMP     START   ;TIM1_COMPA     ; Timer1 CompareA Handler
  110.         JMP     START   ;TIM1_COMPB     ; Timer1 CompareB Handler
  111.         JMP     START   ;TIM1_OVF       ; Timer1 Overflow Handler
  112.         JMP     START   ;TIM0_COMP      ; Timer0 Compare Handler
  113.         JMP     START   ;TIM0_OVF       ; Timer0 Overflow Handler
  114.         JMP     START   ;SPI_STC        ; SPI Transfer Complete Handler
  115.         JMP     START   ;USART0_RXC     ; USART0 RX Complete Handler
  116.         JMP     START   ;USART0_DRE     ; USART0,UDR Empty Handler
  117.         JMP     START   ;USART0_TXC     ; USART0 TX Complete Handler
  118.         JMP     START   ;ADC            ; ADC Conversion Complete Handler
  119.         JMP     START   ;EE_RDY         ; EEPROM Ready Handler
  120.         JMP     START   ;ANA_COMP       ; Analog Comparator Handler
  121.         JMP     START   ;TIM1_COMPC     ; Timer1 CompareC Handler
  122.         JMP     START   ;TIM3_CAPT      ; Timer3 Capture Handler
  123.         JMP     START   ;TIM3_COMPA     ; Timer3 CompareA Handler
  124.         JMP     START   ;TIM3_COMPB     ; Timer3 CompareB Handler
  125.         JMP     START   ;TIM3_COMPC     ; Timer3 CompareC Handler
  126.         JMP     START   ;TIM3_OVF       ; Timer3 Overflow Handler
  127.         JMP     START   ;USART1_RXC     ; USART1 RX Complete Handler
  128.         JMP     START   ;USART1_DRE     ; USART1,UDR Empty Handler
  129.         JMP     START   ;USART1_TXC     ; USART1 TX Complete Handler
  130.         JMP     START   ;TWI_INT        ; Two-wire Serial Interface Interrupt Handler
  131.         JMP     START   ;SPM_RDY        ; SPM Ready Handler
  132. ;
  133. ;--------------------------------------
  134. ;
  135. MSG_CFGFPGA:
  136.         .DB     $0D,$0A,$0A,$0A,"Load FPGA configuration... ",0
  137. MSG_OK:
  138.         .DB     "Ok!",$0A
  139. MSG_NEWLINE:
  140.         .DB     $0D,$0A,0,0
  141. ;
  142. MSG_TITLE:
  143.         .DB     "  ZX Evolution Flasher ",0
  144. MSG_ID_FLASH:
  145.         .DB     "ID flash memory chip: ",0,0
  146. MSG_OPENFILE:
  147.         .DB     "Open file from SD-card...",0
  148. MSG_SDERROR:
  149.         .DB     "SD error: ",0,0
  150. MSG_CARD:
  151.         .DB     "Card",0,0
  152. MSG_READERROR:
  153.         .DB     "Read error",0,0
  154. MSG_FAT:
  155.         .DB     "FAT",0
  156. MSG_FILE:
  157.         .DB     "File",0,0
  158. MSG_NOTFOUND:
  159.         .DB     " not found",0,0
  160. MSG_EMPTY:
  161.         .DB     " empty",0,0
  162. MSG_TOOBIG:
  163.         .DB     " too big",0,0
  164. MSG_F_ERASE:
  165.         .DB     "Erase...",0,0
  166. MSG_F_WRITE:
  167.         .DB     "Write...",0,0
  168. MSG_F_CHECK:
  169.         .DB     "Check...",0,0
  170. MSG_F_COMPLETE:
  171.         .DB     "Successfully complete.",0,0
  172. MSG_F_ERROR:
  173.         .DB     "ERROR!",0,0
  174. MSG_HALT:
  175.         .DB     "HALT!",0
  176. ;
  177. CMD00:  .DB     $40,$00,$00,$00,$00,$95
  178. CMD08:  .DB     $48,$00,$00,$01,$AA,$87
  179. CMD16:  .DB     $50,$00,$00,$02,$00,$FF
  180. CMD55:  .DB     $77,$00,$00,$00,$00,$FF ;app_cmd
  181. CMD58:  .DB     $7A,$00,$00,$00,$00,$FF ;read_ocr
  182. CMD59:  .DB     $7B,$00,$00,$00,$00,$FF ;crc_on_off
  183. FILENAME:
  184.         .DB     "ZXEVO   ROM",0
  185. ;
  186. PACKED_FPGA:
  187. .NOLIST
  188. .INCLUDE "FPGA.INC"
  189. .LIST
  190. .INCLUDE "_NVRAM.ASM"
  191. ;
  192. ;--------------------------------------
  193. ;
  194. START:  CLI
  195.         CLR     NULL
  196.         LDI     TEMP,$01
  197.         MOV     ONE,TEMP
  198.         LDI     TEMP,$FF
  199.         MOV     FF,TEMP
  200. ;WatchDog OFF
  201.         LDI     TEMP,0B00011111
  202.         OUT     WDTCR,TEMP
  203.         OUT     WDTCR,NULL
  204.  
  205.         OUT     MCUCSR,NULL
  206. ;
  207.         LDI     TEMP,LOW(RAMEND)
  208.         OUT     SPL,TEMP
  209.         LDI     TEMP,HIGH(RAMEND)
  210.         OUT     SPH,TEMP
  211. ;
  212.         OUT     RAMPZ,ONE
  213. ;
  214.         LDI     TEMP,      0B11111111
  215.         OUTPORT PORTG,TEMP
  216.         LDI     TEMP,      0B00000000
  217.         OUTPORT DDRG,TEMP
  218.  
  219.         LDI     TEMP,      0B00001000
  220.         OUTPORT PORTF,TEMP
  221.         OUTPORT DDRF,TEMP
  222.  
  223.         LDI     TEMP,      0B11110011
  224.         OUT     PORTE,TEMP
  225.         LDI     TEMP,      0B00000000
  226.         OUT     DDRE,TEMP
  227.  
  228.         LDI     TEMP,      0B11111111
  229.         OUT     PORTD,TEMP
  230.         LDI     TEMP,      0B00000000
  231.         OUT     DDRD,TEMP
  232.  
  233.         LDI     TEMP,      0B11011111
  234.         OUT     PORTC,TEMP
  235.         LDI     TEMP,      0B00000000
  236.         OUT     DDRC,TEMP
  237.  
  238.         LDI     TEMP,      0B11111001
  239.         OUT     PORTB,TEMP
  240.         LDI     TEMP,      0B10000111
  241.         OUT     DDRB,TEMP
  242.  
  243.         LDI     TEMP,      0B11111111
  244.         OUT     PORTA,TEMP
  245.         LDI     TEMP,      0B00000000
  246.         OUT     DDRA,TEMP
  247. ;UART1 Set baud rate
  248.         OUTPORT UBRR1H,NULL
  249.         LDI     TEMP,5     ;115200 baud @ 11059.2 kHz, Normal speed
  250.         OUTPORT UBRR1L,TEMP
  251. ;UART1 Normal Speed
  252.         OUTPORT UCSR1A,NULL
  253. ;UART1 data8bit, 2stopbits
  254.         LDI     TEMP,(1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS)
  255.         OUTPORT UCSR1C,TEMP
  256. ;UART1 Разрешаем передачу
  257.         LDI     TEMP,(1<<TXEN)
  258.         OUTPORT UCSR1B,TEMP
  259. ;SPI init
  260.         LDI     TEMP,(1<<SPI2X)
  261.         OUT     SPSR,TEMP
  262.         LDI     TEMP,(1<<SPE)|(1<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
  263.         OUT     SPCR,TEMP
  264. ;ждём включения ATX, а потом ещё чуть-чуть.
  265. UP11:   SBIS    PINF,0 ;PINC,5 ; а если powergood нет вообще ?
  266.         RJMP    UP11
  267.         LDI     DATA,5
  268.         RCALL   DELAY
  269.  
  270.         LDIZ    MSG_CFGFPGA*2
  271.         RCALL   UART_PRINTSTRZ
  272. ;загрузка FPGA
  273.         INPORT  TEMP,DDRF
  274.         SBR     TEMP,(1<<nCONFIG)
  275.         OUTPORT DDRF,TEMP
  276.  
  277.         LDI     TEMP,147 ;40 us @ 11.0592 MHz
  278. LDFPGA1:DEC     TEMP    ;1
  279.         BRNE    LDFPGA1 ;2
  280.  
  281.         INPORT  TEMP,DDRF
  282.         CBR     TEMP,(1<<nCONFIG)
  283.         OUTPORT DDRF,TEMP
  284.  
  285. LDFPGA2:SBIS    PINF,nSTATUS
  286.         RJMP    LDFPGA2
  287.  
  288.         LDIZ    PACKED_FPGA*2
  289.         LDIY    BUFFER
  290. ;(не трогаем стек! всё ОЗУ под буфер)
  291.         LDI     TEMP,$80
  292. MS:     LPM     R0,Z+
  293.         ST      Y+,R0
  294. ;-begin-PUT_BYTE_1---
  295.         OUT     SPDR,R0
  296. PUTB1:  SBIS    SPSR,SPIF
  297.         RJMP    PUTB1
  298. ;-end---PUT_BYTE_1---
  299.         SUBI    YH,HIGH(BUFFER) ;
  300.         ANDI    YH,DBMASK_HI    ;Y warp
  301.         ADDI    YH,HIGH(BUFFER) ;
  302. M0:     LDI     R21,$02
  303.         LDI     R20,$FF
  304. M1:
  305. M1X:    ADD     TEMP,TEMP
  306.         BRNE    M2
  307.         LPM     TEMP,Z+
  308.         ROL     TEMP
  309. M2:     ROL     R20
  310.         BRCC    M1X
  311.         DEC     R21
  312.         BRNE    X2
  313.         LDI     DATA,2
  314.         ASR     R20
  315.         BRCS    N1
  316.         INC     DATA
  317.         INC     R20
  318.         BREQ    N2
  319.         LDI     R21,$03
  320.         LDI     R20,$3F
  321.         RJMP    M1
  322.  
  323. X2:     DEC     R21
  324.         BRNE    X3
  325.         LSR     R20
  326.         BRCS    MS
  327.         INC     R21
  328.         RJMP    M1
  329.  
  330. X6:     ADD     DATA,R20
  331. N2:     LDI     R21,$04
  332.         LDI     R20,$FF
  333.         RJMP    M1
  334.  
  335. N1:     INC     R20
  336.         BRNE    M4
  337.         INC     R21
  338. N5:     ROR     R20
  339.         BRCS    DEMLZEND
  340.         ROL     R21
  341.         ADD     TEMP,TEMP
  342.         BRNE    N6
  343.         LPM     TEMP,Z+
  344.         ROL     TEMP
  345. N6:     BRCC    N5
  346.         ADD     DATA,R21
  347.         LDI     R21,6
  348.         RJMP    M1
  349. X3:     DEC     R21
  350.         BRNE    X4
  351.         LDI     DATA,1
  352.         RJMP    M3
  353. X4:     DEC     R21
  354.         BRNE    X5
  355.         INC     R20
  356.         BRNE    M4
  357.         LDI     R21,$05
  358.         LDI     R20,$1F
  359.         RJMP    M1
  360. X5:     DEC     R21
  361.         BRNE    X6
  362.         MOV     R21,R20
  363. M4:     LPM     R20,Z+
  364. M3:     DEC     R21
  365.         MOV     XL,R20
  366.         MOV     XH,R21
  367.         ADD     XL,YL
  368.         ADC     XH,YH
  369. LDIRLOOP:
  370.         SUBI    XH,HIGH(BUFFER) ;
  371.         ANDI    XH,DBMASK_HI    ;X warp
  372.         ADDI    XH,HIGH(BUFFER) ;
  373.         LD      R0,X+
  374.         ST      Y+,R0
  375. ;-begin-PUT_BYTE_2---
  376.         OUT     SPDR,R0
  377. PUTB2:  SBIS    SPSR,SPIF
  378.         RJMP    PUTB2
  379. ;-end---PUT_BYTE_2---
  380.         SUBI    YH,HIGH(BUFFER) ;
  381.         ANDI    YH,DBMASK_HI    ;Y warp
  382.         ADDI    YH,HIGH(BUFFER) ;
  383.         DEC     DATA
  384.         BRNE    LDIRLOOP
  385.  
  386.         RJMP    M0
  387. ;теперь можно юзать стек
  388. DEMLZEND:
  389.         SBIS    PINF,CONF_DONE
  390.         RJMP    DEMLZEND
  391. ;SPI reinit
  392.         LDI     TEMP,(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
  393.         OUT     SPCR,TEMP
  394.  
  395.         SBI     DDRE,6
  396.         LED_OFF
  397.         LDIZ    MSG_OK*2
  398.         RCALL   UART_PRINTSTRZ
  399. ; - - - - - - - - - - - - - - - - - - -
  400.         RCALL   NVRAM_READ_MODE
  401.         LDI     TEMP,SCR_MODE
  402.         RCALL   FPGA_REG
  403. ; - - - - - - - - - - - - - - - - - - -
  404.         LDI     XL,0
  405.         LDI     XH,0
  406.         RCALL   SET_CURSOR
  407.         LDIZ    MSG_TITLE*2
  408.         RCALL   PRINTSTRZ
  409.  
  410.         LDIZ    LARGEBOOTSTART*2-4
  411. ;        OUT     RAMPZ,ONE
  412.         ELPM    XL,Z+
  413.         ELPM    XH,Z
  414.         MOV     DATA,XL
  415.         ANDI    DATA,$1F
  416.         BREQ    PRVERS9
  417.         MOV     TEMP,XH
  418.         LSL     XL
  419.         ROL     TEMP
  420.         LSL     XL
  421.         ROL     TEMP
  422.         LSL     XL
  423.         ROL     TEMP
  424.         ANDI    TEMP,$0F
  425.         BREQ    PRVERS9
  426.         CPI     TEMP,13
  427.         BRCC    PRVERS9
  428.         MOV     COUNT,XH
  429.         LSR     COUNT
  430.         ANDI    COUNT,$3F
  431.         CPI     COUNT,9
  432.         BRCS    PRVERS9
  433.         PUSH    DATA
  434.         LDI     DATA,$28 ;"("
  435.         RCALL   PUTCHAR
  436.         MOV     DATA,COUNT
  437.         RCALL   DECBYTE
  438.         MOV     DATA,TEMP
  439.         RCALL   DECBYTE
  440.         POP     DATA
  441.         RCALL   DECBYTE
  442.         LDI     DATA,$29 ;")"
  443.         RCALL   PUTCHAR
  444. PRVERS9:
  445. ; - - - - - - - - - - - - - - - - - - -
  446. ;информация о Flash-ROM чипе
  447.         RCALL   UART_NEWLINE
  448.         LDI     XL,0
  449.         LDI     XH,2
  450.         RCALL   SET_CURSOR
  451.         LDIZ    MSG_ID_FLASH*2
  452.         RCALL   PRINTSTRZ
  453.  
  454.         RCALL   F_ID
  455.         MOV     DATA,ZL
  456.         RCALL   HEXBYTE
  457.         LDI     DATA,$20
  458.         RCALL   PUTCHAR
  459.         MOV     DATA,ZH
  460.         RCALL   HEXBYTE
  461. ; - - - - - - - - - - - - - - - - - - -
  462.         RCALL   UART_NEWLINE
  463.         LDI     XL,0
  464.         LDI     XH,3
  465.         RCALL   SET_CURSOR
  466.         LDIZ    MSG_OPENFILE*2
  467.         RCALL   PRINTSTRZ
  468. ;
  469. ;инициализация SD карточки
  470.         LDI     TEMP,SD_CS1
  471.         SER     DATA
  472.         RCALL   FPGA_REG
  473.         LDI     TEMP,32
  474.         RCALL   SD_RD_DUMMY
  475.  
  476.         LDI     TEMP,SD_CS0
  477.         SER     DATA
  478.         RCALL   FPGA_REG
  479.         SER     R24
  480. SDINIT1:LDIZ    CMD00*2
  481.         RCALL   SD_WR_PGM_6
  482.         DEC     R24
  483.         BRNE    SDINIT2
  484.         LDI     DATA,1  ;нет SD
  485.         RJMP    SD_ERROR
  486. SDINIT2:CPI     DATA,$01
  487.         BRNE    SDINIT1
  488.  
  489.         LDIZ    CMD08*2
  490.         RCALL   SD_WR_PGM_6
  491.         LDI     R24,$00
  492.         SBRS    DATA,2
  493.         LDI     R24,$40
  494.         LDI     TEMP,4
  495.         RCALL   SD_RD_DUMMY
  496.  
  497. SDINIT3:LDIZ    CMD55*2
  498.         RCALL   SD_WR_PGM_6
  499.         LDI     TEMP,2
  500.         RCALL   SD_RD_DUMMY
  501.         LDI     DATA,ACMD_41
  502.         RCALL   SD_EXCHANGE
  503.         MOV     DATA,R24
  504.         RCALL   SD_EXCHANGE
  505.  
  506.         LDIZ    CMD55*2+2
  507.         LDI     TEMP,4
  508.         RCALL   SD_WR_PGX
  509.         TST     DATA
  510.         BRNE    SDINIT3
  511.  
  512. SDINIT4:LDIZ    CMD59*2
  513.         RCALL   SD_WR_PGM_6
  514.         TST     DATA
  515.         BRNE    SDINIT4
  516.  
  517. SDINIT5:LDIZ    CMD16*2
  518.         RCALL   SD_WR_PGM_6
  519.         TST     DATA
  520.         BRNE    SDINIT5
  521. ;
  522. ; - - - - - - - - - - - - - - - - - - -
  523. ;поиск FAT, инициализация переменных
  524. WC_FAT: LDIX    0
  525.         LDIY    0
  526.         RCALL   LOADLST
  527.         LDIZ    BUF4FAT+$01BE
  528.         LD      DATA,Z
  529.         TST     DATA
  530.         BRNE    RDFAT05
  531.         LDI     ZL,$C2
  532.         LD      DATA,Z
  533.         LDI     TEMP,0
  534.         CPI     DATA,$01
  535.         BREQ    RDFAT06
  536.         LDI     TEMP,2
  537.         CPI     DATA,$0B
  538.         BREQ    RDFAT06
  539.         CPI     DATA,$0C
  540.         BREQ    RDFAT06
  541.         LDI     TEMP,1
  542.         CPI     DATA,$06
  543.         BREQ    RDFAT06
  544.         CPI     DATA,$0E
  545.         BRNE    RDFAT05
  546. RDFAT06:STS     CAL_FAT,TEMP
  547.         LDI     ZL,$C6
  548.         LD      XL,Z+
  549.         LD      XH,Z+
  550.         LD      YL,Z+
  551.         LD      YH,Z
  552.         RJMP    RDFAT00
  553. RDFAT05:LDIZ    BUF4FAT
  554.         LDD     BITS,Z+$0D
  555.         LDI     DATA,0
  556.         LDI     TEMP,0
  557.         LDI     COUNT,8
  558. RDF051: ROR     BITS
  559.         ADC     DATA,NULL
  560.         DEC     COUNT
  561.         BRNE    RDF051
  562.         DEC     DATA
  563.         BRNE    RDF052
  564.         INC     TEMP
  565. RDF052: LDD     DATA,Z+$0E
  566.         LDD     R0,Z+$0F
  567.         OR      DATA,R0
  568.         BREQ    RDF053
  569.         INC     TEMP
  570. RDF053: LDD     DATA,Z+$13
  571.         LDD     R0,Z+$14
  572.         OR      DATA,R0
  573.         BRNE    RDF054
  574.         INC     TEMP
  575. RDF054: LDD     DATA,Z+$20
  576.         LDD     R0,Z+$21
  577.         OR      DATA,R0
  578.         LDD     R0,Z+$22
  579.         OR      DATA,R0
  580.         LDD     R0,Z+$23
  581.         OR      DATA,R0
  582.         BRNE    RDF055
  583.         INC     TEMP
  584. RDF055: LDD     DATA,Z+$15
  585.         ANDI    DATA,$F0
  586.         CPI     DATA,$F0
  587.         BRNE    RDF056
  588.         INC     TEMP
  589. RDF056: CPI     TEMP,4
  590.         BREQ    RDF057
  591.         LDI     DATA,3  ;не найдена FAT
  592.         RJMP    SD_ERROR
  593. RDF057: STS     CAL_FAT,FF
  594.         LDIY    0
  595.         LDIX    0
  596. RDFAT00:STSX    STARTRZ+0
  597.         STSY    STARTRZ+2
  598.         RCALL   LOADLST
  599.         LDIY    0
  600.         LDD     XL,Z+22
  601.         LDD     XH,Z+23         ;bpb_fatsz16
  602.         MOV     DATA,XH
  603.         OR      DATA,XL
  604.         BRNE    RDFAT01         ;если не fat12/16 (bpb_fatsz16=0)
  605.         LDD     XL,Z+36         ;то берем bpb_fatsz32 из смещения +36
  606.         LDD     XH,Z+37
  607.         LDD     YL,Z+38
  608.         LDD     YH,Z+39
  609. RDFAT01:STSX    SEC_FAT+0
  610.         STSY    SEC_FAT+2       ;число секторов на fat-таблицу
  611.         LDIY    0
  612.         LDD     XL,Z+19
  613.         LDD     XH,Z+20         ;bpb_totsec16
  614.         MOV     DATA,XH
  615.         OR      DATA,XL
  616.         BRNE    RDFAT02         ;если не fat12/16 (bpb_totsec16=0)
  617.         LDD     XL,Z+32         ;то берем из bpb_totsec32 смещения +32
  618.         LDD     XH,Z+33
  619.         LDD     YL,Z+34
  620.         LDD     YH,Z+35
  621. RDFAT02:STSX    SEC_DSC+0
  622.         STSY    SEC_DSC+2       ;к-во секторов на диске/разделе
  623. ;вычисляем rootdirsectors
  624.         LDD     XL,Z+17
  625.         LDD     XH,Z+18         ;bpb_rootentcnt
  626.         LDIY    0
  627.         MOV     DATA,XH
  628.         OR      DATA,XL
  629.         BREQ    RDFAT03
  630.         LDI     DATA,$10
  631.         RCALL   BCDE_A
  632.         MOVW    YL,XL           ;это реализована формула
  633.                                 ;rootdirsectors = ( (bpb_rootentcnt*32)+(bpb_bytspersec-1) )/bpb_bytspersec
  634.                                 ;в Y rootdirsectors
  635.                                 ;если fat32, то Y=0 всегда
  636. RDFAT03:PUSH    YH
  637.         PUSH    YL
  638.         LDD     DATA,Z+16       ;bpb_numfats
  639.         STS     MANYFAT,DATA
  640.         LDSX    SEC_FAT+0
  641.         LDSY    SEC_FAT+2
  642.         DEC     DATA
  643. RDF031: LSL     XL
  644.         ROL     XH
  645.         ROL     YL
  646.         ROL     YH
  647.         DEC     DATA
  648.         BRNE    RDF031
  649.         POP     R24
  650.         POP     R25
  651.                                 ;полный размер fat-области в секторах
  652.         RCALL   HLDEPBC         ;прибавили rootdirsectors
  653.         LDD     R24,Z+14
  654.         LDD     R25,Z+15        ;bpb_rsvdseccnt
  655.         STS     RSVDSEC+0,R24
  656.         STS     RSVDSEC+1,R25
  657.         RCALL   HLDEPBC         ;прибавили bpb_resvdseccnt
  658.         STSX    FRSTDAT+0
  659.         STSY    FRSTDAT+2       ;положили номер первого сектора данных
  660.         LDIZ    SEC_DSC
  661.         RCALL   BCDEHLM         ;вычли из полного к-ва секторов раздела
  662.         LDIZ    BUF4FAT
  663.         LDD     DATA,Z+13
  664.         STS     BYTSSEC,DATA
  665.         RCALL   BCDE_A          ;разделили на к-во секторов в кластере
  666.         STSX    CLS_DSC+0
  667.         STSY    CLS_DSC+2       ;положили кол-во кластеров на разделе
  668.  
  669.         LDS     DATA,CAL_FAT
  670.         CPI     DATA,$FF
  671.         BRNE    RDFAT04
  672.         LDSX    CLS_DSC+0
  673.         LDSY    CLS_DSC+2
  674.         PUSHY
  675.         PUSHX
  676.         LSL     XL
  677.         ROL     XH
  678.         ROL     YL
  679.         ROL     YH
  680.         RCALL   RASCHET
  681.         LDI     DATA,1
  682.         POPX
  683.         POPY
  684.         BREQ    RDFAT04
  685.         LSL     XL
  686.         ROL     XH
  687.         ROL     YL
  688.         ROL     YH
  689.         LSL     XL
  690.         ROL     XH
  691.         ROL     YL
  692.         ROL     YH
  693.         RCALL   RASCHET
  694.         LDI     DATA,2
  695.         BREQ    RDFAT04
  696.         CLR     DATA
  697. RDFAT04:STS     CAL_FAT,DATA
  698. ;для fat12/16 вычисляем адрес первого сектора директории
  699. ;для fat32 берем по смещемию +44
  700. ;на выходе YX == сектор rootdir
  701.         LDIX    0
  702.         LDIY    0
  703.         TST     DATA
  704.         BREQ    FSRROO2
  705.         DEC     DATA
  706.         BREQ    FSRROO2
  707.         LDD     XL,Z+44
  708.         LDD     XH,Z+45
  709.         LDD     YL,Z+46
  710.         LDD     YH,Z+47
  711. FSRROO2:STSX    ROOTCLS+0
  712.         STSY    ROOTCLS+2       ;сектор root директории
  713.         STSX    TEK_DIR+0
  714.         STSY    TEK_DIR+2
  715.  
  716. FSRR121:PUSHX
  717.         PUSHY
  718.         LDSX    RSVDSEC
  719.         LDIY    0
  720.         LDIZ    STARTRZ
  721.         RCALL   BCDEHLP
  722.         STSX    FATSTR0+0
  723.         STSY    FATSTR0+2
  724.         LDIZ    SEC_FAT
  725.         RCALL   BCDEHLP
  726.         STSX    FATSTR1+0
  727.         STSY    FATSTR1+2
  728.         POPY
  729.         POPX
  730.  
  731.         LDI     TEMP,1
  732.         MOV     R0,XL
  733.         OR      R0,XH
  734.         OR      R0,YL
  735.         OR      R0,YH
  736.         BREQ    LASTCLS
  737. NEXTCLS:PUSH    TEMP
  738.         RCALL   RDFATZP
  739.         RCALL   LST_CLS
  740.         POP     TEMP
  741.         BRCC    LASTCLS
  742.         INC     TEMP
  743.         RJMP    NEXTCLS
  744. LASTCLS:STS     KCLSDIR,TEMP
  745.         LDIY    0
  746.         RCALL   RDDIRSC
  747. ;
  748. ; - - - - - - - - - - - - - - - - - - -
  749. ;поиск файла в директории
  750.         LDIY    0               ;номер описателя файла
  751.         RJMP    FNDMP32
  752.  
  753. FNDMP31:ADIW    YL,1            ;номер++               ─────────┐
  754.         ADIW    ZL,$20          ;следующий описатель             │
  755.         CPI     ZH,HIGH(BUF4FAT+512);                            │
  756.                                 ;вылезли за сектор?              │
  757.         BRNE    FNDMP32         ;нет ещё                         │
  758.         RCALL   RDDIRSC         ;считываем следующий             │
  759.         BRNE    FNDMP37         ;кончились сектора в директории ═│═╗
  760. FNDMP32:LDD     DATA,Z+$0B      ;атрибуты                        │ ║
  761.         SBRC    DATA,3          ;длиное имя/имя диска?           │ ║
  762.         RJMP    FNDMP31         ;да ────────────────────────────┤ ║
  763.         SBRC    DATA,4          ;директория?                     │ ║
  764.         RJMP    FNDMP31         ;да ────────────────────────────┤ ║
  765.         LD      DATA,Z          ;первый символ                   │ ║
  766.         CPI     DATA,$E5        ;удалённый файл?                 │ ║
  767.         BREQ    FNDMP31         ;да ────────────────────────────┘ ║
  768.         TST     DATA            ;пустой описатель? (конец списка)  ╚═ в этой директории
  769.         BREQ    FNDMP37         ;да ═════════════════════════════════ нет нашёго файла
  770.         PUSH    ZL
  771.         MOVW    XL,ZL
  772.         LDIZ    FILENAME*2
  773. DALSHE: LPM     DATA,Z+
  774.         TST     DATA
  775.         BREQ    NASHEL
  776.         LD      TEMP,X+
  777.         CP      DATA,TEMP
  778.         BREQ    DALSHE
  779. ;не совпало
  780.         MOV     ZH,XH
  781.         POP     ZL
  782.         RJMP    FNDMP31
  783. ;нет такого файла
  784. FNDMP37:
  785.         LDI     DATA,4  ;нет файла
  786.         RJMP    SD_ERROR
  787. ;найден описатель
  788. NASHEL: MOV     ZH,XH
  789.         POP     ZL
  790. ;
  791. ; - - - - - - - - - - - - - - - - - - -
  792. ;инициализация переменных
  793. ;для последующего чтения файла
  794. ;Z указывает на описатель файла
  795.         LDD     XL,Z+$1A
  796.         LDD     XH,Z+$1B
  797.         LDD     YL,Z+$14
  798.         LDD     YH,Z+$15        ;считали номер первого кластера файла
  799.         STSX    TFILCLS+0
  800.         STSY    TFILCLS+2
  801.         STSX    ZTFILCLS+0
  802.         STSY    ZTFILCLS+2
  803.         LDD     XL,Z+$1C
  804.         LDD     XH,Z+$1D
  805.         LDD     YL,Z+$1E
  806.         LDD     YH,Z+$1F        ;считали длину файла
  807.  
  808.         MOV     DATA,XL
  809.         OR      DATA,XH
  810.         OR      DATA,YL
  811.         OR      DATA,YH
  812.         BRNE    F01
  813.         LDI     DATA,5  ;пустой файл
  814.         RJMP    SD_ERROR
  815. F01:
  816.         LDI     DATA,$08
  817.         CP      XL,ONE
  818.         CPC     XH,NULL
  819.         CPC     YL,DATA
  820.         CPC     YH,NULL
  821.         BRCS    F02
  822.         LDI     DATA,5  ;большой файл
  823.         RJMP    SD_ERROR
  824. F02:
  825.         LDI     R24,LOW(511)
  826.         LDI     R25,HIGH(511)
  827.         RCALL   HLDEPBC
  828.         RCALL   BCDE200         ;получили кол-во секторов
  829.         SBIW    XL,1
  830.         SBC     YL,NULL
  831.         SBC     YH,NULL
  832.         LDS     DATA,BYTSSEC
  833.         DEC     DATA
  834.         AND     DATA,XL
  835.         INC     DATA
  836.         STS     MPHWOST,DATA    ;кол-во секторов в последнем кластере
  837.         STS     ZMPHWOST,DATA
  838.         LDS     DATA,BYTSSEC
  839.         RCALL   BCDE_A
  840.         STSX    KOL_CLS+0
  841.         STSY    KOL_CLS+2
  842.         STSX    ZKOL_CLS+0
  843.         STSY    ZKOL_CLS+2
  844.         STS     NUMSECK,NULL
  845. ; - - - - - - - - - - - - - - - - - - -
  846. ;всё нормально, начинаем
  847. ;стирание
  848.         RCALL   UART_NEWLINE
  849.         LDI     XL,0
  850.         LDI     XH,4
  851.         RCALL   SET_CURSOR
  852.         LDIZ    MSG_F_ERASE*2
  853.         RCALL   PRINTSTRZ
  854.         RCALL   F_ERASE
  855. ;запись
  856.         RCALL   UART_NEWLINE
  857.         LDI     XL,0
  858.         LDI     XH,5
  859.         RCALL   SET_CURSOR
  860.         LDIZ    MSG_F_WRITE*2
  861.         RCALL   PRINTSTRZ
  862.         LDI     XL,0
  863.         LDI     XH,16
  864.         RCALL   SET_CURSOR
  865.         LDI     DATA,$01 ;"░"
  866.         LDI     TEMP,SCR_CHAR
  867.         RCALL   FPGA_REG
  868.         LDI     TEMP,$FF
  869. FCHXY1: SPICS_CLR
  870.         SPICS_SET
  871.         DEC     TEMP
  872.         BRNE    FCHXY1
  873.         LDI     XL,0
  874.         LDI     XH,16
  875.         RCALL   SET_CURSOR
  876.  
  877.         STS     F_ADDR0,NULL
  878.         STS     F_ADDR1,NULL
  879.         STS     F_ADDR2,NULL
  880.  
  881. F13:    RCALL   NEXTSEC
  882.         STS     LASTSECFLAG,DATA
  883.  
  884.         LDIZ    BUFFER
  885.         LDS     XL,F_ADDR0
  886.         LDS     XH,F_ADDR1
  887.         LDS     YL,F_ADDR2
  888.  
  889. F11:    RCALL   F_WRITE
  890.         ADIW    XL,1
  891.         ADC     YL,NULL
  892.         ADIW    ZL,1
  893.         CPI     ZH,HIGH(BUFFER+512)
  894.         BRNE    F11
  895.  
  896.         LED_OFF
  897.         SBRC    XH,1
  898.         LED_ON  ;мигать при программировании
  899.  
  900.         STS     F_ADDR0,XL
  901.         STS     F_ADDR1,XH
  902.         STS     F_ADDR2,YL
  903.  
  904.         CPI     XL,$00
  905.         BRNE    F12
  906.         MOV     DATA,XH
  907.         ANDI    DATA,$07
  908.         BRNE    F12
  909.         LDI     DATA,$02 ;"▒"
  910.         LDI     TEMP,SCR_CHAR
  911.         RCALL   FPGA_REG
  912. F12:
  913.         LDS     DATA,LASTSECFLAG
  914.         TST     DATA
  915.         BRNE    F13
  916. ;проверка
  917.         RCALL   F_RST
  918.         LDI     TEMP,FLASH_CTRL
  919.         LDI     DATA,0B00000011
  920.         RCALL   FPGA_REG
  921.         RCALL   UART_NEWLINE
  922.         LDI     XL,0
  923.         LDI     XH,6
  924.         RCALL   SET_CURSOR
  925.         LDIZ    MSG_F_CHECK*2
  926.         RCALL   PRINTSTRZ
  927.         LDI     XL,0
  928.         LDI     XH,16
  929.         RCALL   SET_CURSOR
  930.  
  931.         LDSX    ZTFILCLS+0
  932.         LDSY    ZTFILCLS+2
  933.         STSX    TFILCLS+0
  934.         STSY    TFILCLS+2
  935.         LDS     DATA,ZMPHWOST
  936.         STS     MPHWOST,DATA
  937.         LDSX    ZKOL_CLS+0
  938.         LDSY    ZKOL_CLS+2
  939.         STSX    KOL_CLS+0
  940.         STSY    KOL_CLS+2
  941.         STS     NUMSECK,NULL
  942.         STS     ERRFLG1,NULL
  943.         STS     ERRFLG2,NULL
  944. ;
  945.         STS     F_ADDR0,NULL
  946.         STS     F_ADDR1,NULL
  947.         STS     F_ADDR2,NULL
  948.  
  949. F25:    RCALL   NEXTSEC
  950.         STS     LASTSECFLAG,DATA
  951.         LDIZ    BUFFER
  952.         LDS     XL,F_ADDR0
  953.         LDS     XH,F_ADDR1
  954.         LDS     YL,F_ADDR2
  955.  
  956. F21:    RCALL   F_IN
  957.         LD      TEMP,Z+
  958.         CP      DATA,TEMP
  959.         BREQ    F26
  960.         STS     ERRFLG1,ONE
  961. F26:    ADIW    XL,1
  962.         ADC     YL,NULL
  963.         CPI     ZH,HIGH(BUFFER+512)
  964.         BRNE    F21
  965.  
  966.         LED_OFF
  967.         SBRC    XH,3
  968.         LED_ON  ;мигать при проверке
  969.  
  970.         STS     F_ADDR0,XL
  971.         STS     F_ADDR1,XH
  972.         STS     F_ADDR2,YL
  973.  
  974.         CPI     XL,$00
  975.         BRNE    F22
  976.         MOV     DATA,XH
  977.         ANDI    DATA,$07
  978.         BRNE    F22
  979.         LDS     TEMP,ERRFLG1
  980.         TST     TEMP
  981.         BREQ    F23
  982.         STS     ERRFLG2,ONE
  983.         STS     ERRFLG1,NULL
  984.         LDI     DATA,$58 ;"X"
  985.         RJMP    F24
  986. F23:    LDI     DATA,$03 ;"█"
  987. F24:    LDI     TEMP,SCR_CHAR
  988.         RCALL   FPGA_REG
  989. F22:
  990.         LDS     DATA,LASTSECFLAG
  991.         TST     DATA
  992.         BRNE    F25
  993. ;стоп
  994.         LED_OFF
  995.         RCALL   UART_NEWLINE
  996.         LDI     XL,0
  997.         LDI     XH,7
  998.         RCALL   SET_CURSOR
  999.         LDIZ    MSG_F_ERROR*2
  1000.         LDS     TEMP,ERRFLG2
  1001.         TST     TEMP
  1002.         BRNE    F91
  1003.         LDIZ    MSG_F_COMPLETE*2
  1004. F91:    RCALL   PRINTSTRZ
  1005.         RCALL   UART_NEWLINE
  1006.         LDI     XL,0
  1007.         LDI     XH,9
  1008.         RCALL   SET_CURSOR
  1009.         LDIZ    MSG_HALT*2
  1010.         RCALL   PRINTSTRZ
  1011.         CBI     DDRE,6
  1012. STOP1:  RJMP    STOP1
  1013.  
  1014. ;
  1015. ;--------------------------------------
  1016. ;out:   DATA
  1017. SD_RECEIVE:
  1018.         SER     DATA
  1019. ; - - - - - - - - - - - - - - - - - - -
  1020. ;in:    DATA
  1021. ;out:   DATA
  1022. SD_EXCHANGE:
  1023.         RJMP    FPGA_SAME_REG
  1024. ;
  1025. ;--------------------------------------
  1026. ;in;    TEMP - n
  1027. SD_RD_DUMMY:
  1028.         SER     DATA
  1029.         RCALL   SD_EXCHANGE
  1030.         DEC     TEMP
  1031.         BRNE    SD_RD_DUMMY
  1032.         RET
  1033. ;
  1034. ;--------------------------------------
  1035. ;in:    Z
  1036. SD_WR_PGM_6:
  1037.         LDI     TEMP,2
  1038.         RCALL   SD_RD_DUMMY
  1039.         LDI     TEMP,6
  1040. SD_WR_PGX:
  1041. SDWRP61:LPM     DATA,Z+
  1042.         RCALL   SD_EXCHANGE
  1043.         DEC     TEMP
  1044.         BRNE    SDWRP61
  1045. ; - - - - - - - - - - - - - - - - - - -
  1046. ;out:   DATA
  1047. SD_WAIT_NOTFF:
  1048.         LDI     TEMP,32
  1049. SDWNFF2:SER     DATA
  1050.         RCALL   SD_EXCHANGE
  1051.         CPI     DATA,$FF
  1052.         BRNE    SDWNFF1
  1053.         DEC     TEMP
  1054.         BRNE    SDWNFF2
  1055. SDWNFF1:RET
  1056. ;
  1057. ;--------------------------------------
  1058. ;in:    Z - куда
  1059. ;       Y,X - №сектора
  1060. SD_READ_SECTOR:
  1061.         PUSHZ
  1062.         LDIZ    CMD58*2
  1063.         RCALL   SD_WR_PGM_6
  1064.         RCALL   SD_RECEIVE
  1065.         SBRC    DATA,6
  1066.         RJMP    SDRDSE1
  1067.         LSL     XL
  1068.         ROL     XH
  1069.         ROL     YL
  1070.         MOV     YH,YL
  1071.         MOV     YL,XH
  1072.         MOV     XH,XL
  1073.         CLR     XL
  1074. SDRDSE1:
  1075.         LDI     TEMP,3+2
  1076.         RCALL   SD_RD_DUMMY
  1077.  
  1078.         LDI     DATA,CMD_17
  1079.         RCALL   SD_EXCHANGE
  1080.         MOV     DATA,YH
  1081.         RCALL   SD_EXCHANGE
  1082.         MOV     DATA,YL
  1083.         RCALL   SD_EXCHANGE
  1084.         MOV     DATA,XH
  1085.         RCALL   SD_EXCHANGE
  1086.         MOV     DATA,XL
  1087.         RCALL   SD_EXCHANGE
  1088.         SER     DATA
  1089.         RCALL   SD_EXCHANGE
  1090.  
  1091.         SER     R24
  1092. SDRDSE2:RCALL   SD_WAIT_NOTFF
  1093.         DEC     R24
  1094.         BREQ    SDRDSE8
  1095.         CPI     DATA,$FE
  1096.         BRNE    SDRDSE2
  1097.  
  1098.         POPZ
  1099.         LDI     R24,$00
  1100.         LDI     R25,$02
  1101. SDRDSE3:RCALL   SD_RECEIVE
  1102.         ST      Z+,DATA
  1103.         SBIW    R24,1
  1104.         BRNE    SDRDSE3
  1105.  
  1106.         LDI     TEMP,2
  1107.         RCALL   SD_RD_DUMMY
  1108. ;SDRDSE4:RCALL   SD_WAIT_NOTFF
  1109. ;        CPI     DATA,$FF
  1110. ;        BRNE    SDRDSE4
  1111.         RET
  1112.  
  1113. SDRDSE8:
  1114.        LDI     DATA,2  ;ошибка при чтении сектора
  1115.         RJMP    SD_ERROR
  1116. ;
  1117. ;--------------------------------------
  1118. ;чтение сектора данных
  1119. LOAD_DATA:
  1120.         LDIZ    BUFFER
  1121.         RCALL   SD_READ_SECTOR  ;читать один сектор
  1122.         RET
  1123. ;
  1124. ;--------------------------------------
  1125. ;чтение сектора служ.инф. (FAT/DIR/...)
  1126. LOADLST:LDIZ    BUF4FAT
  1127.         RCALL   SD_READ_SECTOR  ;читать один сектор
  1128.         LDIZ    BUF4FAT
  1129.         RET
  1130. ;
  1131. ;--------------------------------------
  1132. ;чтение сектора dir по номеру описателя (Y)
  1133. ;на выходе: DATA=#ff (sreg.Z=0) выход за пределы dir
  1134. RDDIRSC:PUSHY
  1135.         MOVW    XL,YL
  1136.         LDIY    0
  1137.         LDI     DATA,$10
  1138.         RCALL   BCDE_A
  1139.         PUSH    XL
  1140.         LDS     DATA,BYTSSEC
  1141.         PUSH    DATA
  1142.         RCALL   BCDE_A
  1143.         LDS     DATA,KCLSDIR
  1144.         DEC     DATA
  1145.         CP      DATA,XL
  1146.         BRCC    RDDIRS3
  1147.         POP     YL
  1148.         POP     YL
  1149.         POPY
  1150.         SER     DATA
  1151.         TST     DATA
  1152.         RET
  1153. RDDIRS3:LDSY    TEK_DIR+2
  1154.         MOV     DATA,XL
  1155.         TST     DATA
  1156.         LDSX    TEK_DIR+0
  1157.         BREQ    RDDIRS1
  1158. RDDIRS2:PUSH    DATA
  1159.         RCALL   RDFATZP
  1160.         POP     DATA
  1161.         DEC     DATA
  1162.         BRNE    RDDIRS2
  1163. RDDIRS1:RCALL   REALSEC
  1164.         POP     R0
  1165.         DEC     R0
  1166.         POP     DATA
  1167.         AND     DATA,R0
  1168.         ADD     XL,DATA
  1169.         ADC     XH,NULL
  1170.         ADC     YL,NULL
  1171.         ADC     YH,NULL
  1172.         RCALL   LOADLST
  1173.         POPY
  1174.         CLR     DATA
  1175.         RET
  1176. ;
  1177. ;--------------------------------------
  1178. ;out:   sreg.C == CLR - EOCmark
  1179. ;(chng: TEMP)
  1180. LST_CLS:LDI     TEMP,$0F
  1181.         LDS     DATA,CAL_FAT
  1182.         TST     DATA
  1183.         BRNE    LST_CL1
  1184.         CPI     XL,$F7
  1185.         CPC     XH,TEMP
  1186.         RET
  1187. LST_CL1:DEC     DATA
  1188.         BRNE    LST_CL2
  1189.         CPI     XL,$F7
  1190.         CPC     XH,FF
  1191.         RET
  1192. LST_CL2:CPI     XL,$F7
  1193.         CPC     XH,FF
  1194.         CPC     YL,FF
  1195.         CPC     YH,TEMP
  1196.         RET
  1197. ;
  1198. ;--------------------------------------
  1199. ;
  1200. RDFATZP:LDS     DATA,CAL_FAT
  1201.         TST     DATA
  1202.         BREQ    RDFATS0         ;FAT12
  1203.         DEC     DATA
  1204.         BREQ    RDFATS1         ;FAT16
  1205. ;FAT32
  1206.         LSL     XL
  1207.         ROL     XH
  1208.         ROL     YL
  1209.         ROL     YH
  1210.         MOV     DATA,XL
  1211.         MOV     XL,XH
  1212.         MOV     XH,YL
  1213.         MOV     YL,YH
  1214.         CLR     YH
  1215.         RCALL   RDFATS2
  1216.         ADIW    ZL,1
  1217.         LD      YL,Z+
  1218.         LD      YH,Z
  1219.         RET
  1220. ;FAT16
  1221. RDFATS1:LDIY    0
  1222.         MOV     DATA,XL
  1223.         MOV     XL,XH
  1224.         CLR     XH
  1225. RDFATS2:PUSH    DATA
  1226.         PUSHY
  1227.         LDIZ    FATSTR0
  1228.         RCALL   BCDEHLP
  1229.         RCALL   LOADLST
  1230.         POPY
  1231.         POP     DATA
  1232.         ADD     ZL,DATA
  1233.         ADC     ZH,NULL
  1234.         ADD     ZL,DATA
  1235.         ADC     ZH,NULL
  1236.         LD      XL,Z+
  1237.         LD      XH,Z
  1238.         RET
  1239. ;FAT12
  1240. RDFATS0:MOVW    ZL,XL
  1241.         LSL     ZL
  1242.         ROL     ZH
  1243.         ADD     ZL,XL
  1244.         ADC     ZH,XH
  1245.         LSR     ZH
  1246.         ROR     ZL
  1247.         MOV     DATA,XL
  1248.         MOV     XL,ZH
  1249.         CLR     XH
  1250.         CLR     YL
  1251.         CLR     YH
  1252.         LSR     XL
  1253.         PUSH    DATA
  1254.         PUSHZ
  1255.         LDIZ    FATSTR0
  1256.         RCALL   BCDEHLP
  1257.         RCALL   LOADLST
  1258.         POPY
  1259.         ANDI    YH,$01
  1260.         ADD     ZL,YL
  1261.         ADC     ZH,YH
  1262.         LD      YL,Z+
  1263.         CPI     ZH,HIGH(BUF4FAT+512)
  1264.         BRNE    RDFATS4
  1265.         PUSH    YL
  1266.         LDIY    0
  1267.         ADIW    XL,1
  1268.         RCALL   LOADLST
  1269.         POP     YL
  1270. RDFATS4:POP     DATA
  1271.         LD      XH,Z
  1272.         MOV     XL,YL
  1273.         LDIY    0
  1274.         LSR     DATA
  1275.         BRCC    RDFATS3
  1276.         LSR     XH
  1277.         ROR     XL
  1278.         LSR     XH
  1279.         ROR     XL
  1280.         LSR     XH
  1281.         ROR     XL
  1282.         LSR     XH
  1283.         ROR     XL
  1284. RDFATS3:ANDI    XH,$0F
  1285.         RET
  1286. ;
  1287. ;--------------------------------------
  1288. ;вычисление реального сектора
  1289. ;на входе YX==номер FAT
  1290. ;на выходе YX==адрес сектора
  1291. REALSEC:MOV     DATA,YH
  1292.         OR      DATA,YL
  1293.         OR      DATA,XH
  1294.         OR      DATA,XL
  1295.         BRNE    REALSE1
  1296.         LDIZ    FATSTR1
  1297.         LDSX    SEC_FAT+0
  1298.         LDSY    SEC_FAT+2
  1299.         RJMP    BCDEHLP
  1300. REALSE1:SBIW    XL,2            ;номер кластера-2
  1301.         SBC     YL,NULL
  1302.         SBC     YH,NULL
  1303.         LDS     DATA,BYTSSEC
  1304.         RJMP    REALSE2
  1305. REALSE3:LSL     XL
  1306.         ROL     XH
  1307.         ROL     YL
  1308.         ROL     YH
  1309. REALSE2:LSR     DATA
  1310.         BRCC    REALSE3
  1311.                                 ;умножили на размер кластера
  1312.         LDIZ    STARTRZ
  1313.         RCALL   BCDEHLP         ;прибавили смещение от начала диска
  1314.         LDIZ    FRSTDAT
  1315.         RJMP    BCDEHLP         ;прибавили смещение от начала раздела
  1316. ;
  1317. ;--------------------------------------
  1318. ;YX>>9 (деление на 512)
  1319. BCDE200:MOV     XL,XH
  1320.         MOV     XH,YL
  1321.         MOV     YL,YH
  1322.         LDI     YH,0
  1323.         LDI     DATA,1
  1324. ; - - - - - - - - - - - - - - - - - - -
  1325. ;YXDATA>>до"переноса"
  1326. ;если в DATA вкл.только один бит, то получается
  1327. ;YX=YX/DATA
  1328. BCDE_A1:LSR     YH
  1329.         ROR     YL
  1330.         ROR     XH
  1331.         ROR     XL
  1332. BCDE_A: ROR     DATA
  1333.         BRCC    BCDE_A1
  1334.         RET
  1335. ;
  1336. ;--------------------------------------
  1337. ;YX=[Z]-YX
  1338. BCDEHLM:LD      DATA,Z+
  1339.         SUB     DATA,XL
  1340.         MOV     XL,DATA
  1341.         LD      DATA,Z+
  1342.         SBC     DATA,XH
  1343.         MOV     XH,DATA
  1344.         LD      DATA,Z+
  1345.         SBC     DATA,YL
  1346.         MOV     YL,DATA
  1347.         LD      DATA,Z
  1348.         SBC     DATA,YH
  1349.         MOV     YH,DATA
  1350.         RET
  1351. ;
  1352. ;--------------------------------------
  1353. ;YX=YX+[Z]
  1354. BCDEHLP:LD      DATA,Z+
  1355.         ADD     XL,DATA
  1356.         LD      DATA,Z+
  1357.         ADC     XH,DATA
  1358.         LD      DATA,Z+
  1359.         ADC     YL,DATA
  1360.         LD      DATA,Z
  1361.         ADC     YH,DATA
  1362.         RET
  1363. ;
  1364. ;--------------------------------------
  1365. ;YX=YX+R25R24
  1366. HLDEPBC:ADD     XL,R24
  1367.         ADC     XH,R25
  1368.         ADC     YL,NULL
  1369.         ADC     YH,NULL
  1370.         RET
  1371. ;
  1372. ;--------------------------------------
  1373. ;
  1374. RASCHET:RCALL   BCDE200
  1375.         LDIZ    SEC_FAT
  1376.         RCALL   BCDEHLM
  1377.         MOV     DATA,XL
  1378.         ANDI    DATA,$F0
  1379.         OR      DATA,XH
  1380.         OR      DATA,YL
  1381.         OR      DATA,YH
  1382.         RET
  1383. ;
  1384. ;--------------------------------------
  1385. ;чтение очередного сектора файла в BUFFER
  1386. ;out:   DATA == 0 - считан последний сектор файла
  1387. NEXTSEC:
  1388.         LDI     TEMP,SD_CS0
  1389.         SER     DATA
  1390.         RCALL   FPGA_REG
  1391.  
  1392.         LDIZ    KOL_CLS
  1393.         LD      DATA,Z+
  1394.         LD      TEMP,Z+
  1395.         OR      DATA,TEMP
  1396.         LD      TEMP,Z+
  1397.         OR      DATA,TEMP
  1398.         LD      TEMP,Z+
  1399.         OR      DATA,TEMP
  1400.         BREQ    LSTCLSF
  1401.         LDSX    TFILCLS+0
  1402.         LDSY    TFILCLS+2
  1403.         RCALL   REALSEC
  1404.         LDS     DATA,NUMSECK
  1405.         ADD     XL,DATA
  1406.         ADC     XH,NULL
  1407.         ADC     YL,NULL
  1408.         ADC     YH,NULL
  1409.         RCALL   LOAD_DATA
  1410.         LDSX    TFILCLS+0
  1411.         LDSY    TFILCLS+2
  1412.         LDS     DATA,NUMSECK
  1413.         INC     DATA
  1414.         STS     NUMSECK,DATA
  1415.         LDS     TEMP,BYTSSEC
  1416.         CP      TEMP,DATA
  1417.         BRNE    NEXT_OK
  1418.  
  1419.         STS     NUMSECK,NULL
  1420.         RCALL   RDFATZP
  1421.         STSX    TFILCLS+0
  1422.         STSY    TFILCLS+2
  1423.         LDIZ    KOL_CLS
  1424.         LD      DATA,Z
  1425.         SUBI    DATA,1
  1426.         ST      Z+,DATA
  1427.         LD      DATA,Z
  1428.         SBC     DATA,NULL
  1429.         ST      Z+,DATA
  1430.         LD      DATA,Z
  1431.         SBC     DATA,NULL
  1432.         ST      Z+,DATA
  1433.         LD      DATA,Z
  1434.         SBC     DATA,NULL
  1435.         ST      Z+,DATA
  1436. NEXT_OK:SER     DATA
  1437.         RET
  1438.  
  1439. LSTCLSF:LDSX    TFILCLS+0
  1440.         LDSY    TFILCLS+2
  1441.         RCALL   REALSEC
  1442.         LDS     DATA,NUMSECK
  1443.         ADD     XL,DATA
  1444.         ADC     XH,NULL
  1445.         ADC     YL,NULL
  1446.         ADC     YH,NULL
  1447.         RCALL   LOAD_DATA
  1448.         LDS     DATA,NUMSECK
  1449.         INC     DATA
  1450.         STS     NUMSECK,DATA
  1451.         LDS     TEMP,MPHWOST
  1452.         SUB     DATA,TEMP
  1453.         RET
  1454. ;
  1455. ;--------------------------------------
  1456. ;ошибки
  1457. SD_ERROR:
  1458.         STS     SDERROR,DATA
  1459.         LDI     TEMP,LOW(RAMEND)
  1460.         OUT     SPL,TEMP
  1461.         LDI     TEMP,HIGH(RAMEND)
  1462.         OUT     SPH,TEMP
  1463.  
  1464.         RCALL   UART_NEWLINE
  1465.         LDI     XL,0
  1466.         LDI     XH,4
  1467.         RCALL   SET_CURSOR
  1468.         LDIZ    MSG_SDERROR*2
  1469.         RCALL   PRINTSTRZ
  1470.         LDS     DATA,SDERROR
  1471.         CPI     DATA,1
  1472.         BRNE    SD_ERR2
  1473.         LDIZ    MSG_CARD*2
  1474.         RCALL   PRINTSTRZ
  1475.         RJMP    SD_NOTFOUND
  1476. SD_ERR2:
  1477.         CPI     DATA,2
  1478.         BRNE    SD_ERR3
  1479.         LDIZ    MSG_READERROR*2
  1480.         RCALL   PRINTSTRZ
  1481.         RJMP    SD_ERR9
  1482. SD_ERR3:
  1483.         CPI     DATA,3
  1484.         BRNE    SD_ERR4
  1485.         LDIZ    MSG_FAT*2
  1486.         RCALL   PRINTSTRZ
  1487.         RJMP    SD_NOTFOUND
  1488. SD_ERR4:
  1489.         CPI     DATA,4
  1490.         BRNE    SD_ERR5
  1491.         LDIZ    MSG_FILE*2
  1492.         RCALL   PRINTSTRZ
  1493. SD_NOTFOUND:
  1494.         LDIZ    MSG_NOTFOUND*2
  1495.         RCALL   PRINTSTRZ
  1496.         RJMP    SD_ERR9
  1497. SD_ERR5:
  1498.         CPI     DATA,5
  1499.         BRNE    SD_ERR6
  1500.         LDIZ    MSG_FILE*2
  1501.         RCALL   PRINTSTRZ
  1502.         LDIZ    MSG_EMPTY*2
  1503.         RCALL   PRINTSTRZ
  1504.         RJMP    SD_ERR9
  1505. SD_ERR6:
  1506.         LDIZ    MSG_FILE*2
  1507.         RCALL   PRINTSTRZ
  1508.         LDIZ    MSG_TOOBIG*2
  1509.         RCALL   PRINTSTRZ
  1510. SD_ERR9:
  1511. ;
  1512.         LDS     ZL,SDERROR
  1513. SD_ERR1:LED_ON
  1514.         LDI     DATA,5
  1515.         RCALL   BEEP
  1516.         LED_OFF
  1517.         LDI     DATA,5
  1518.         RCALL   DELAY
  1519.         DEC     ZL
  1520.         BRNE    SD_ERR1
  1521. ;
  1522.         RCALL   UART_NEWLINE
  1523.         LDI     XL,0
  1524.         LDI     XH,6
  1525.         RCALL   SET_CURSOR
  1526.         LDIZ    MSG_HALT*2
  1527.         RCALL   PRINTSTRZ
  1528.         CBI     DDRE,6
  1529. STOP2:  RJMP    STOP2
  1530. ;
  1531. ;======================================
  1532. ;чтение ID Flash-ROM чипа
  1533. ;out:   ZL,ZH
  1534. F_ID:   RCALL   F_RST
  1535.         LDI     DATA,$90
  1536.         RCALL   F_CMD
  1537.         LDI     TEMP,FLASH_CTRL
  1538.         LDI     DATA,0B00000011
  1539.         RCALL   FPGA_REG
  1540.         LDI     XL,$00
  1541.         LDI     XH,$00
  1542.         LDI     YL,$00
  1543.         RCALL   F_IN
  1544.         MOV     ZL,DATA
  1545.         LDI     XL,$01
  1546.         RCALL   F_IN
  1547.         MOV     ZH,DATA
  1548.         RJMP    F_RST
  1549. ;
  1550. ;--------------------------------------
  1551. ;запись одного байта во Flash-ROM
  1552. ;in:    RAM[Z] == data
  1553. ;       XL,XH,YL == address
  1554. F_WRITE:LDI     DATA,$A0
  1555.         RCALL   F_CMD
  1556.         LDI     TEMP,FLASH_CTRL
  1557.         LDI     DATA,0B00000001
  1558.         RCALL   FPGA_REG
  1559.         LDI     TEMP,FLASH_LOADDR
  1560.         MOV     DATA,XL
  1561.         RCALL   FPGA_REG
  1562.         LDI     TEMP,FLASH_MIDADDR
  1563.         MOV     DATA,XH
  1564.         RCALL   FPGA_REG
  1565.         LDI     TEMP,FLASH_HIADDR
  1566.         MOV     DATA,YL
  1567.         RCALL   FPGA_REG
  1568.         LDI     TEMP,FLASH_DATA
  1569.         LD      DATA,Z
  1570.         RCALL   FPGA_REG
  1571.         LDI     TEMP,FLASH_CTRL
  1572.         LDI     DATA,0B00000101
  1573.         RCALL   FPGA_REG
  1574.         LDI     DATA,0B00000001
  1575.         RCALL   FPGA_SAME_REG
  1576.         LDI     DATA,0B00000011
  1577.         RCALL   FPGA_SAME_REG
  1578.         LDI     TEMP,FLASH_DATA
  1579.         RCALL   FPGA_REG
  1580. F_WRIT1:RCALL   FPGA_SAME_REG
  1581.         LD      TEMP,Z
  1582.         EOR     DATA,TEMP
  1583.         SBRC    DATA,7
  1584.         RJMP    F_WRIT1
  1585.         RET
  1586. ;
  1587. ;--------------------------------------
  1588. ;стирание Flash-ROM
  1589. F_ERASE:LDI     DATA,$80
  1590.         RCALL   F_CMD
  1591.         LDI     DATA,$10
  1592.         RCALL   F_CMD
  1593.         LDI     TEMP,FLASH_CTRL
  1594.         LDI     DATA,0B00000011
  1595.         RCALL   FPGA_REG
  1596.         LDI     TEMP,FLASH_DATA
  1597.         RCALL   FPGA_REG
  1598. F_ERAS1:LED_OFF
  1599.         RCALL   FPGA_SAME_REG
  1600.         LED_ON
  1601.         SBRS    DATA,7
  1602.         RJMP    F_ERAS1
  1603. ;
  1604. ; - - - - - - - - - - - - - - - - - - -
  1605. ;сброс Flash-ROM чипа
  1606. F_RST:  LDI     DATA,$F0
  1607.         RCALL   F_CMD
  1608.         LDI     TEMP,19 ;~5 us @ 11.0592 MHz
  1609. F_RST1: DEC     TEMP    ;1
  1610.         BRNE    F_RST1  ;2
  1611.         RET
  1612. ;
  1613. ;--------------------------------------
  1614. ;комманда в Flash-ROM чип
  1615. ;in:    DATA == instructions
  1616. F_CMD:  PUSH    DATA
  1617.         LDI     TEMP,FLASH_CTRL
  1618.         LDI     DATA,0B00000001
  1619.         RCALL   FPGA_REG
  1620.         LDI     TEMP,FLASH_LOADDR
  1621.         LDI     DATA,$55
  1622.         RCALL   FPGA_REG
  1623.         LDI     TEMP,FLASH_MIDADDR
  1624.         LDI     DATA,$55
  1625.         RCALL   FPGA_REG
  1626.         LDI     TEMP,FLASH_DATA
  1627.         LDI     DATA,$AA
  1628.         RCALL   FPGA_REG
  1629.         LDI     TEMP,FLASH_CTRL
  1630.         LDI     DATA,0B00000101
  1631.         RCALL   FPGA_REG
  1632.         LDI     DATA,0B00000001
  1633.         RCALL   FPGA_SAME_REG
  1634.         LDI     TEMP,FLASH_LOADDR
  1635.         LDI     DATA,$AA
  1636.         RCALL   FPGA_REG
  1637.         LDI     TEMP,FLASH_MIDADDR
  1638.         LDI     DATA,$2A
  1639.         RCALL   FPGA_REG
  1640.         LDI     TEMP,FLASH_DATA
  1641.         LDI     DATA,$55
  1642.         RCALL   FPGA_REG
  1643.         LDI     TEMP,FLASH_CTRL
  1644.         LDI     DATA,0B00000101
  1645.         RCALL   FPGA_REG
  1646.         LDI     DATA,0B00000001
  1647.         RCALL   FPGA_SAME_REG
  1648.         LDI     TEMP,FLASH_LOADDR
  1649.         LDI     DATA,$55
  1650.         RCALL   FPGA_REG
  1651.         LDI     TEMP,FLASH_MIDADDR
  1652.         LDI     DATA,$55
  1653.         RCALL   FPGA_REG
  1654.         LDI     TEMP,FLASH_DATA
  1655.         POP     DATA
  1656.         RCALL   FPGA_REG
  1657.         LDI     TEMP,FLASH_CTRL
  1658.         LDI     DATA,0B00000101
  1659.         RCALL   FPGA_REG
  1660.         LDI     DATA,0B00000001
  1661.         RJMP    FPGA_SAME_REG
  1662. ;
  1663. ;--------------------------------------
  1664. ;чтение одного байта Flash-ROM
  1665. ;in:    XL,XH,YL == address
  1666. ;out:   DATA == data
  1667. F_IN:   LDI     TEMP,FLASH_LOADDR
  1668.         MOV     DATA,XL
  1669.         RCALL   FPGA_REG
  1670.         LDI     TEMP,FLASH_MIDADDR
  1671.         MOV     DATA,XH
  1672.         RCALL   FPGA_REG
  1673.         LDI     TEMP,FLASH_HIADDR
  1674.         MOV     DATA,YL
  1675.         RCALL   FPGA_REG
  1676.         LDI     TEMP,FLASH_DATA
  1677.         LDI     DATA,$FF
  1678.         RJMP    FPGA_REG
  1679. ;
  1680. ;--------------------------------------
  1681. ;обмен с регистрами в FPGA
  1682. ;in:    TEMP == номер регистра
  1683. ;       DATA == данные
  1684. ;out:   DATA == данные
  1685. FPGA_REG:
  1686.         PUSH    DATA
  1687.         SPICS_SET
  1688.         OUT     SPDR,TEMP
  1689.         RCALL   RD_WHEN_RDY
  1690.         POP     DATA
  1691. ;обмен без установки регистра
  1692. ;in:    DATA == данные
  1693. ;out:   DATA == данные
  1694. FPGA_SAME_REG:
  1695.         SPICS_CLR
  1696.         OUT     SPDR,DATA
  1697. ;ожидание окончания обмена с FPGA по SPI
  1698. ;и чтение пришедших данных
  1699. ;out:   DATA == данные
  1700. RD_WHEN_RDY:
  1701.         SBIS    SPSR,SPIF
  1702.         RJMP    RD_WHEN_RDY
  1703.         IN      DATA,SPDR
  1704.         SPICS_SET
  1705.         RET
  1706. ;
  1707. ;--------------------------------------
  1708. ;
  1709. UART_NEWLINE:
  1710.         LDIZ    MSG_NEWLINE*2
  1711. ;
  1712. ; - - - - - - - - - - - - - - - - - - -
  1713. ;вывод строки на UART
  1714. ;in:    Z == указательна строку (в младших 64K)
  1715. UART_PRINTSTRZ:
  1716. UPSTRZ1:LPM     DATA,Z+
  1717.         TST     DATA
  1718.         BREQ    UPSTRZ2
  1719.         RCALL   UART_PUTCHAR
  1720.         RJMP    UPSTRZ1
  1721. UPSTRZ2:RET
  1722. ;
  1723. ;--------------------------------------
  1724. ;установка позиции печати на экране
  1725. ;in:    XL == x (0..31)
  1726. ;       XH == y (0..23)
  1727. SET_CURSOR:
  1728.         LDI     TEMP,32
  1729.         MUL     XH,TEMP
  1730.         CLR     XH
  1731.         ADD     XL,R0
  1732.         ADC     XH,R1
  1733.         SBIW    XL,1
  1734.         LDI     TEMP,SCR_LOADDR
  1735.         MOV     DATA,XL
  1736.         RCALL   FPGA_REG
  1737.         LDI     TEMP,SCR_HIADDR
  1738.         MOV     DATA,XH
  1739.         RJMP    FPGA_REG
  1740. ;
  1741. ;--------------------------------------
  1742. ;вывод строки на экран и на UART
  1743. ;in:    Z == указательна строку (в младших 64K)
  1744. PRINTSTRZ:
  1745. PRSTRZ1:LPM     DATA,Z+
  1746.         TST     DATA
  1747.         BREQ    PRSTRZ2
  1748.         RCALL   PUTCHAR
  1749.         RJMP    PRSTRZ1
  1750. PRSTRZ2:RET
  1751. ;
  1752. ;--------------------------------------
  1753. ;out byte in dec
  1754. ;in:    DATA == byte (0..99)
  1755. DECBYTE:SUBI    DATA,208
  1756.         SBRS    DATA,7
  1757.         SUBI    DATA,48
  1758.         SUBI    DATA,232
  1759.         SBRS    DATA,6
  1760.         SUBI    DATA,24
  1761.         SUBI    DATA,244
  1762.         SBRS    DATA,5
  1763.         SUBI    DATA,12
  1764.         SUBI    DATA,250
  1765.         SBRS    DATA,4
  1766.         SUBI    DATA,6
  1767. ;
  1768. ; - - - - - - - - - - - - - - - - - - -
  1769. ;out byte in hex
  1770. ;in:    DATA == byte
  1771. HEXBYTE:PUSH    DATA
  1772.         SWAP    DATA
  1773.         RCALL   HEXHALF
  1774.         POP     DATA
  1775. HEXHALF:ANDI    DATA,$0F
  1776.         CPI     DATA,$0A
  1777.         BRCS    HEXBYT1
  1778.         ADDI    DATA,$07
  1779. HEXBYT1:ADDI    DATA,$30
  1780. ;
  1781. ; - - - - - - - - - - - - - - - - - - -
  1782. ;вывод символа на экран и на UART
  1783. ;in:    DATA == char
  1784. PUTCHAR:PUSH    DATA
  1785.         PUSH    TEMP
  1786.         LDI     TEMP,SCR_CHAR
  1787.         RCALL   FPGA_REG
  1788.         POP     TEMP
  1789.         POP     DATA
  1790. UART_PUTCHAR:
  1791.         PUSH    TEMP
  1792. UPCHR1: INPORT  TEMP,UCSR1A
  1793.         SBRS    TEMP,UDRE
  1794.         RJMP    UPCHR1
  1795.         OUTPORT UDR1,DATA
  1796.         POP     TEMP
  1797.         RET
  1798. ;
  1799. ;--------------------------------------
  1800. ;in:    DATA == продолжительность *0.1 сек
  1801. BEEP:
  1802. BEE2:   LDI     TEMP,100;100 периодов 1кГц
  1803. BEE1:   CBI     PORTE,6
  1804.         RCALL   BEEPDLY
  1805.         SBI     PORTE,6
  1806.         RCALL   BEEPDLY
  1807.         DEC     TEMP
  1808.         BRNE    BEE1
  1809.         DEC     DATA
  1810.         BRNE    BEE2
  1811.         RET
  1812.  
  1813. BEEPDLY:LDI     R24,$64
  1814.         LDI     R25,$05
  1815. BEEPDL1:SBIW    R24,1
  1816.         BRNE    BEEPDL1
  1817.         RET
  1818. ;
  1819. ;--------------------------------------
  1820. ;in:    DATA == продолжительность *0.1 сек
  1821. DELAY:  LDI     R20,$1E ;\
  1822.         LDI     R21,$FE ;/ 0,1 сек @ 11.0592MHz
  1823. DELAY1: LPM             ;3
  1824.         LPM             ;3
  1825.         LPM             ;3
  1826.         LPM             ;3
  1827.         SUBI    R20,1   ;1
  1828.         SBCI    R21,0   ;1
  1829.         SBCI    DATA,0  ;1
  1830.         BRNE    DELAY1  ;2(1)
  1831.         RET
  1832. ;
  1833. ;--------------------------------------
  1834. ;
  1835.