Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?


AVRA   Ver. 1.2.3 evoflash.asm Mon Nov 14 18:42:55 2011


          .LIST
          .LISTMAC
         
          .DEF    FF_FL   =R08
          .DEF    FF      =R13    ;всегда = $FF
          .DEF    ONE     =R14    ;всегда = $01
          .DEF    NULL    =R15    ;всегда = $00
          .DEF    DATA    =R16
          .DEF    TEMP    =R17
          .DEF    COUNT   =R18
          .DEF    BITS    =R19
         ;локально используются: R0,R1,R20,R21,R24,R25
         
          .EQU    DBSIZE_HI       =HIGH(4096)
          .EQU    DBMASK_HI       =HIGH(4095)
          .EQU    nCONFIG         =PORTF0
          .EQU    nSTATUS         =PORTF1
          .EQU    CONF_DONE       =PORTF2
         
          .EQU    CMD_17          =$51    ;read_single_block
          .EQU    ACMD_41         =$69    ;sd_send_op_cond
         
          .EQU    SD_CS0          =$57
          .EQU    SD_CS1          =$5F
          .EQU    FLASH_LOADDR    =$F0
          .EQU    FLASH_MIDADDR   =$F1
          .EQU    FLASH_HIADDR    =$F2
          .EQU    FLASH_DATA      =$F3
          .EQU    FLASH_CTRL      =$F4
          .EQU    SCR_LOADDR      =$40
          .EQU    SCR_HIADDR      =$41
          .EQU    SCR_CHAR        =$44
          .EQU    SCR_MODE        =$4E
         ;
         ;--------------------------------------
         ;
          .DSEG
                  .ORG    $0100
          BUFFER:
                  .ORG    $0300
          BUF4FAT:
                  .ORG    $0500
D:000500    CAL_FAT:.BYTE   1       ;тип обнаруженной FAT
D:000501    MANYFAT:.BYTE   1       ;количество FAT-таблиц
D:000502    BYTSSEC:.BYTE   1       ;количество секторов в кластере
D:000503    ROOTCLS:.BYTE   4       ;сектор начала root директории
D:000507    SEC_FAT:.BYTE   4       ;количество секторов одной FAT
D:00050b    RSVDSEC:.BYTE   2       ;размер резервной области
D:00050d    STARTRZ:.BYTE   4       ;начало диска/раздела
D:000511    FRSTDAT:.BYTE   4       ;адрес первого сектора данных от BPB
D:000515    SEC_DSC:.BYTE   4       ;количество секторов на диске/разделе
D:000519    CLS_DSC:.BYTE   4       ;количество кластеров на диске/разделе
D:00051d    FATSTR0:.BYTE   4       ;начало первой FAT таблицы
D:000521    FATSTR1:.BYTE   4       ;начало второй FAT таблицы
D:000525    TEK_DIR:.BYTE   4       ;кластер текущей директории
D:000529    KCLSDIR:.BYTE   1       ;кол-во кластеров директории
D:00052a    NUMSECK:.BYTE   1       ;счетчик секторов в кластере
D:00052b    TFILCLS:.BYTE   4       ;текущий кластер
D:00052f    MPHWOST:.BYTE   1       ;кол-во секторов в последнем кластере
D:000530    KOL_CLS:.BYTE   4       ;кол-во кластеров файла минус 1
D:000534    ZTFILCLS:.BYTE  4
D:000538    ZMPHWOST:.BYTE  1
D:000539    ZKOL_CLS:.BYTE  4
D:00053d    SDERROR:.BYTE   1
          LASTSECFLAG:
D:00053e            .BYTE   1
D:00053f    F_ADDR0:.BYTE   1
D:000540    F_ADDR1:.BYTE   1
D:000541    F_ADDR2:.BYTE   1
D:000542    ERRFLG1:.BYTE   1
D:000543    ERRFLG2:.BYTE   1
         ;
         ;--------------------------------------
         ;
          .CSEG
                  .ORG    0
C:000000 940c 1525         JMP     START
C:000002 940c 1525         JMP     START   ;EXT_INT0       ; IRQ0 Handler
C:000004 940c 1525         JMP     START   ;EXT_INT1       ; IRQ1 Handler
C:000006 940c 1525         JMP     START   ;EXT_INT2       ; IRQ2 Handler
C:000008 940c 1525         JMP     START   ;EXT_INT3       ; IRQ3 Handler
C:00000a 940c 1525         JMP     START   ;EXT_INT4       ; IRQ4 Handler
C:00000c 940c 1525         JMP     START   ;EXT_INT5       ; IRQ5 Handler
C:00000e 940c 1525         JMP     START   ;EXT_INT6       ; IRQ6 Handler
C:000010 940c 1525         JMP     START   ;EXT_INT7       ; IRQ7 Handler
C:000012 940c 1525         JMP     START   ;TIM2_COMP      ; Timer2 Compare Handler
C:000014 940c 1525         JMP     START   ;TIM2_OVF       ; Timer2 Overflow Handler
C:000016 940c 1525         JMP     START   ;TIM1_CAPT      ; Timer1 Capture Handler
C:000018 940c 1525         JMP     START   ;TIM1_COMPA     ; Timer1 CompareA Handler
C:00001a 940c 1525         JMP     START   ;TIM1_COMPB     ; Timer1 CompareB Handler
C:00001c 940c 1525         JMP     START   ;TIM1_OVF       ; Timer1 Overflow Handler
C:00001e 940c 1525         JMP     START   ;TIM0_COMP      ; Timer0 Compare Handler
C:000020 940c 1525         JMP     START   ;TIM0_OVF       ; Timer0 Overflow Handler
C:000022 940c 1525         JMP     START   ;SPI_STC        ; SPI Transfer Complete Handler
C:000024 940c 1525         JMP     START   ;USART0_RXC     ; USART0 RX Complete Handler
C:000026 940c 1525         JMP     START   ;USART0_DRE     ; USART0,UDR Empty Handler
C:000028 940c 1525         JMP     START   ;USART0_TXC     ; USART0 TX Complete Handler
C:00002a 940c 1525         JMP     START   ;ADC            ; ADC Conversion Complete Handler
C:00002c 940c 1525         JMP     START   ;EE_RDY         ; EEPROM Ready Handler
C:00002e 940c 1525         JMP     START   ;ANA_COMP       ; Analog Comparator Handler
C:000030 940c 1525         JMP     START   ;TIM1_COMPC     ; Timer1 CompareC Handler
C:000032 940c 1525         JMP     START   ;TIM3_CAPT      ; Timer3 Capture Handler
C:000034 940c 1525         JMP     START   ;TIM3_COMPA     ; Timer3 CompareA Handler
C:000036 940c 1525         JMP     START   ;TIM3_COMPB     ; Timer3 CompareB Handler
C:000038 940c 1525         JMP     START   ;TIM3_COMPC     ; Timer3 CompareC Handler
C:00003a 940c 1525         JMP     START   ;TIM3_OVF       ; Timer3 Overflow Handler
C:00003c 940c 1525         JMP     START   ;USART1_RXC     ; USART1 RX Complete Handler
C:00003e 940c 1525         JMP     START   ;USART1_DRE     ; USART1,UDR Empty Handler
C:000040 940c 1525         JMP     START   ;USART1_TXC     ; USART1 TX Complete Handler
C:000042 940c 1525         JMP     START   ;TWI_INT        ; Two-wire Serial Interface Interrupt Handler
C:000044 940c 1525         JMP     START   ;SPM_RDY        ; SPM Ready Handler
         ;
         ;--------------------------------------
         ;
          MSG_CFGFPGA:
                  .DB     $0D,$0A,$0A,$0A,"Load FPGA configuration... ",0
C:000046 0D0A0A0A4C6F6164204650474120636F6E66696775726174696F6E2E2E2E2000
          MSG_OK:
                  .DB     "Ok!",$0A
C:000056 4F6B210A
          MSG_NEWLINE:
                  .DB     $0D,$0A,0,0
C:000058 0D0A0000
         ;
          MSG_TITLE:
                  .DB     "  ZX Evolution Flasher ",0
C:00005A 20205A582045766F6C7574696F6E20466C61736865722000
          MSG_ID_FLASH:
                  .DB     "ID flash memory chip: ",0,0
C:000066 494420666C617368206D656D6F727920636869703A200000
          MSG_OPENFILE:
                  .DB     "Open file from SD-card...",0
C:000072 4F70656E2066696C652066726F6D2053442D636172642E2E2E00
          MSG_SDERROR:
                  .DB     "SD error: ",0,0
C:00007F 5344206572726F723A200000
          MSG_CARD:
                  .DB     "Card",0,0
C:000085 436172640000
          MSG_READERROR:
                  .DB     "Read error",0,0
C:000088 52656164206572726F720000
          MSG_FAT:
                  .DB     "FAT",0
C:00008E 46415400
          MSG_FILE:
                  .DB     "File",0,0
C:000090 46696C650000
          MSG_NOTFOUND:
                  .DB     " not found",0,0
C:000093 206E6F7420666F756E640000
          MSG_EMPTY:
                  .DB     " empty",0,0
C:000099 20656D7074790000
          MSG_TOOBIG:
                  .DB     " too big",0,0
C:00009D 20746F6F206269670000
          MSG_F_ERASE:
                  .DB     "Erase...",0,0
C:0000A2 45726173652E2E2E0000
          MSG_F_WRITE:
                  .DB     "Write...",0,0
C:0000A7 57726974652E2E2E0000
          MSG_F_CHECK:
                  .DB     "Check...",0,0
C:0000AC 436865636B2E2E2E0000
          MSG_F_COMPLETE:
                  .DB     "Successfully complete.",0,0
C:0000B1 5375636365737366756C6C7920636F6D706C6574652E0000
          MSG_F_ERROR:
                  .DB     "ERROR!",0,0
C:0000BD 4552524F52210000
          MSG_HALT:
                  .DB     "HALT!",0
C:0000C1 48414C542100
         ;
          CMD00:  .DB     $40,$00,$00,$00,$00,$95
C:0000C4 400000000095
          CMD08:  .DB     $48,$00,$00,$01,$AA,$87
C:0000C7 48000001AA87
          CMD16:  .DB     $50,$00,$00,$02,$00,$FF
C:0000CA 5000000200FF
          CMD55:  .DB     $77,$00,$00,$00,$00,$FF ;app_cmd
C:0000CD 7700000000FF
          CMD58:  .DB     $7A,$00,$00,$00,$00,$FF ;read_ocr
C:0000D0 7A00000000FF
          CMD59:  .DB     $7B,$00,$00,$00,$00,$FF ;crc_on_off
C:0000D3 7B00000000FF
          FILENAME:
                  .DB     "ZXEVO   ROM",0
C:0000D6 5A5845564F202020524F4D00
         ;
          PACKED_FPGA:
          .LIST
          .INCLUDE "_NVRAM.ASM"
         ;
         ;--------------------------------------
         ;
          .EQU    RTC_ADDRESS             =$A0    ; Address of PCF8583 RTC chip.
          .EQU    RTC_COMMON_MODE_REG     =$FE    ; RTC's register for common modes.
         ;.EQU    MODE_VGA                =$01    ; VGA mode (0 - not set/1 - set).
         
          .EQU    TW_START                =$08
          .EQU    TW_REP_START            =$10
          .EQU    TW_MT_SLA_ACK           =$18
          .EQU    TW_MT_DATA_ACK          =$28
          .EQU    TW_MR_SLA_ACK           =$40
         
          .MACRO  TW_SEND_STOP
                  LDI     TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
                  STS     TWCR,TEMP
          .ENDMACRO
         ;
         ;--------------------------------------
         ;out:   DATA == mode (bit.0 - CLR == TV mode, SET == VGA mode)
          NVRAM_READ_MODE:
         ;init i2c
         ;SCL frequency = CPU clk/ ( 16 + 2* (TWBR) * 4^(TWPS) )
         ;11052000 / (16 + 2*48 ) = 98678,5Hz (100000Hz recommended for PCF8583)
C:0014d6 92f0 0071         STS     TWSR,NULL
C:0014d8 e310              LDI     TEMP,48
C:0014d9 9310 0070         STS     TWBR,TEMP
         
         ;reset RTC
         ;write 0 to control/status register [0] on PCF8583
         
C:0014db d027              RCALL   TW_SEND_START
C:0014dc 7108              ANDI    DATA,TW_START|TW_REP_START
C:0014dd f051              BREQ    RTC_ERROR1
         
C:0014de ea00              LDI     DATA,RTC_ADDRESS
C:0014df d02e              RCALL   TW_SEND_ADDR
C:0014e0 3108              CPI     DATA,TW_MT_SLA_ACK
C:0014e1 f431              BRNE    RTC_ERROR1
         
C:0014e2 e000              LDI     DATA,0
C:0014e3 d02a              RCALL   TW_SEND_DATA
C:0014e4 3208              CPI     DATA,TW_MT_DATA_ACK
C:0014e5 f411              BRNE    RTC_ERROR1
         
C:0014e6 e000              LDI     DATA,0
C:0014e7 d026              RCALL   TW_SEND_DATA
          RTC_ERROR1:
C:0014e8   +          TW_SEND_STOP
C:0014e8 e914      LDI     TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
C:0014e9 9310 0074 STS     TWCR,TEMP
         
         ;restore mode register from NVRAM
         
C:0014eb d017              RCALL   TW_SEND_START
C:0014ec 7108              ANDI    DATA,TW_START|TW_REP_START
C:0014ed f081              BREQ    RTC_ERROR2
         
C:0014ee ea00              LDI     DATA,RTC_ADDRESS
C:0014ef d01e              RCALL   TW_SEND_ADDR
C:0014f0 3108              CPI     DATA,TW_MT_SLA_ACK
C:0014f1 f461              BRNE    RTC_ERROR2
         
C:0014f2 ef0e              LDI     DATA,RTC_COMMON_MODE_REG
C:0014f3 d01a              RCALL   TW_SEND_DATA
C:0014f4 3208              CPI     DATA,TW_MT_DATA_ACK
C:0014f5 f441              BRNE    RTC_ERROR2
         
C:0014f6 d00c              RCALL   TW_SEND_START
C:0014f7 3100              CPI     DATA,TW_REP_START
         
C:0014f8 ea01              LDI     DATA,RTC_ADDRESS|$01
C:0014f9 d014              RCALL   TW_SEND_ADDR
C:0014fa 3400              CPI     DATA,TW_MR_SLA_ACK
C:0014fb f411              BRNE    RTC_ERROR2
         
C:0014fc d01e              RCALL   TW_READ_DATA
C:0014fd c001              RJMP    RTC_OK2
          RTC_ERROR2:
C:0014fe e000              LDI     DATA,0
          RTC_OK2:
C:0014ff   +          TW_SEND_STOP
C:0014ff e914      LDI     TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
C:001500 9310 0074 STS     TWCR,TEMP
C:001502 9508              RET
         ;
         ;--------------------------------------
         ;out:   DATA == i2c status
          TW_SEND_START:
         ;start transmit
C:001503 ea04              LDI     DATA,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
C:001504 9300 0074         STS     TWCR,DATA
         ;wait for flag
          TW_SS_WAIT:
C:001506 9100 0074         LDS     DATA,TWCR
C:001508 ff07              SBRS    DATA,TWINT
C:001509 cffc              RJMP    TW_SS_WAIT
         ;return status
C:00150a 9100 0071         LDS     DATA,TWSR
C:00150c 7f08              ANDI    DATA,$F8
C:00150d 9508              RET
         ;
         ;--------------------------------------
         ;in:    DATA == data/address
         ;out:   DATA == i2c status
          TW_SEND_ADDR:
          TW_SEND_DATA:
         ;set data/address
C:00150e 9300 0073         STS     TWDR,DATA
         ;enable transmit
C:001510 e804              LDI     DATA,(1<<TWINT)|(1<<TWEN)
C:001511 9300 0074         STS     TWCR,DATA
         ;wait for end transmit
          TW_SD_WAIT:
C:001513 9100 0074         LDS     DATA,TWCR
C:001515 ff07              SBRS    DATA,TWINT
C:001516 cffc              RJMP    TW_SD_WAIT
         ;return status
C:001517 9100 0071         LDS     DATA,TWSR
C:001519 7f08              ANDI    DATA,$F8
C:00151a 9508              RET
         ;
         ;--------------------------------------
         ;out:   DATA == data
          TW_READ_DATA:
         ;enable transmit
C:00151b e804              LDI     DATA,(1<<TWINT)|(1<<TWEN)
C:00151c 9300 0074         STS     TWCR,DATA
         ;wait for flag set
          TW_RD_WAIT:
C:00151e 9100 0074         LDS     DATA,TWCR
C:001520 ff07              SBRS    DATA,TWINT
C:001521 cffc              RJMP    TW_RD_WAIT
         ;get data
C:001522 9100 0073         LDS     DATA,TWDR
         ;NOT return status
         ;        LDS     DATA,TWSR
         ;        ANDI    DATA,$F8
C:001524 9508              RET
         ;
         ;--------------------------------------
         ;
          ;
         ;
         ;--------------------------------------
         ;
C:001525 94f8      START:  CLI
C:001526 24ff              CLR     NULL
C:001527 e011              LDI     TEMP,$01
C:001528 2ee1              MOV     ONE,TEMP
C:001529 ef1f              LDI     TEMP,$FF
C:00152a 2ed1              MOV     FF,TEMP
         ;WatchDog OFF
C:00152b e11f              LDI     TEMP,0B00011111
C:00152c bd11              OUT     WDTCR,TEMP
C:00152d bcf1              OUT     WDTCR,NULL
         
C:00152e bef4              OUT     MCUCSR,NULL
         ;
C:00152f ef1f              LDI     TEMP,LOW(RAMEND)
C:001530 bf1d              OUT     SPL,TEMP
C:001531 e110              LDI     TEMP,HIGH(RAMEND)
C:001532 bf1e              OUT     SPH,TEMP
         ;
C:001533 beeb              OUT     RAMPZ,ONE
         ;
C:001534 ef1f              LDI     TEMP,      0B11111111
C:001535   +          OUTPORT PORTG,TEMP
C:001535 9310 0065 STS     PORTG+$20*(PORTG<$40),TEMP
C:001537 e010              LDI     TEMP,      0B00000000
C:001538   +          OUTPORT DDRG,TEMP
C:001538 9310 0064 STS     DDRG+$20*(DDRG<$40),TEMP
         
C:00153a e018              LDI     TEMP,      0B00001000
C:00153b   +          OUTPORT PORTF,TEMP
C:00153b 9310 0062 STS     PORTF+$20*(PORTF<$40),TEMP
C:00153d   +          OUTPORT DDRF,TEMP
C:00153d 9310 0061 STS     DDRF+$20*(DDRF<$40),TEMP
         
C:00153f ef13              LDI     TEMP,      0B11110011
C:001540 b913              OUT     PORTE,TEMP
C:001541 e010              LDI     TEMP,      0B00000000
C:001542 b912              OUT     DDRE,TEMP
         
C:001543 ef1f              LDI     TEMP,      0B11111111
C:001544 bb12              OUT     PORTD,TEMP
C:001545 e010              LDI     TEMP,      0B00000000
C:001546 bb11              OUT     DDRD,TEMP
         
C:001547 ed1f              LDI     TEMP,      0B11011111
C:001548 bb15              OUT     PORTC,TEMP
C:001549 e010              LDI     TEMP,      0B00000000
C:00154a bb14              OUT     DDRC,TEMP
         
C:00154b ef19              LDI     TEMP,      0B11111001
C:00154c bb18              OUT     PORTB,TEMP
C:00154d e817              LDI     TEMP,      0B10000111
C:00154e bb17              OUT     DDRB,TEMP
         
C:00154f ef1f              LDI     TEMP,      0B11111111
C:001550 bb1b              OUT     PORTA,TEMP
C:001551 e010              LDI     TEMP,      0B00000000
C:001552 bb1a              OUT     DDRA,TEMP
         ;UART1 Set baud rate
C:001553   +          OUTPORT UBRR1H,NULL
C:001553 92f0 0098 STS     UBRR1H+$20*(UBRR1H<$40),NULL
C:001555 e015              LDI     TEMP,5     ;115200 baud @ 11059.2 kHz, Normal speed
C:001556   +          OUTPORT UBRR1L,TEMP
C:001556 9310 0099 STS     UBRR1L+$20*(UBRR1L<$40),TEMP
         ;UART1 Normal Speed
C:001558   +          OUTPORT UCSR1A,NULL
C:001558 92f0 009b STS     UCSR1A+$20*(UCSR1A<$40),NULL
         ;UART1 data8bit, 2stopbits
C:00155a e01e              LDI     TEMP,(1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS)
C:00155b   +          OUTPORT UCSR1C,TEMP
C:00155b 9310 009d STS     UCSR1C+$20*(UCSR1C<$40),TEMP
         ;UART1 Разрешаем передачу
C:00155d e018              LDI     TEMP,(1<<TXEN)
C:00155e   +          OUTPORT UCSR1B,TEMP
C:00155e 9310 009a STS     UCSR1B+$20*(UCSR1B<$40),TEMP
         ;SPI init
C:001560 e011              LDI     TEMP,(1<<SPI2X)
C:001561 b91e              OUT     SPSR,TEMP
C:001562 e710              LDI     TEMP,(1<<SPE)|(1<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
C:001563 b91d              OUT     SPCR,TEMP
         ;ждём включения ATX, а потом ещё чуть-чуть.
C:001564 9b00      UP11:   SBIS    PINF,0 ;PINC,5 ; а если powergood нет вообще ?
C:001565 cffe              RJMP    UP11
C:001566 e005              LDI     DATA,5
C:001567 d631              RCALL   DELAY
         
C:001568   +          LDIZ    MSG_CFGFPGA*2
C:001568 e8ec      LDI     ZL,LOW(MSG_CFGFPGA*2)
C:001569 e0f0      LDI     ZH,HIGH(MSG_CFGFPGA*2)
C:00156a d5e3              RCALL   UART_PRINTSTRZ
         ;загрузка FPGA
C:00156b   +          INPORT  TEMP,DDRF
C:00156b 9110 0061 LDS     TEMP,DDRF+$20*(DDRF<$40)
C:00156d 6011              SBR     TEMP,(1<<nCONFIG)
C:00156e   +          OUTPORT DDRF,TEMP
C:00156e 9310 0061 STS     DDRF+$20*(DDRF<$40),TEMP
         
C:001570 e913              LDI     TEMP,147 ;40 us @ 11.0592 MHz
C:001571 951a      LDFPGA1:DEC     TEMP    ;1
C:001572 f7f1              BRNE    LDFPGA1 ;2
         
C:001573   +          INPORT  TEMP,DDRF
C:001573 9110 0061 LDS     TEMP,DDRF+$20*(DDRF<$40)
C:001575 7f1e              CBR     TEMP,(1<<nCONFIG)
C:001576   +          OUTPORT DDRF,TEMP
C:001576 9310 0061 STS     DDRF+$20*(DDRF<$40),TEMP
         
C:001578 9b01      LDFPGA2:SBIS    PINF,nSTATUS
C:001579 cffe              RJMP    LDFPGA2
         
C:00157a   +          LDIZ    PACKED_FPGA*2
C:00157a ebe8      LDI     ZL,LOW(PACKED_FPGA*2)
C:00157b e0f1      LDI     ZH,HIGH(PACKED_FPGA*2)
C:00157c   +          LDIY    BUFFER
C:00157c e0c0      LDI     YL,LOW(BUFFER)
C:00157d e0d1      LDI     YH,HIGH(BUFFER)
         ;(не трогаем стек! всё ОЗУ под буфер)
C:00157e e810              LDI     TEMP,$80
C:00157f 9005      MS:     LPM     R0,Z+
C:001580 9209              ST      Y+,R0
         ;-begin-PUT_BYTE_1---
C:001581 b80f              OUT     SPDR,R0
C:001582 9b77      PUTB1:  SBIS    SPSR,SPIF
C:001583 cffe              RJMP    PUTB1
         ;-end---PUT_BYTE_1---
C:001584 50d1              SUBI    YH,HIGH(BUFFER) ;
C:001585 70df              ANDI    YH,DBMASK_HI    ;Y warp
C:001586   +          ADDI    YH,HIGH(BUFFER) ;
C:001586 5fdf      SUBI    YH,(-HIGH(BUFFER)&$FF)
C:001587 e052      M0:     LDI     R21,$02
C:001588 ef4f              LDI     R20,$FF
          M1:
C:001589 0f11      M1X:    ADD     TEMP,TEMP
C:00158a f411              BRNE    M2
C:00158b 9115              LPM     TEMP,Z+
C:00158c 1f11              ROL     TEMP
C:00158d 1f44      M2:     ROL     R20
C:00158e f7d0              BRCC    M1X
C:00158f 955a              DEC     R21
C:001590 f449              BRNE    X2
C:001591 e002              LDI     DATA,2
C:001592 9545              ASR     R20
C:001593 f080              BRCS    N1
C:001594 9503              INC     DATA
C:001595 9543              INC     R20
C:001596 f051              BREQ    N2
C:001597 e053              LDI     R21,$03
C:001598 e34f              LDI     R20,$3F
C:001599 cfef              RJMP    M1
         
C:00159a 955a      X2:     DEC     R21
C:00159b f4b1              BRNE    X3
C:00159c 9546              LSR     R20
C:00159d f308              BRCS    MS
C:00159e 9553              INC     R21
C:00159f cfe9              RJMP    M1
         
C:0015a0 0f04      X6:     ADD     DATA,R20
C:0015a1 e054      N2:     LDI     R21,$04
C:0015a2 ef4f              LDI     R20,$FF
C:0015a3 cfe5              RJMP    M1
         
C:0015a4 9543      N1:     INC     R20
C:0015a5 f4d1              BRNE    M4
C:0015a6 9553              INC     R21
C:0015a7 9547      N5:     ROR     R20
C:0015a8 f158              BRCS    DEMLZEND
C:0015a9 1f55              ROL     R21
C:0015aa 0f11              ADD     TEMP,TEMP
C:0015ab f411              BRNE    N6
C:0015ac 9115              LPM     TEMP,Z+
C:0015ad 1f11              ROL     TEMP
C:0015ae f7c0      N6:     BRCC    N5
C:0015af 0f05              ADD     DATA,R21
C:0015b0 e056              LDI     R21,6
C:0015b1 cfd7              RJMP    M1
C:0015b2 955a      X3:     DEC     R21
C:0015b3 f411              BRNE    X4
C:0015b4 e001              LDI     DATA,1
C:0015b5 c00b              RJMP    M3
C:0015b6 955a      X4:     DEC     R21
C:0015b7 f429              BRNE    X5
C:0015b8 9543              INC     R20
C:0015b9 f431              BRNE    M4
C:0015ba e055              LDI     R21,$05
C:0015bb e14f              LDI     R20,$1F
C:0015bc cfcc              RJMP    M1
C:0015bd 955a      X5:     DEC     R21
C:0015be f709              BRNE    X6
C:0015bf 2f54              MOV     R21,R20
C:0015c0 9145      M4:     LPM     R20,Z+
C:0015c1 955a      M3:     DEC     R21
C:0015c2 2fa4              MOV     XL,R20
C:0015c3 2fb5              MOV     XH,R21
C:0015c4 0fac              ADD     XL,YL
C:0015c5 1fbd              ADC     XH,YH
          LDIRLOOP:
C:0015c6 50b1              SUBI    XH,HIGH(BUFFER) ;
C:0015c7 70bf              ANDI    XH,DBMASK_HI    ;X warp
C:0015c8   +          ADDI    XH,HIGH(BUFFER) ;
C:0015c8 5fbf      SUBI    XH,(-HIGH(BUFFER)&$FF)
C:0015c9 900d              LD      R0,X+
C:0015ca 9209              ST      Y+,R0
         ;-begin-PUT_BYTE_2---
C:0015cb b80f              OUT     SPDR,R0
C:0015cc 9b77      PUTB2:  SBIS    SPSR,SPIF
C:0015cd cffe              RJMP    PUTB2
         ;-end---PUT_BYTE_2---
C:0015ce 50d1              SUBI    YH,HIGH(BUFFER) ;
C:0015cf 70df              ANDI    YH,DBMASK_HI    ;Y warp
C:0015d0   +          ADDI    YH,HIGH(BUFFER) ;
C:0015d0 5fdf      SUBI    YH,(-HIGH(BUFFER)&$FF)
C:0015d1 950a              DEC     DATA
C:0015d2 f799              BRNE    LDIRLOOP
         
C:0015d3 cfb3              RJMP    M0
         ;теперь можно юзать стек
          DEMLZEND:
C:0015d4 9b02              SBIS    PINF,CONF_DONE
C:0015d5 cffe              RJMP    DEMLZEND
         ;SPI reinit
C:0015d6 e510              LDI     TEMP,(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)
C:0015d7 b91d              OUT     SPCR,TEMP
         
C:0015d8 9a16              SBI     DDRE,6
C:0015d9   +          LED_OFF
C:0015d9 9ac7      SBI     PORTB,7
C:0015da   +          LDIZ    MSG_OK*2
C:0015da eaec      LDI     ZL,LOW(MSG_OK*2)
C:0015db e0f0      LDI     ZH,HIGH(MSG_OK*2)
C:0015dc d571              RCALL   UART_PRINTSTRZ
         ; - - - - - - - - - - - - - - - - - - -
C:0015dd def8              RCALL   NVRAM_READ_MODE
C:0015de e41e              LDI     TEMP,SCR_MODE
C:0015df d560              RCALL   FPGA_REG
         ; - - - - - - - - - - - - - - - - - - -
C:0015e0 e0a0              LDI     XL,0
C:0015e1 e0b0              LDI     XH,0
C:0015e2 d571              RCALL   SET_CURSOR
C:0015e3   +          LDIZ    MSG_TITLE*2
C:0015e3 ebe4      LDI     ZL,LOW(MSG_TITLE*2)
C:0015e4 e0f0      LDI     ZH,HIGH(MSG_TITLE*2)
C:0015e5 d57a              RCALL   PRINTSTRZ
         
C:0015e6   +          LDIZ    LARGEBOOTSTART*2-4
C:0015e6 efec      LDI     ZL,LOW(LARGEBOOTSTART*2-4)
C:0015e7 edff      LDI     ZH,HIGH(LARGEBOOTSTART*2-4)
         ;        OUT     RAMPZ,ONE
C:0015e8 91a7              ELPM    XL,Z+
C:0015e9 91b6              ELPM    XH,Z
C:0015ea 2f0a              MOV     DATA,XL
C:0015eb 710f              ANDI    DATA,$1F
C:0015ec f0d9              BREQ    PRVERS9
C:0015ed 2f1b              MOV     TEMP,XH
C:0015ee 0faa              LSL     XL
C:0015ef 1f11              ROL     TEMP
C:0015f0 0faa              LSL     XL
C:0015f1 1f11              ROL     TEMP
C:0015f2 0faa              LSL     XL
C:0015f3 1f11              ROL     TEMP
C:0015f4 701f              ANDI    TEMP,$0F
C:0015f5 f091              BREQ    PRVERS9
C:0015f6 301d              CPI     TEMP,13
C:0015f7 f480              BRCC    PRVERS9
C:0015f8 2f2b              MOV     COUNT,XH
C:0015f9 9526              LSR     COUNT
C:0015fa 732f              ANDI    COUNT,$3F
C:0015fb 3029              CPI     COUNT,9
C:0015fc f058              BRCS    PRVERS9
C:0015fd 930f              PUSH    DATA
C:0015fe e208              LDI     DATA,$28 ;"("
C:0015ff d57b              RCALL   PUTCHAR
C:001600 2f02              MOV     DATA,COUNT
C:001601 d564              RCALL   DECBYTE
C:001602 2f01              MOV     DATA,TEMP
C:001603 d562              RCALL   DECBYTE
C:001604 910f              POP     DATA
C:001605 d560              RCALL   DECBYTE
C:001606 e209              LDI     DATA,$29 ;")"
C:001607 d573              RCALL   PUTCHAR
          PRVERS9:
         ; - - - - - - - - - - - - - - - - - - -
         ;информация о Flash-ROM чипе
C:001608 d543              RCALL   UART_NEWLINE
C:001609 e0a0              LDI     XL,0
C:00160a e0b2              LDI     XH,2
C:00160b d548              RCALL   SET_CURSOR
C:00160c   +          LDIZ    MSG_ID_FLASH*2
C:00160c ecec      LDI     ZL,LOW(MSG_ID_FLASH*2)
C:00160d e0f0      LDI     ZH,HIGH(MSG_ID_FLASH*2)
C:00160e d551              RCALL   PRINTSTRZ
         
C:00160f d4b3              RCALL   F_ID
C:001610 2f0e              MOV     DATA,ZL
C:001611 d560              RCALL   HEXBYTE
C:001612 e200              LDI     DATA,$20
C:001613 d567              RCALL   PUTCHAR
C:001614 2f0f              MOV     DATA,ZH
C:001615 d55c              RCALL   HEXBYTE
         ; - - - - - - - - - - - - - - - - - - -
C:001616 d535              RCALL   UART_NEWLINE
C:001617 e0a0              LDI     XL,0
C:001618 e0b3              LDI     XH,3
C:001619 d53a              RCALL   SET_CURSOR
C:00161a   +          LDIZ    MSG_OPENFILE*2
C:00161a eee4      LDI     ZL,LOW(MSG_OPENFILE*2)
C:00161b e0f0      LDI     ZH,HIGH(MSG_OPENFILE*2)
C:00161c d543              RCALL   PRINTSTRZ
         ;
         ;инициализация SD карточки
C:00161d e51f              LDI     TEMP,SD_CS1
C:00161e ef0f              SER     DATA
C:00161f d520              RCALL   FPGA_REG
C:001620 e210              LDI     TEMP,32
C:001621 d2ad              RCALL   SD_RD_DUMMY
         
C:001622 e517              LDI     TEMP,SD_CS0
C:001623 ef0f              SER     DATA
C:001624 d51b              RCALL   FPGA_REG
C:001625 ef8f              SER     R24
C:001626   +  SDINIT1:LDIZ    CMD00*2
C:001626 e8e8      LDI     ZL,LOW(CMD00*2)
C:001627 e0f1      LDI     ZH,HIGH(CMD00*2)
C:001628 d2ab              RCALL   SD_WR_PGM_6
C:001629 958a              DEC     R24
C:00162a f411              BRNE    SDINIT2
C:00162b e001              LDI     DATA,1  ;нет SD
C:00162c c44a              RJMP    SD_ERROR
C:00162d 3001      SDINIT2:CPI     DATA,$01
C:00162e f7b9              BRNE    SDINIT1
         
C:00162f   +          LDIZ    CMD08*2
C:00162f e8ee      LDI     ZL,LOW(CMD08*2)
C:001630 e0f1      LDI     ZH,HIGH(CMD08*2)
C:001631 d2a2              RCALL   SD_WR_PGM_6
C:001632 e080              LDI     R24,$00
C:001633 ff02              SBRS    DATA,2
C:001634 e480              LDI     R24,$40
C:001635 e014              LDI     TEMP,4
C:001636 d298              RCALL   SD_RD_DUMMY
         
C:001637   +  SDINIT3:LDIZ    CMD55*2
C:001637 e9ea      LDI     ZL,LOW(CMD55*2)
C:001638 e0f1      LDI     ZH,HIGH(CMD55*2)
C:001639 d29a              RCALL   SD_WR_PGM_6
C:00163a e012              LDI     TEMP,2
C:00163b d293              RCALL   SD_RD_DUMMY
C:00163c e609              LDI     DATA,ACMD_41
C:00163d d290              RCALL   SD_EXCHANGE
C:00163e 2f08              MOV     DATA,R24
C:00163f d28e              RCALL   SD_EXCHANGE
         
C:001640   +          LDIZ    CMD55*2+2
C:001640 e9ec      LDI     ZL,LOW(CMD55*2+2)
C:001641 e0f1      LDI     ZH,HIGH(CMD55*2+2)
C:001642 e014              LDI     TEMP,4
C:001643 d293              RCALL   SD_WR_PGX
C:001644 2300              TST     DATA
C:001645 f789              BRNE    SDINIT3
         
C:001646   +  SDINIT4:LDIZ    CMD59*2
C:001646 eae6      LDI     ZL,LOW(CMD59*2)
C:001647 e0f1      LDI     ZH,HIGH(CMD59*2)
C:001648 d28b              RCALL   SD_WR_PGM_6
C:001649 2300              TST     DATA
C:00164a f7d9              BRNE    SDINIT4
         
C:00164b   +  SDINIT5:LDIZ    CMD16*2
C:00164b e9e4      LDI     ZL,LOW(CMD16*2)
C:00164c e0f1      LDI     ZH,HIGH(CMD16*2)
C:00164d d286              RCALL   SD_WR_PGM_6
C:00164e 2300              TST     DATA
C:00164f f7d9              BRNE    SDINIT5
         ;
         ; - - - - - - - - - - - - - - - - - - -
         ;поиск FAT, инициализация переменных
C:001650   +  WC_FAT: LDIX    0
C:001650 e0a0      LDI     XL,LOW(0)
C:001651 e0b0      LDI     XH,HIGH(0)
C:001652   +          LDIY    0
C:001652 e0c0      LDI     YL,LOW(0)
C:001653 e0d0      LDI     YH,HIGH(0)
C:001654 d2c2              RCALL   LOADLST
C:001655   +          LDIZ    BUF4FAT+$01BE
C:001655 ebee      LDI     ZL,LOW(BUF4FAT+$01BE)
C:001656 e0f4      LDI     ZH,HIGH(BUF4FAT+$01BE)
C:001657 8100              LD      DATA,Z
C:001658 2300              TST     DATA
C:001659 f4b9              BRNE    RDFAT05
C:00165a ece2              LDI     ZL,$C2
C:00165b 8100              LD      DATA,Z
C:00165c e010              LDI     TEMP,0
C:00165d 3001              CPI     DATA,$01
C:00165e f051              BREQ    RDFAT06
C:00165f e012              LDI     TEMP,2
C:001660 300b              CPI     DATA,$0B
C:001661 f039              BREQ    RDFAT06
C:001662 300c              CPI     DATA,$0C
C:001663 f029              BREQ    RDFAT06
C:001664 e011              LDI     TEMP,1
C:001665 3006              CPI     DATA,$06
C:001666 f011              BREQ    RDFAT06
C:001667 300e              CPI     DATA,$0E
C:001668 f441              BRNE    RDFAT05
C:001669 9310 0500 RDFAT06:STS     CAL_FAT,TEMP
C:00166b ece6              LDI     ZL,$C6
C:00166c 91a1              LD      XL,Z+
C:00166d 91b1              LD      XH,Z+
C:00166e 91c1              LD      YL,Z+
C:00166f 81d0              LD      YH,Z
C:001670 c02f              RJMP    RDFAT00
C:001671   +  RDFAT05:LDIZ    BUF4FAT
C:001671 e0e0      LDI     ZL,LOW(BUF4FAT)
C:001672 e0f3      LDI     ZH,HIGH(BUF4FAT)
C:001673 8535              LDD     BITS,Z+$0D
C:001674 e000              LDI     DATA,0
C:001675 e010              LDI     TEMP,0
C:001676 e028              LDI     COUNT,8
C:001677 9537      RDF051: ROR     BITS
C:001678 1d0f              ADC     DATA,NULL
C:001679 952a              DEC     COUNT
C:00167a f7e1              BRNE    RDF051
C:00167b 950a              DEC     DATA
C:00167c f409              BRNE    RDF052
C:00167d 9513              INC     TEMP
C:00167e 8506      RDF052: LDD     DATA,Z+$0E
C:00167f 8407              LDD     R0,Z+$0F
C:001680 2900              OR      DATA,R0
C:001681 f009              BREQ    RDF053
C:001682 9513              INC     TEMP
C:001683 8903      RDF053: LDD     DATA,Z+$13
C:001684 8804              LDD     R0,Z+$14
C:001685 2900              OR      DATA,R0
C:001686 f409              BRNE    RDF054
C:001687 9513              INC     TEMP
C:001688 a100      RDF054: LDD     DATA,Z+$20
C:001689 a001              LDD     R0,Z+$21
C:00168a 2900              OR      DATA,R0
C:00168b a002              LDD     R0,Z+$22
C:00168c 2900              OR      DATA,R0
C:00168d a003              LDD     R0,Z+$23
C:00168e 2900              OR      DATA,R0
C:00168f f409              BRNE    RDF055
C:001690 9513              INC     TEMP
C:001691 8905      RDF055: LDD     DATA,Z+$15
C:001692 7f00              ANDI    DATA,$F0
C:001693 3f00              CPI     DATA,$F0
C:001694 f409              BRNE    RDF056
C:001695 9513              INC     TEMP
C:001696 3014      RDF056: CPI     TEMP,4
C:001697 f011              BREQ    RDF057
C:001698 e003              LDI     DATA,3  ;не найдена FAT
C:001699 c3dd              RJMP    SD_ERROR
C:00169a 92d0 0500 RDF057: STS     CAL_FAT,FF
C:00169c   +          LDIY    0
C:00169c e0c0      LDI     YL,LOW(0)
C:00169d e0d0      LDI     YH,HIGH(0)
C:00169e   +          LDIX    0
C:00169e e0a0      LDI     XL,LOW(0)
C:00169f e0b0      LDI     XH,HIGH(0)
C:0016a0   +  RDFAT00:STSX    STARTRZ+0
C:0016a0 93a0 050d STS     STARTRZ+0,XL
C:0016a2 93b0 050e STS     STARTRZ+0+1,XH
C:0016a4   +          STSY    STARTRZ+2
C:0016a4 93c0 050f STS     STARTRZ+2,YL
C:0016a6 93d0 0510 STS     STARTRZ+2+1,YH
C:0016a8 d26e              RCALL   LOADLST
C:0016a9   +          LDIY    0
C:0016a9 e0c0      LDI     YL,LOW(0)
C:0016aa e0d0      LDI     YH,HIGH(0)
C:0016ab 89a6              LDD     XL,Z+22
C:0016ac 89b7              LDD     XH,Z+23         ;bpb_fatsz16
C:0016ad 2f0b              MOV     DATA,XH
C:0016ae 2b0a              OR      DATA,XL
C:0016af f421              BRNE    RDFAT01         ;если не fat12/16 (bpb_fatsz16=0)
C:0016b0 a1a4              LDD     XL,Z+36         ;то берем bpb_fatsz32 из смещения +36
C:0016b1 a1b5              LDD     XH,Z+37
C:0016b2 a1c6              LDD     YL,Z+38
C:0016b3 a1d7              LDD     YH,Z+39
C:0016b4   +  RDFAT01:STSX    SEC_FAT+0
C:0016b4 93a0 0507 STS     SEC_FAT+0,XL
C:0016b6 93b0 0508 STS     SEC_FAT+0+1,XH
C:0016b8   +          STSY    SEC_FAT+2       ;число секторов на fat-таблицу
C:0016b8 93c0 0509 STS     SEC_FAT+2,YL
C:0016ba 93d0 050a STS     SEC_FAT+2+1,YH
C:0016bc   +          LDIY    0
C:0016bc e0c0      LDI     YL,LOW(0)
C:0016bd e0d0      LDI     YH,HIGH(0)
C:0016be 89a3              LDD     XL,Z+19
C:0016bf 89b4              LDD     XH,Z+20         ;bpb_totsec16
C:0016c0 2f0b              MOV     DATA,XH
C:0016c1 2b0a              OR      DATA,XL
C:0016c2 f421              BRNE    RDFAT02         ;если не fat12/16 (bpb_totsec16=0)
C:0016c3 a1a0              LDD     XL,Z+32         ;то берем из bpb_totsec32 смещения +32
C:0016c4 a1b1              LDD     XH,Z+33
C:0016c5 a1c2              LDD     YL,Z+34
C:0016c6 a1d3              LDD     YH,Z+35
C:0016c7   +  RDFAT02:STSX    SEC_DSC+0
C:0016c7 93a0 0515 STS     SEC_DSC+0,XL
C:0016c9 93b0 0516 STS     SEC_DSC+0+1,XH
C:0016cb   +          STSY    SEC_DSC+2       ;к-во секторов на диске/разделе
C:0016cb 93c0 0517 STS     SEC_DSC+2,YL
C:0016cd 93d0 0518 STS     SEC_DSC+2+1,YH
         ;вычисляем rootdirsectors
C:0016cf 89a1              LDD     XL,Z+17
C:0016d0 89b2              LDD     XH,Z+18         ;bpb_rootentcnt
C:0016d1   +          LDIY    0
C:0016d1 e0c0      LDI     YL,LOW(0)
C:0016d2 e0d0      LDI     YH,HIGH(0)
C:0016d3 2f0b              MOV     DATA,XH
C:0016d4 2b0a              OR      DATA,XL
C:0016d5 f019              BREQ    RDFAT03
C:0016d6 e100              LDI     DATA,$10
C:0016d7 d315              RCALL   BCDE_A
C:0016d8 01ed              MOVW    YL,XL           ;это реализована формула
                                         ;rootdirsectors = ( (bpb_rootentcnt*32)+(bpb_bytspersec-1) )/bpb_bytspersec
                                         ;в Y rootdirsectors
                                         ;если fat32, то Y=0 всегда
C:0016d9 93df      RDFAT03:PUSH    YH
C:0016da 93cf              PUSH    YL
C:0016db 8900              LDD     DATA,Z+16       ;bpb_numfats
C:0016dc 9300 0501         STS     MANYFAT,DATA
C:0016de   +          LDSX    SEC_FAT+0
C:0016de 91a0 0507 LDS     XL,SEC_FAT+0
C:0016e0 91b0 0508 LDS     XH,SEC_FAT+0+1
C:0016e2   +          LDSY    SEC_FAT+2
C:0016e2 91c0 0509 LDS     YL,SEC_FAT+2
C:0016e4 91d0 050a LDS     YH,SEC_FAT+2+1
C:0016e6 950a              DEC     DATA
C:0016e7 0faa      RDF031: LSL     XL
C:0016e8 1fbb              ROL     XH
C:0016e9 1fcc              ROL     YL
C:0016ea 1fdd              ROL     YH
C:0016eb 950a              DEC     DATA
C:0016ec f7d1              BRNE    RDF031
C:0016ed 918f              POP     R24
C:0016ee 919f              POP     R25
                                         ;полный размер fat-области в секторах
C:0016ef d316              RCALL   HLDEPBC         ;прибавили rootdirsectors
C:0016f0 8586              LDD     R24,Z+14
C:0016f1 8597              LDD     R25,Z+15        ;bpb_rsvdseccnt
C:0016f2 9380 050b         STS     RSVDSEC+0,R24
C:0016f4 9390 050c         STS     RSVDSEC+1,R25
C:0016f6 d30f              RCALL   HLDEPBC         ;прибавили bpb_resvdseccnt
C:0016f7   +          STSX    FRSTDAT+0
C:0016f7 93a0 0511 STS     FRSTDAT+0,XL
C:0016f9 93b0 0512 STS     FRSTDAT+0+1,XH
C:0016fb   +          STSY    FRSTDAT+2       ;положили номер первого сектора данных
C:0016fb 93c0 0513 STS     FRSTDAT+2,YL
C:0016fd 93d0 0514 STS     FRSTDAT+2+1,YH
C:0016ff   +          LDIZ    SEC_DSC
C:0016ff e1e5      LDI     ZL,LOW(SEC_DSC)
C:001700 e0f5      LDI     ZH,HIGH(SEC_DSC)
C:001701 d2ee              RCALL   BCDEHLM         ;вычли из полного к-ва секторов раздела
C:001702   +          LDIZ    BUF4FAT
C:001702 e0e0      LDI     ZL,LOW(BUF4FAT)
C:001703 e0f3      LDI     ZH,HIGH(BUF4FAT)
C:001704 8505              LDD     DATA,Z+13
C:001705 9300 0502         STS     BYTSSEC,DATA
C:001707 d2e5              RCALL   BCDE_A          ;разделили на к-во секторов в кластере
C:001708   +          STSX    CLS_DSC+0
C:001708 93a0 0519 STS     CLS_DSC+0,XL
C:00170a 93b0 051a STS     CLS_DSC+0+1,XH
C:00170c   +          STSY    CLS_DSC+2       ;положили кол-во кластеров на разделе
C:00170c 93c0 051b STS     CLS_DSC+2,YL
C:00170e 93d0 051c STS     CLS_DSC+2+1,YH
         
C:001710 9100 0500         LDS     DATA,CAL_FAT
C:001712 3f0f              CPI     DATA,$FF
C:001713 f519              BRNE    RDFAT04
C:001714   +          LDSX    CLS_DSC+0
C:001714 91a0 0519 LDS     XL,CLS_DSC+0
C:001716 91b0 051a LDS     XH,CLS_DSC+0+1
C:001718   +          LDSY    CLS_DSC+2
C:001718 91c0 051b LDS     YL,CLS_DSC+2
C:00171a 91d0 051c LDS     YH,CLS_DSC+2+1
C:00171c   +          PUSHY
C:00171c 93cf      PUSH    YL
C:00171d 93df      PUSH    YH
C:00171e   +          PUSHX
C:00171e 93af      PUSH    XL
C:00171f 93bf      PUSH    XH
C:001720 0faa              LSL     XL
C:001721 1fbb              ROL     XH
C:001722 1fcc              ROL     YL
C:001723 1fdd              ROL     YH
C:001724 d2e6              RCALL   RASCHET
C:001725 e001              LDI     DATA,1
C:001726   +          POPX
C:001726 91bf      POP     XH
C:001727 91af      POP     XL
C:001728   +          POPY
C:001728 91df      POP     YH
C:001729 91cf      POP     YL
C:00172a f061              BREQ    RDFAT04
C:00172b 0faa              LSL     XL
C:00172c 1fbb              ROL     XH
C:00172d 1fcc              ROL     YL
C:00172e 1fdd              ROL     YH
C:00172f 0faa              LSL     XL
C:001730 1fbb              ROL     XH
C:001731 1fcc              ROL     YL
C:001732 1fdd              ROL     YH
C:001733 d2d7              RCALL   RASCHET
C:001734 e002              LDI     DATA,2
C:001735 f009              BREQ    RDFAT04
C:001736 2700              CLR     DATA
C:001737 9300 0500 RDFAT04:STS     CAL_FAT,DATA
         ;для fat12/16 вычисляем адрес первого сектора директории
         ;для fat32 берем по смещемию +44
         ;на выходе YX == сектор rootdir
C:001739   +          LDIX    0
C:001739 e0a0      LDI     XL,LOW(0)
C:00173a e0b0      LDI     XH,HIGH(0)
C:00173b   +          LDIY    0
C:00173b e0c0      LDI     YL,LOW(0)
C:00173c e0d0      LDI     YH,HIGH(0)
C:00173d 2300              TST     DATA
C:00173e f031              BREQ    FSRROO2
C:00173f 950a              DEC     DATA
C:001740 f021              BREQ    FSRROO2
C:001741 a5a4              LDD     XL,Z+44
C:001742 a5b5              LDD     XH,Z+45
C:001743 a5c6              LDD     YL,Z+46
C:001744 a5d7              LDD     YH,Z+47
C:001745   +  FSRROO2:STSX    ROOTCLS+0
C:001745 93a0 0503 STS     ROOTCLS+0,XL
C:001747 93b0 0504 STS     ROOTCLS+0+1,XH
C:001749   +          STSY    ROOTCLS+2       ;сектор root директории
C:001749 93c0 0505 STS     ROOTCLS+2,YL
C:00174b 93d0 0506 STS     ROOTCLS+2+1,YH
C:00174d   +          STSX    TEK_DIR+0
C:00174d 93a0 0525 STS     TEK_DIR+0,XL
C:00174f 93b0 0526 STS     TEK_DIR+0+1,XH
C:001751   +          STSY    TEK_DIR+2
C:001751 93c0 0527 STS     TEK_DIR+2,YL
C:001753 93d0 0528 STS     TEK_DIR+2+1,YH
         
C:001755   +  FSRR121:PUSHX
C:001755 93af      PUSH    XL
C:001756 93bf      PUSH    XH
C:001757   +          PUSHY
C:001757 93cf      PUSH    YL
C:001758 93df      PUSH    YH
C:001759   +          LDSX    RSVDSEC
C:001759 91a0 050b LDS     XL,RSVDSEC
C:00175b 91b0 050c LDS     XH,RSVDSEC+1
C:00175d   +          LDIY    0
C:00175d e0c0      LDI     YL,LOW(0)
C:00175e e0d0      LDI     YH,HIGH(0)
C:00175f   +          LDIZ    STARTRZ
C:00175f e0ed      LDI     ZL,LOW(STARTRZ)
C:001760 e0f5      LDI     ZH,HIGH(STARTRZ)
C:001761 d29b              RCALL   BCDEHLP
C:001762   +          STSX    FATSTR0+0
C:001762 93a0 051d STS     FATSTR0+0,XL
C:001764 93b0 051e STS     FATSTR0+0+1,XH
C:001766   +          STSY    FATSTR0+2
C:001766 93c0 051f STS     FATSTR0+2,YL
C:001768 93d0 0520 STS     FATSTR0+2+1,YH
C:00176a   +          LDIZ    SEC_FAT
C:00176a e0e7      LDI     ZL,LOW(SEC_FAT)
C:00176b e0f5      LDI     ZH,HIGH(SEC_FAT)
C:00176c d290              RCALL   BCDEHLP
C:00176d   +          STSX    FATSTR1+0
C:00176d 93a0 0521 STS     FATSTR1+0,XL
C:00176f 93b0 0522 STS     FATSTR1+0+1,XH
C:001771   +          STSY    FATSTR1+2
C:001771 93c0 0523 STS     FATSTR1+2,YL
C:001773 93d0 0524 STS     FATSTR1+2+1,YH
C:001775   +          POPY
C:001775 91df      POP     YH
C:001776 91cf      POP     YL
C:001777   +          POPX
C:001777 91bf      POP     XH
C:001778 91af      POP     XL
         
C:001779 e011              LDI     TEMP,1
C:00177a 2e0a              MOV     R0,XL
C:00177b 2a0b              OR      R0,XH
C:00177c 2a0c              OR      R0,YL
C:00177d 2a0d              OR      R0,YH
C:00177e f039              BREQ    LASTCLS
C:00177f 931f      NEXTCLS:PUSH    TEMP
C:001780 d1e4              RCALL   RDFATZP
C:001781 d1d1              RCALL   LST_CLS
C:001782 911f              POP     TEMP
C:001783 f410              BRCC    LASTCLS
C:001784 9513              INC     TEMP
C:001785 cff9              RJMP    NEXTCLS
C:001786 9310 0529 LASTCLS:STS     KCLSDIR,TEMP
C:001788   +          LDIY    0
C:001788 e0c0      LDI     YL,LOW(0)
C:001789 e0d0      LDI     YH,HIGH(0)
C:00178a d192              RCALL   RDDIRSC
         ;
         ; - - - - - - - - - - - - - - - - - - -
         ;поиск файла в директории
C:00178b   +          LDIY    0               ;номер описателя файла
C:00178b e0c0      LDI     YL,LOW(0)
C:00178c e0d0      LDI     YH,HIGH(0)
C:00178d c006              RJMP    FNDMP32
         
C:00178e 9621      FNDMP31:ADIW    YL,1            ;номер++               ─────────┐
C:00178f 96b0              ADIW    ZL,$20          ;следующий описатель             │
C:001790 30f5              CPI     ZH,HIGH(BUF4FAT+512);                            │
                                         ;вылезли за сектор?              │
C:001791 f411              BRNE    FNDMP32         ;нет ещё                         │
C:001792 d18a              RCALL   RDDIRSC         ;считываем следующий             │
C:001793 f4b9              BRNE    FNDMP37         ;кончились сектора в директории ═│═╗
C:001794 8503      FNDMP32:LDD     DATA,Z+$0B      ;атрибуты                        │ ║
C:001795 fd03              SBRC    DATA,3          ;длиное имя/имя диска?           │ ║
C:001796 cff7              RJMP    FNDMP31         ;да ────────────────────────────┤ ║
C:001797 fd04              SBRC    DATA,4          ;директория?                     │ ║
C:001798 cff5              RJMP    FNDMP31         ;да ────────────────────────────┤ ║
C:001799 8100              LD      DATA,Z          ;первый символ                   │ ║
C:00179a 3e05              CPI     DATA,$E5        ;удалённый файл?                 │ ║
C:00179b f391              BREQ    FNDMP31         ;да ────────────────────────────┘ ║
C:00179c 2300              TST     DATA            ;пустой описатель? (конец списка)  ╚═ в этой директории
C:00179d f069              BREQ    FNDMP37         ;да ═════════════════════════════════ нет нашёго файла
C:00179e 93ef              PUSH    ZL
C:00179f 01df              MOVW    XL,ZL
C:0017a0   +          LDIZ    FILENAME*2
C:0017a0 eaec      LDI     ZL,LOW(FILENAME*2)
C:0017a1 e0f1      LDI     ZH,HIGH(FILENAME*2)
C:0017a2 9105      DALSHE: LPM     DATA,Z+
C:0017a3 2300              TST     DATA
C:0017a4 f041              BREQ    NASHEL
C:0017a5 911d              LD      TEMP,X+
C:0017a6 1701              CP      DATA,TEMP
C:0017a7 f3d1              BREQ    DALSHE
         ;не совпало
C:0017a8 2ffb              MOV     ZH,XH
C:0017a9 91ef              POP     ZL
C:0017aa cfe3              RJMP    FNDMP31
         ;нет такого файла
          FNDMP37:
C:0017ab e004              LDI     DATA,4  ;нет файла
C:0017ac c2ca              RJMP    SD_ERROR
         ;найден описатель
C:0017ad 2ffb      NASHEL: MOV     ZH,XH
C:0017ae 91ef              POP     ZL
         ;
         ; - - - - - - - - - - - - - - - - - - -
         ;инициализация переменных
         ;для последующего чтения файла
         ;Z указывает на описатель файла
C:0017af 8da2              LDD     XL,Z+$1A
C:0017b0 8db3              LDD     XH,Z+$1B
C:0017b1 89c4              LDD     YL,Z+$14
C:0017b2 89d5              LDD     YH,Z+$15        ;считали номер первого кластера файла
C:0017b3   +          STSX    TFILCLS+0
C:0017b3 93a0 052b STS     TFILCLS+0,XL
C:0017b5 93b0 052c STS     TFILCLS+0+1,XH
C:0017b7   +          STSY    TFILCLS+2
C:0017b7 93c0 052d STS     TFILCLS+2,YL
C:0017b9 93d0 052e STS     TFILCLS+2+1,YH
C:0017bb   +          STSX    ZTFILCLS+0
C:0017bb 93a0 0534 STS     ZTFILCLS+0,XL
C:0017bd 93b0 0535 STS     ZTFILCLS+0+1,XH
C:0017bf   +          STSY    ZTFILCLS+2
C:0017bf 93c0 0536 STS     ZTFILCLS+2,YL
C:0017c1 93d0 0537 STS     ZTFILCLS+2+1,YH
C:0017c3 8da4              LDD     XL,Z+$1C
C:0017c4 8db5              LDD     XH,Z+$1D
C:0017c5 8dc6              LDD     YL,Z+$1E
C:0017c6 8dd7              LDD     YH,Z+$1F        ;считали длину файла
         
C:0017c7 2f0a              MOV     DATA,XL
C:0017c8 2b0b              OR      DATA,XH
C:0017c9 2b0c              OR      DATA,YL
C:0017ca 2b0d              OR      DATA,YH
C:0017cb f411              BRNE    F01
C:0017cc e005              LDI     DATA,5  ;пустой файл
C:0017cd c2a9              RJMP    SD_ERROR
          F01:
C:0017ce e008              LDI     DATA,$08
C:0017cf 15ae              CP      XL,ONE
C:0017d0 05bf              CPC     XH,NULL
C:0017d1 07c0              CPC     YL,DATA
C:0017d2 05df              CPC     YH,NULL
C:0017d3 f010              BRCS    F02
C:0017d4 e005              LDI     DATA,5  ;большой файл
C:0017d5 c2a1              RJMP    SD_ERROR
          F02:
C:0017d6 ef8f              LDI     R24,LOW(511)
C:0017d7 e091              LDI     R25,HIGH(511)
C:0017d8 d22d              RCALL   HLDEPBC
C:0017d9 d20a              RCALL   BCDE200         ;получили кол-во секторов
C:0017da 9711              SBIW    XL,1
C:0017db 09cf              SBC     YL,NULL
C:0017dc 09df              SBC     YH,NULL
C:0017dd 9100 0502         LDS     DATA,BYTSSEC
C:0017df 950a              DEC     DATA
C:0017e0 230a              AND     DATA,XL
C:0017e1 9503              INC     DATA
C:0017e2 9300 052f         STS     MPHWOST,DATA    ;кол-во секторов в последнем кластере
C:0017e4 9300 0538         STS     ZMPHWOST,DATA
C:0017e6 9100 0502         LDS     DATA,BYTSSEC
C:0017e8 d204              RCALL   BCDE_A
C:0017e9   +          STSX    KOL_CLS+0
C:0017e9 93a0 0530 STS     KOL_CLS+0,XL
C:0017eb 93b0 0531 STS     KOL_CLS+0+1,XH
C:0017ed   +          STSY    KOL_CLS+2
C:0017ed 93c0 0532 STS     KOL_CLS+2,YL
C:0017ef 93d0 0533 STS     KOL_CLS+2+1,YH
C:0017f1   +          STSX    ZKOL_CLS+0
C:0017f1 93a0 0539 STS     ZKOL_CLS+0,XL
C:0017f3 93b0 053a STS     ZKOL_CLS+0+1,XH
C:0017f5   +          STSY    ZKOL_CLS+2
C:0017f5 93c0 053b STS     ZKOL_CLS+2,YL
C:0017f7 93d0 053c STS     ZKOL_CLS+2+1,YH
C:0017f9 92f0 052a         STS     NUMSECK,NULL
         ; - - - - - - - - - - - - - - - - - - -
         ;всё нормально, начинаем
         ;стирание
C:0017fb d350              RCALL   UART_NEWLINE
C:0017fc e0a0              LDI     XL,0
C:0017fd e0b4              LDI     XH,4
C:0017fe d355              RCALL   SET_CURSOR
C:0017ff   +          LDIZ    MSG_F_ERASE*2
C:0017ff e4e4      LDI     ZL,LOW(MSG_F_ERASE*2)
C:001800 e0f1      LDI     ZH,HIGH(MSG_F_ERASE*2)
C:001801 d35e              RCALL   PRINTSTRZ
C:001802 d2ef              RCALL   F_ERASE
         ;запись
C:001803 d348              RCALL   UART_NEWLINE
C:001804 e0a0              LDI     XL,0
C:001805 e0b5              LDI     XH,5
C:001806 d34d              RCALL   SET_CURSOR
C:001807   +          LDIZ    MSG_F_WRITE*2
C:001807 e4ee      LDI     ZL,LOW(MSG_F_WRITE*2)
C:001808 e0f1      LDI     ZH,HIGH(MSG_F_WRITE*2)
C:001809 d356              RCALL   PRINTSTRZ
C:00180a e0a0              LDI     XL,0
C:00180b e1b0              LDI     XH,16
C:00180c d347              RCALL   SET_CURSOR
C:00180d e001              LDI     DATA,$01 ;"░"
C:00180e e414              LDI     TEMP,SCR_CHAR
C:00180f d330              RCALL   FPGA_REG
C:001810 ef1f              LDI     TEMP,$FF
C:001811   +  FCHXY1: SPICS_CLR
C:001811 98c0      CBI     PORTB,0
C:001812   +          SPICS_SET
C:001812 9ac0      SBI     PORTB,0
C:001813 951a              DEC     TEMP
C:001814 f7e1              BRNE    FCHXY1
C:001815 e0a0              LDI     XL,0
C:001816 e1b0              LDI     XH,16
C:001817 d33c              RCALL   SET_CURSOR
         
C:001818 92f0 053f         STS     F_ADDR0,NULL
C:00181a 92f0 0540         STS     F_ADDR1,NULL
C:00181c 92f0 0541         STS     F_ADDR2,NULL
         
C:00181e d1f6      F13:    RCALL   NEXTSEC
C:00181f 9300 053e         STS     LASTSECFLAG,DATA
         
C:001821   +          LDIZ    BUFFER
C:001821 e0e0      LDI     ZL,LOW(BUFFER)
C:001822 e0f1      LDI     ZH,HIGH(BUFFER)
C:001823 91a0 053f         LDS     XL,F_ADDR0
C:001825 91b0 0540         LDS     XH,F_ADDR1
C:001827 91c0 0541         LDS     YL,F_ADDR2
         
C:001829 d2a8      F11:    RCALL   F_WRITE
C:00182a 9611              ADIW    XL,1
C:00182b 1dcf              ADC     YL,NULL
C:00182c 9631              ADIW    ZL,1
C:00182d 30f3              CPI     ZH,HIGH(BUFFER+512)
C:00182e f7d1              BRNE    F11
         
C:00182f   +          LED_OFF
C:00182f 9ac7      SBI     PORTB,7
C:001830 fdb1              SBRC    XH,1
C:001831   +          LED_ON  ;мигать при программировании
C:001831 98c7      CBI     PORTB,7
         
C:001832 93a0 053f         STS     F_ADDR0,XL
C:001834 93b0 0540         STS     F_ADDR1,XH
C:001836 93c0 0541         STS     F_ADDR2,YL
         
C:001838 30a0              CPI     XL,$00
C:001839 f431              BRNE    F12
C:00183a 2f0b              MOV     DATA,XH
C:00183b 7007              ANDI    DATA,$07
C:00183c f419              BRNE    F12
C:00183d e002              LDI     DATA,$02 ;"▒"
C:00183e e414              LDI     TEMP,SCR_CHAR
C:00183f d300              RCALL   FPGA_REG
          F12:
C:001840 9100 053e         LDS     DATA,LASTSECFLAG
C:001842 2300              TST     DATA
C:001843 f6d1              BRNE    F13
         ;проверка
C:001844 d2bb              RCALL   F_RST
C:001845 ef14              LDI     TEMP,FLASH_CTRL
C:001846 e003              LDI     DATA,0B00000011
C:001847 d2f8              RCALL   FPGA_REG
C:001848 d303              RCALL   UART_NEWLINE
C:001849 e0a0              LDI     XL,0
C:00184a e0b6              LDI     XH,6
C:00184b d308              RCALL   SET_CURSOR
C:00184c   +          LDIZ    MSG_F_CHECK*2
C:00184c e5e8      LDI     ZL,LOW(MSG_F_CHECK*2)
C:00184d e0f1      LDI     ZH,HIGH(MSG_F_CHECK*2)
C:00184e d311              RCALL   PRINTSTRZ
C:00184f e0a0              LDI     XL,0
C:001850 e1b0              LDI     XH,16
C:001851 d302              RCALL   SET_CURSOR
         
C:001852   +          LDSX    ZTFILCLS+0
C:001852 91a0 0534 LDS     XL,ZTFILCLS+0
C:001854 91b0 0535 LDS     XH,ZTFILCLS+0+1
C:001856   +          LDSY    ZTFILCLS+2
C:001856 91c0 0536 LDS     YL,ZTFILCLS+2
C:001858 91d0 0537 LDS     YH,ZTFILCLS+2+1
C:00185a   +          STSX    TFILCLS+0
C:00185a 93a0 052b STS     TFILCLS+0,XL
C:00185c 93b0 052c STS     TFILCLS+0+1,XH
C:00185e   +          STSY    TFILCLS+2
C:00185e 93c0 052d STS     TFILCLS+2,YL
C:001860 93d0 052e STS     TFILCLS+2+1,YH
C:001862 9100 0538         LDS     DATA,ZMPHWOST
C:001864 9300 052f         STS     MPHWOST,DATA
C:001866   +          LDSX    ZKOL_CLS+0
C:001866 91a0 0539 LDS     XL,ZKOL_CLS+0
C:001868 91b0 053a LDS     XH,ZKOL_CLS+0+1
C:00186a   +          LDSY    ZKOL_CLS+2
C:00186a 91c0 053b LDS     YL,ZKOL_CLS+2
C:00186c 91d0 053c LDS     YH,ZKOL_CLS+2+1
C:00186e   +          STSX    KOL_CLS+0
C:00186e 93a0 0530 STS     KOL_CLS+0,XL
C:001870 93b0 0531 STS     KOL_CLS+0+1,XH
C:001872   +          STSY    KOL_CLS+2
C:001872 93c0 0532 STS     KOL_CLS+2,YL
C:001874 93d0 0533 STS     KOL_CLS+2+1,YH
C:001876 92f0 052a         STS     NUMSECK,NULL
C:001878 92f0 0542         STS     ERRFLG1,NULL
C:00187a 92f0 0543         STS     ERRFLG2,NULL
         ;
C:00187c 92f0 053f         STS     F_ADDR0,NULL
C:00187e 92f0 0540         STS     F_ADDR1,NULL
C:001880 92f0 0541         STS     F_ADDR2,NULL
         
C:001882 d192      F25:    RCALL   NEXTSEC
C:001883 9300 053e         STS     LASTSECFLAG,DATA
C:001885   +          LDIZ    BUFFER
C:001885 e0e0      LDI     ZL,LOW(BUFFER)
C:001886 e0f1      LDI     ZH,HIGH(BUFFER)
C:001887 91a0 053f         LDS     XL,F_ADDR0
C:001889 91b0 0540         LDS     XH,F_ADDR1
C:00188b 91c0 0541         LDS     YL,F_ADDR2
         
C:00188d d2a6      F21:    RCALL   F_IN
C:00188e 9111              LD      TEMP,Z+
C:00188f 1701              CP      DATA,TEMP
C:001890 f011              BREQ    F26
C:001891 92e0 0542         STS     ERRFLG1,ONE
C:001893 9611      F26:    ADIW    XL,1
C:001894 1dcf              ADC     YL,NULL
C:001895 30f3              CPI     ZH,HIGH(BUFFER+512)
C:001896 f7b1              BRNE    F21
         
C:001897   +          LED_OFF
C:001897 9ac7      SBI     PORTB,7
C:001898 fdb3              SBRC    XH,3
C:001899   +          LED_ON  ;мигать при проверке
C:001899 98c7      CBI     PORTB,7
         
C:00189a 93a0 053f         STS     F_ADDR0,XL
C:00189c 93b0 0540         STS     F_ADDR1,XH
C:00189e 93c0 0541         STS     F_ADDR2,YL
         
C:0018a0 30a0              CPI     XL,$00
C:0018a1 f481              BRNE    F22
C:0018a2 2f0b              MOV     DATA,XH
C:0018a3 7007              ANDI    DATA,$07
C:0018a4 f469              BRNE    F22
C:0018a5 9110 0542         LDS     TEMP,ERRFLG1
C:0018a7 2311              TST     TEMP
C:0018a8 f031              BREQ    F23
C:0018a9 92e0 0543         STS     ERRFLG2,ONE
C:0018ab 92f0 0542         STS     ERRFLG1,NULL
C:0018ad e508              LDI     DATA,$58 ;"X"
C:0018ae c001              RJMP    F24
C:0018af e003      F23:    LDI     DATA,$03 ;"█"
C:0018b0 e414      F24:    LDI     TEMP,SCR_CHAR
C:0018b1 d28e              RCALL   FPGA_REG
          F22:
C:0018b2 9100 053e         LDS     DATA,LASTSECFLAG
C:0018b4 2300              TST     DATA
C:0018b5 f661              BRNE    F25
         ;стоп
C:0018b6   +          LED_OFF
C:0018b6 9ac7      SBI     PORTB,7
C:0018b7 d294              RCALL   UART_NEWLINE
C:0018b8 e0a0              LDI     XL,0
C:0018b9 e0b7              LDI     XH,7
C:0018ba d299              RCALL   SET_CURSOR
C:0018bb   +          LDIZ    MSG_F_ERROR*2
C:0018bb e7ea      LDI     ZL,LOW(MSG_F_ERROR*2)
C:0018bc e0f1      LDI     ZH,HIGH(MSG_F_ERROR*2)
C:0018bd 9110 0543         LDS     TEMP,ERRFLG2
C:0018bf 2311              TST     TEMP
C:0018c0 f411              BRNE    F91
C:0018c1   +          LDIZ    MSG_F_COMPLETE*2
C:0018c1 e6e2      LDI     ZL,LOW(MSG_F_COMPLETE*2)
C:0018c2 e0f1      LDI     ZH,HIGH(MSG_F_COMPLETE*2)
C:0018c3 d29c      F91:    RCALL   PRINTSTRZ
C:0018c4 d287              RCALL   UART_NEWLINE
C:0018c5 e0a0              LDI     XL,0
C:0018c6 e0b9              LDI     XH,9
C:0018c7 d28c              RCALL   SET_CURSOR
C:0018c8   +          LDIZ    MSG_HALT*2
C:0018c8 e8e2      LDI     ZL,LOW(MSG_HALT*2)
C:0018c9 e0f1      LDI     ZH,HIGH(MSG_HALT*2)
C:0018ca d295              RCALL   PRINTSTRZ
C:0018cb 9816              CBI     DDRE,6
C:0018cc cfff      STOP1:  RJMP    STOP1
         
         ;
         ;--------------------------------------
         ;out:   DATA
          SD_RECEIVE:
C:0018cd ef0f              SER     DATA
         ; - - - - - - - - - - - - - - - - - - -
         ;in:    DATA
         ;out:   DATA
          SD_EXCHANGE:
C:0018ce c276              RJMP    FPGA_SAME_REG
         ;
         ;--------------------------------------
         ;in;    TEMP - n
          SD_RD_DUMMY:
C:0018cf ef0f              SER     DATA
C:0018d0 dffd              RCALL   SD_EXCHANGE
C:0018d1 951a              DEC     TEMP
C:0018d2 f7e1              BRNE    SD_RD_DUMMY
C:0018d3 9508              RET
         ;
         ;--------------------------------------
         ;in:    Z
          SD_WR_PGM_6:
C:0018d4 e012              LDI     TEMP,2
C:0018d5 dff9              RCALL   SD_RD_DUMMY
C:0018d6 e016              LDI     TEMP,6
          SD_WR_PGX:
C:0018d7 9105      SDWRP61:LPM     DATA,Z+
C:0018d8 dff5              RCALL   SD_EXCHANGE
C:0018d9 951a              DEC     TEMP
C:0018da f7e1              BRNE    SDWRP61
         ; - - - - - - - - - - - - - - - - - - -
         ;out:   DATA
          SD_WAIT_NOTFF:
C:0018db e210              LDI     TEMP,32
C:0018dc ef0f      SDWNFF2:SER     DATA
C:0018dd dff0              RCALL   SD_EXCHANGE
C:0018de 3f0f              CPI     DATA,$FF
C:0018df f411              BRNE    SDWNFF1
C:0018e0 951a              DEC     TEMP
C:0018e1 f7d1              BRNE    SDWNFF2
C:0018e2 9508      SDWNFF1:RET
         ;
         ;--------------------------------------
         ;in:    Z - куда
         ;       Y,X - №сектора
          SD_READ_SECTOR:
C:0018e3   +          PUSHZ
C:0018e3 93ef      PUSH    ZL
C:0018e4 93ff      PUSH    ZH
C:0018e5   +          LDIZ    CMD58*2
C:0018e5 eae0      LDI     ZL,LOW(CMD58*2)
C:0018e6 e0f1      LDI     ZH,HIGH(CMD58*2)
C:0018e7 dfec              RCALL   SD_WR_PGM_6
C:0018e8 dfe4              RCALL   SD_RECEIVE
C:0018e9 fd06              SBRC    DATA,6
C:0018ea c007              RJMP    SDRDSE1
C:0018eb 0faa              LSL     XL
C:0018ec 1fbb              ROL     XH
C:0018ed 1fcc              ROL     YL
C:0018ee 2fdc              MOV     YH,YL
C:0018ef 2fcb              MOV     YL,XH
C:0018f0 2fba              MOV     XH,XL
C:0018f1 27aa              CLR     XL
          SDRDSE1:
C:0018f2 e015              LDI     TEMP,3+2
C:0018f3 dfdb              RCALL   SD_RD_DUMMY
         
C:0018f4 e501              LDI     DATA,CMD_17
C:0018f5 dfd8              RCALL   SD_EXCHANGE
C:0018f6 2f0d              MOV     DATA,YH
C:0018f7 dfd6              RCALL   SD_EXCHANGE
C:0018f8 2f0c              MOV     DATA,YL
C:0018f9 dfd4              RCALL   SD_EXCHANGE
C:0018fa 2f0b              MOV     DATA,XH
C:0018fb dfd2              RCALL   SD_EXCHANGE
C:0018fc 2f0a              MOV     DATA,XL
C:0018fd dfd0              RCALL   SD_EXCHANGE
C:0018fe ef0f              SER     DATA
C:0018ff dfce              RCALL   SD_EXCHANGE
         
C:001900 ef8f              SER     R24
C:001901 dfd9      SDRDSE2:RCALL   SD_WAIT_NOTFF
C:001902 958a              DEC     R24
C:001903 f069              BREQ    SDRDSE8
C:001904 3f0e              CPI     DATA,$FE
C:001905 f7d9              BRNE    SDRDSE2
         
C:001906   +          POPZ
C:001906 91ff      POP     ZH
C:001907 91ef      POP     ZL
C:001908 e080              LDI     R24,$00
C:001909 e092              LDI     R25,$02
C:00190a dfc2      SDRDSE3:RCALL   SD_RECEIVE
C:00190b 9301              ST      Z+,DATA
C:00190c 9701              SBIW    R24,1
C:00190d f7e1              BRNE    SDRDSE3
         
C:00190e e012              LDI     TEMP,2
C:00190f dfbf              RCALL   SD_RD_DUMMY
         ;SDRDSE4:RCALL   SD_WAIT_NOTFF
         ;        CPI     DATA,$FF
         ;        BRNE    SDRDSE4
C:001910 9508              RET
         
          SDRDSE8:
C:001911 e002             LDI     DATA,2  ;ошибка при чтении сектора
C:001912 c164              RJMP    SD_ERROR
         ;
         ;--------------------------------------
         ;чтение сектора данных
          LOAD_DATA:
C:001913   +          LDIZ    BUFFER
C:001913 e0e0      LDI     ZL,LOW(BUFFER)
C:001914 e0f1      LDI     ZH,HIGH(BUFFER)
C:001915 dfcd              RCALL   SD_READ_SECTOR  ;читать один сектор
C:001916 9508              RET
         ;
         ;--------------------------------------
         ;чтение сектора служ.инф. (FAT/DIR/...)
C:001917   +  LOADLST:LDIZ    BUF4FAT
C:001917 e0e0      LDI     ZL,LOW(BUF4FAT)
C:001918 e0f3      LDI     ZH,HIGH(BUF4FAT)
C:001919 dfc9              RCALL   SD_READ_SECTOR  ;читать один сектор
C:00191a   +          LDIZ    BUF4FAT
C:00191a e0e0      LDI     ZL,LOW(BUF4FAT)
C:00191b e0f3      LDI     ZH,HIGH(BUF4FAT)
C:00191c 9508              RET
         ;
         ;--------------------------------------
         ;чтение сектора dir по номеру описателя (Y)
         ;на выходе: DATA=#ff (sreg.Z=0) выход за пределы dir
C:00191d   +  RDDIRSC:PUSHY
C:00191d 93cf      PUSH    YL
C:00191e 93df      PUSH    YH
C:00191f 01de              MOVW    XL,YL
C:001920   +          LDIY    0
C:001920 e0c0      LDI     YL,LOW(0)
C:001921 e0d0      LDI     YH,HIGH(0)
C:001922 e100              LDI     DATA,$10
C:001923 d0c9              RCALL   BCDE_A
C:001924 93af              PUSH    XL
C:001925 9100 0502         LDS     DATA,BYTSSEC
C:001927 930f              PUSH    DATA
C:001928 d0c4              RCALL   BCDE_A
C:001929 9100 0529         LDS     DATA,KCLSDIR
C:00192b 950a              DEC     DATA
C:00192c 170a              CP      DATA,XL
C:00192d f438              BRCC    RDDIRS3
C:00192e 91cf              POP     YL
C:00192f 91cf              POP     YL
C:001930   +          POPY
C:001930 91df      POP     YH
C:001931 91cf      POP     YL
C:001932 ef0f              SER     DATA
C:001933 2300              TST     DATA
C:001934 9508              RET
C:001935   +  RDDIRS3:LDSY    TEK_DIR+2
C:001935 91c0 0527 LDS     YL,TEK_DIR+2
C:001937 91d0 0528 LDS     YH,TEK_DIR+2+1
C:001939 2f0a              MOV     DATA,XL
C:00193a 2300              TST     DATA
C:00193b   +          LDSX    TEK_DIR+0
C:00193b 91a0 0525 LDS     XL,TEK_DIR+0
C:00193d 91b0 0526 LDS     XH,TEK_DIR+0+1
C:00193f f029              BREQ    RDDIRS1
C:001940 930f      RDDIRS2:PUSH    DATA
C:001941 d023              RCALL   RDFATZP
C:001942 910f              POP     DATA
C:001943 950a              DEC     DATA
C:001944 f7d9              BRNE    RDDIRS2
C:001945 d07c      RDDIRS1:RCALL   REALSEC
C:001946 900f              POP     R0
C:001947 940a              DEC     R0
C:001948 910f              POP     DATA
C:001949 2100              AND     DATA,R0
C:00194a 0fa0              ADD     XL,DATA
C:00194b 1dbf              ADC     XH,NULL
C:00194c 1dcf              ADC     YL,NULL
C:00194d 1ddf              ADC     YH,NULL
C:00194e dfc8              RCALL   LOADLST
C:00194f   +          POPY
C:00194f 91df      POP     YH
C:001950 91cf      POP     YL
C:001951 2700              CLR     DATA
C:001952 9508              RET
         ;
         ;--------------------------------------
         ;out:   sreg.C == CLR - EOCmark
         ;(chng: TEMP)
C:001953 e01f      LST_CLS:LDI     TEMP,$0F
C:001954 9100 0500         LDS     DATA,CAL_FAT
C:001956 2300              TST     DATA
C:001957 f419              BRNE    LST_CL1
C:001958 3fa7              CPI     XL,$F7
C:001959 07b1              CPC     XH,TEMP
C:00195a 9508              RET
C:00195b 950a      LST_CL1:DEC     DATA
C:00195c f419              BRNE    LST_CL2
C:00195d 3fa7              CPI     XL,$F7
C:00195e 05bd              CPC     XH,FF
C:00195f 9508              RET
C:001960 3fa7      LST_CL2:CPI     XL,$F7
C:001961 05bd              CPC     XH,FF
C:001962 05cd              CPC     YL,FF
C:001963 07d1              CPC     YH,TEMP
C:001964 9508              RET
         ;
         ;--------------------------------------
         ;
C:001965 9100 0500 RDFATZP:LDS     DATA,CAL_FAT
C:001967 2300              TST     DATA
C:001968 f131              BREQ    RDFATS0         ;FAT12
C:001969 950a              DEC     DATA
C:00196a f071              BREQ    RDFATS1         ;FAT16
         ;FAT32
C:00196b 0faa              LSL     XL
C:00196c 1fbb              ROL     XH
C:00196d 1fcc              ROL     YL
C:00196e 1fdd              ROL     YH
C:00196f 2f0a              MOV     DATA,XL
C:001970 2fab              MOV     XL,XH
C:001971 2fbc              MOV     XH,YL
C:001972 2fcd              MOV     YL,YH
C:001973 27dd              CLR     YH
C:001974 d009              RCALL   RDFATS2
C:001975 9631              ADIW    ZL,1
C:001976 91c1              LD      YL,Z+
C:001977 81d0              LD      YH,Z
C:001978 9508              RET
         ;FAT16
C:001979   +  RDFATS1:LDIY    0
C:001979 e0c0      LDI     YL,LOW(0)
C:00197a e0d0      LDI     YH,HIGH(0)
C:00197b 2f0a              MOV     DATA,XL
C:00197c 2fab              MOV     XL,XH
C:00197d 27bb              CLR     XH
C:00197e 930f      RDFATS2:PUSH    DATA
C:00197f   +          PUSHY
C:00197f 93cf      PUSH    YL
C:001980 93df      PUSH    YH
C:001981   +          LDIZ    FATSTR0
C:001981 e1ed      LDI     ZL,LOW(FATSTR0)
C:001982 e0f5      LDI     ZH,HIGH(FATSTR0)
C:001983 d079              RCALL   BCDEHLP
C:001984 df92              RCALL   LOADLST
C:001985   +          POPY
C:001985 91df      POP     YH
C:001986 91cf      POP     YL
C:001987 910f              POP     DATA
C:001988 0fe0              ADD     ZL,DATA
C:001989 1dff              ADC     ZH,NULL
C:00198a 0fe0              ADD     ZL,DATA
C:00198b 1dff              ADC     ZH,NULL
C:00198c 91a1              LD      XL,Z+
C:00198d 81b0              LD      XH,Z
C:00198e 9508              RET
         ;FAT12
C:00198f 01fd      RDFATS0:MOVW    ZL,XL
C:001990 0fee              LSL     ZL
C:001991 1fff              ROL     ZH
C:001992 0fea              ADD     ZL,XL
C:001993 1ffb              ADC     ZH,XH
C:001994 95f6              LSR     ZH
C:001995 95e7              ROR     ZL
C:001996 2f0a              MOV     DATA,XL
C:001997 2faf              MOV     XL,ZH
C:001998 27bb              CLR     XH
C:001999 27cc              CLR     YL
C:00199a 27dd              CLR     YH
C:00199b 95a6              LSR     XL
C:00199c 930f              PUSH    DATA
C:00199d   +          PUSHZ
C:00199d 93ef      PUSH    ZL
C:00199e 93ff      PUSH    ZH
C:00199f   +          LDIZ    FATSTR0
C:00199f e1ed      LDI     ZL,LOW(FATSTR0)
C:0019a0 e0f5      LDI     ZH,HIGH(FATSTR0)
C:0019a1 d05b              RCALL   BCDEHLP
C:0019a2 df74              RCALL   LOADLST
C:0019a3   +          POPY
C:0019a3 91df      POP     YH
C:0019a4 91cf      POP     YL
C:0019a5 70d1              ANDI    YH,$01
C:0019a6 0fec              ADD     ZL,YL
C:0019a7 1ffd              ADC     ZH,YH
C:0019a8 91c1              LD      YL,Z+
C:0019a9 30f5              CPI     ZH,HIGH(BUF4FAT+512)
C:0019aa f431              BRNE    RDFATS4
C:0019ab 93cf              PUSH    YL
C:0019ac   +          LDIY    0
C:0019ac e0c0      LDI     YL,LOW(0)
C:0019ad e0d0      LDI     YH,HIGH(0)
C:0019ae 9611              ADIW    XL,1
C:0019af df67              RCALL   LOADLST
C:0019b0 91cf              POP     YL
C:0019b1 910f      RDFATS4:POP     DATA
C:0019b2 81b0              LD      XH,Z
C:0019b3 2fac              MOV     XL,YL
C:0019b4   +          LDIY    0
C:0019b4 e0c0      LDI     YL,LOW(0)
C:0019b5 e0d0      LDI     YH,HIGH(0)
C:0019b6 9506              LSR     DATA
C:0019b7 f440              BRCC    RDFATS3
C:0019b8 95b6              LSR     XH
C:0019b9 95a7              ROR     XL
C:0019ba 95b6              LSR     XH
C:0019bb 95a7              ROR     XL
C:0019bc 95b6              LSR     XH
C:0019bd 95a7              ROR     XL
C:0019be 95b6              LSR     XH
C:0019bf 95a7              ROR     XL
C:0019c0 70bf      RDFATS3:ANDI    XH,$0F
C:0019c1 9508              RET
         ;
         ;--------------------------------------
         ;вычисление реального сектора
         ;на входе YX==номер FAT
         ;на выходе YX==адрес сектора
C:0019c2 2f0d      REALSEC:MOV     DATA,YH
C:0019c3 2b0c              OR      DATA,YL
C:0019c4 2b0b              OR      DATA,XH
C:0019c5 2b0a              OR      DATA,XL
C:0019c6 f459              BRNE    REALSE1
C:0019c7   +          LDIZ    FATSTR1
C:0019c7 e2e1      LDI     ZL,LOW(FATSTR1)
C:0019c8 e0f5      LDI     ZH,HIGH(FATSTR1)
C:0019c9   +          LDSX    SEC_FAT+0
C:0019c9 91a0 0507 LDS     XL,SEC_FAT+0
C:0019cb 91b0 0508 LDS     XH,SEC_FAT+0+1
C:0019cd   +          LDSY    SEC_FAT+2
C:0019cd 91c0 0509 LDS     YL,SEC_FAT+2
C:0019cf 91d0 050a LDS     YH,SEC_FAT+2+1
C:0019d1 c02b              RJMP    BCDEHLP
C:0019d2 9712      REALSE1:SBIW    XL,2            ;номер кластера-2
C:0019d3 09cf              SBC     YL,NULL
C:0019d4 09df              SBC     YH,NULL
C:0019d5 9100 0502         LDS     DATA,BYTSSEC
C:0019d7 c004              RJMP    REALSE2
C:0019d8 0faa      REALSE3:LSL     XL
C:0019d9 1fbb              ROL     XH
C:0019da 1fcc              ROL     YL
C:0019db 1fdd              ROL     YH
C:0019dc 9506      REALSE2:LSR     DATA
C:0019dd f7d0              BRCC    REALSE3
                                         ;умножили на размер кластера
C:0019de   +          LDIZ    STARTRZ
C:0019de e0ed      LDI     ZL,LOW(STARTRZ)
C:0019df e0f5      LDI     ZH,HIGH(STARTRZ)
C:0019e0 d01c              RCALL   BCDEHLP         ;прибавили смещение от начала диска
C:0019e1   +          LDIZ    FRSTDAT
C:0019e1 e1e1      LDI     ZL,LOW(FRSTDAT)
C:0019e2 e0f5      LDI     ZH,HIGH(FRSTDAT)
C:0019e3 c019              RJMP    BCDEHLP         ;прибавили смещение от начала раздела
         ;
         ;--------------------------------------
         ;YX>>9 (деление на 512)
C:0019e4 2fab      BCDE200:MOV     XL,XH
C:0019e5 2fbc              MOV     XH,YL
C:0019e6 2fcd              MOV     YL,YH
C:0019e7 e0d0              LDI     YH,0
C:0019e8 e001              LDI     DATA,1
         ; - - - - - - - - - - - - - - - - - - -
         ;YXDATA>>до"переноса"
         ;если в DATA вкл.только один бит, то получается
         ;YX=YX/DATA
C:0019e9 95d6      BCDE_A1:LSR     YH
C:0019ea 95c7              ROR     YL
C:0019eb 95b7              ROR     XH
C:0019ec 95a7              ROR     XL
C:0019ed 9507      BCDE_A: ROR     DATA
C:0019ee f7d0              BRCC    BCDE_A1
C:0019ef 9508              RET
         ;
         ;--------------------------------------
         ;YX=[Z]-YX
C:0019f0 9101      BCDEHLM:LD      DATA,Z+
C:0019f1 1b0a              SUB     DATA,XL
C:0019f2 2fa0              MOV     XL,DATA
C:0019f3 9101              LD      DATA,Z+
C:0019f4 0b0b              SBC     DATA,XH
C:0019f5 2fb0              MOV     XH,DATA
C:0019f6 9101              LD      DATA,Z+
C:0019f7 0b0c              SBC     DATA,YL
C:0019f8 2fc0              MOV     YL,DATA
C:0019f9 8100              LD      DATA,Z
C:0019fa 0b0d              SBC     DATA,YH
C:0019fb 2fd0              MOV     YH,DATA
C:0019fc 9508              RET
         ;
         ;--------------------------------------
         ;YX=YX+[Z]
C:0019fd 9101      BCDEHLP:LD      DATA,Z+
C:0019fe 0fa0              ADD     XL,DATA
C:0019ff 9101              LD      DATA,Z+
C:001a00 1fb0              ADC     XH,DATA
C:001a01 9101              LD      DATA,Z+
C:001a02 1fc0              ADC     YL,DATA
C:001a03 8100              LD      DATA,Z
C:001a04 1fd0              ADC     YH,DATA
C:001a05 9508              RET
         ;
         ;--------------------------------------
         ;YX=YX+R25R24
C:001a06 0fa8      HLDEPBC:ADD     XL,R24
C:001a07 1fb9              ADC     XH,R25
C:001a08 1dcf              ADC     YL,NULL
C:001a09 1ddf              ADC     YH,NULL
C:001a0a 9508              RET
         ;
         ;--------------------------------------
         ;
C:001a0b dfd8      RASCHET:RCALL   BCDE200
C:001a0c   +          LDIZ    SEC_FAT
C:001a0c e0e7      LDI     ZL,LOW(SEC_FAT)
C:001a0d e0f5      LDI     ZH,HIGH(SEC_FAT)
C:001a0e dfe1              RCALL   BCDEHLM
C:001a0f 2f0a              MOV     DATA,XL
C:001a10 7f00              ANDI    DATA,$F0
C:001a11 2b0b              OR      DATA,XH
C:001a12 2b0c              OR      DATA,YL
C:001a13 2b0d              OR      DATA,YH
C:001a14 9508              RET
         ;
         ;--------------------------------------
         ;чтение очередного сектора файла в BUFFER
         ;out:   DATA == 0 - считан последний сектор файла
          NEXTSEC:
C:001a15 e517              LDI     TEMP,SD_CS0
C:001a16 ef0f              SER     DATA
C:001a17 d128              RCALL   FPGA_REG
         
C:001a18   +          LDIZ    KOL_CLS
C:001a18 e3e0      LDI     ZL,LOW(KOL_CLS)
C:001a19 e0f5      LDI     ZH,HIGH(KOL_CLS)
C:001a1a 9101              LD      DATA,Z+
C:001a1b 9111              LD      TEMP,Z+
C:001a1c 2b01              OR      DATA,TEMP
C:001a1d 9111              LD      TEMP,Z+
C:001a1e 2b01              OR      DATA,TEMP
C:001a1f 9111              LD      TEMP,Z+
C:001a20 2b01              OR      DATA,TEMP
C:001a21 f1e1              BREQ    LSTCLSF
C:001a22   +          LDSX    TFILCLS+0
C:001a22 91a0 052b LDS     XL,TFILCLS+0
C:001a24 91b0 052c LDS     XH,TFILCLS+0+1
C:001a26   +          LDSY    TFILCLS+2
C:001a26 91c0 052d LDS     YL,TFILCLS+2
C:001a28 91d0 052e LDS     YH,TFILCLS+2+1
C:001a2a df97              RCALL   REALSEC
C:001a2b 9100 052a         LDS     DATA,NUMSECK
C:001a2d 0fa0              ADD     XL,DATA
C:001a2e 1dbf              ADC     XH,NULL
C:001a2f 1dcf              ADC     YL,NULL
C:001a30 1ddf              ADC     YH,NULL
C:001a31 dee1              RCALL   LOAD_DATA
C:001a32   +          LDSX    TFILCLS+0
C:001a32 91a0 052b LDS     XL,TFILCLS+0
C:001a34 91b0 052c LDS     XH,TFILCLS+0+1
C:001a36   +          LDSY    TFILCLS+2
C:001a36 91c0 052d LDS     YL,TFILCLS+2
C:001a38 91d0 052e LDS     YH,TFILCLS+2+1
C:001a3a 9100 052a         LDS     DATA,NUMSECK
C:001a3c 9503              INC     DATA
C:001a3d 9300 052a         STS     NUMSECK,DATA
C:001a3f 9110 0502         LDS     TEMP,BYTSSEC
C:001a41 1710              CP      TEMP,DATA
C:001a42 f4c9              BRNE    NEXT_OK
         
C:001a43 92f0 052a         STS     NUMSECK,NULL
C:001a45 df1f              RCALL   RDFATZP
C:001a46   +          STSX    TFILCLS+0
C:001a46 93a0 052b STS     TFILCLS+0,XL
C:001a48 93b0 052c STS     TFILCLS+0+1,XH
C:001a4a   +          STSY    TFILCLS+2
C:001a4a 93c0 052d STS     TFILCLS+2,YL
C:001a4c 93d0 052e STS     TFILCLS+2+1,YH
C:001a4e   +          LDIZ    KOL_CLS
C:001a4e e3e0      LDI     ZL,LOW(KOL_CLS)
C:001a4f e0f5      LDI     ZH,HIGH(KOL_CLS)
C:001a50 8100              LD      DATA,Z
C:001a51 5001              SUBI    DATA,1
C:001a52 9301              ST      Z+,DATA
C:001a53 8100              LD      DATA,Z
C:001a54 090f              SBC     DATA,NULL
C:001a55 9301              ST      Z+,DATA
C:001a56 8100              LD      DATA,Z
C:001a57 090f              SBC     DATA,NULL
C:001a58 9301              ST      Z+,DATA
C:001a59 8100              LD      DATA,Z
C:001a5a 090f              SBC     DATA,NULL
C:001a5b 9301              ST      Z+,DATA
C:001a5c ef0f      NEXT_OK:SER     DATA
C:001a5d 9508              RET
         
C:001a5e   +  LSTCLSF:LDSX    TFILCLS+0
C:001a5e 91a0 052b LDS     XL,TFILCLS+0
C:001a60 91b0 052c LDS     XH,TFILCLS+0+1
C:001a62   +          LDSY    TFILCLS+2
C:001a62 91c0 052d LDS     YL,TFILCLS+2
C:001a64 91d0 052e LDS     YH,TFILCLS+2+1
C:001a66 df5b              RCALL   REALSEC
C:001a67 9100 052a         LDS     DATA,NUMSECK
C:001a69 0fa0              ADD     XL,DATA
C:001a6a 1dbf              ADC     XH,NULL
C:001a6b 1dcf              ADC     YL,NULL
C:001a6c 1ddf              ADC     YH,NULL
C:001a6d dea5              RCALL   LOAD_DATA
C:001a6e 9100 052a         LDS     DATA,NUMSECK
C:001a70 9503              INC     DATA
C:001a71 9300 052a         STS     NUMSECK,DATA
C:001a73 9110 052f         LDS     TEMP,MPHWOST
C:001a75 1b01              SUB     DATA,TEMP
C:001a76 9508              RET
         ;
         ;--------------------------------------
         ;ошибки
          SD_ERROR:
C:001a77 9300 053d         STS     SDERROR,DATA
C:001a79 ef1f              LDI     TEMP,LOW(RAMEND)
C:001a7a bf1d              OUT     SPL,TEMP
C:001a7b e110              LDI     TEMP,HIGH(RAMEND)
C:001a7c bf1e              OUT     SPH,TEMP
         
C:001a7d d0ce              RCALL   UART_NEWLINE
C:001a7e e0a0              LDI     XL,0
C:001a7f e0b4              LDI     XH,4
C:001a80 d0d3              RCALL   SET_CURSOR
C:001a81   +          LDIZ    MSG_SDERROR*2
C:001a81 efee      LDI     ZL,LOW(MSG_SDERROR*2)
C:001a82 e0f0      LDI     ZH,HIGH(MSG_SDERROR*2)
C:001a83 d0dc              RCALL   PRINTSTRZ
C:001a84 9100 053d         LDS     DATA,SDERROR
C:001a86 3001              CPI     DATA,1
C:001a87 f421              BRNE    SD_ERR2
C:001a88   +          LDIZ    MSG_CARD*2
C:001a88 e0ea      LDI     ZL,LOW(MSG_CARD*2)
C:001a89 e0f1      LDI     ZH,HIGH(MSG_CARD*2)
C:001a8a d0d5              RCALL   PRINTSTRZ
C:001a8b c011              RJMP    SD_NOTFOUND
          SD_ERR2:
C:001a8c 3002              CPI     DATA,2
C:001a8d f421              BRNE    SD_ERR3
C:001a8e   +          LDIZ    MSG_READERROR*2
C:001a8e e1e0      LDI     ZL,LOW(MSG_READERROR*2)
C:001a8f e0f1      LDI     ZH,HIGH(MSG_READERROR*2)
C:001a90 d0cf              RCALL   PRINTSTRZ
C:001a91 c01e              RJMP    SD_ERR9
          SD_ERR3:
C:001a92 3003              CPI     DATA,3
C:001a93 f421              BRNE    SD_ERR4
C:001a94   +          LDIZ    MSG_FAT*2
C:001a94 e1ec      LDI     ZL,LOW(MSG_FAT*2)
C:001a95 e0f1      LDI     ZH,HIGH(MSG_FAT*2)
C:001a96 d0c9              RCALL   PRINTSTRZ
C:001a97 c005              RJMP    SD_NOTFOUND
          SD_ERR4:
C:001a98 3004              CPI     DATA,4
C:001a99 f439              BRNE    SD_ERR5
C:001a9a   +          LDIZ    MSG_FILE*2
C:001a9a e2e0      LDI     ZL,LOW(MSG_FILE*2)
C:001a9b e0f1      LDI     ZH,HIGH(MSG_FILE*2)
C:001a9c d0c3              RCALL   PRINTSTRZ
          SD_NOTFOUND:
C:001a9d   +          LDIZ    MSG_NOTFOUND*2
C:001a9d e2e6      LDI     ZL,LOW(MSG_NOTFOUND*2)
C:001a9e e0f1      LDI     ZH,HIGH(MSG_NOTFOUND*2)
C:001a9f d0c0              RCALL   PRINTSTRZ
C:001aa0 c00f              RJMP    SD_ERR9
          SD_ERR5:
C:001aa1 3005              CPI     DATA,5
C:001aa2 f439              BRNE    SD_ERR6
C:001aa3   +          LDIZ    MSG_FILE*2
C:001aa3 e2e0      LDI     ZL,LOW(MSG_FILE*2)
C:001aa4 e0f1      LDI     ZH,HIGH(MSG_FILE*2)
C:001aa5 d0ba              RCALL   PRINTSTRZ
C:001aa6   +          LDIZ    MSG_EMPTY*2
C:001aa6 e3e2      LDI     ZL,LOW(MSG_EMPTY*2)
C:001aa7 e0f1      LDI     ZH,HIGH(MSG_EMPTY*2)
C:001aa8 d0b7              RCALL   PRINTSTRZ
C:001aa9 c006              RJMP    SD_ERR9
          SD_ERR6:
C:001aaa   +          LDIZ    MSG_FILE*2
C:001aaa e2e0      LDI     ZL,LOW(MSG_FILE*2)
C:001aab e0f1      LDI     ZH,HIGH(MSG_FILE*2)
C:001aac d0b3              RCALL   PRINTSTRZ
C:001aad   +          LDIZ    MSG_TOOBIG*2
C:001aad e3ea      LDI     ZL,LOW(MSG_TOOBIG*2)
C:001aae e0f1      LDI     ZH,HIGH(MSG_TOOBIG*2)
C:001aaf d0b0              RCALL   PRINTSTRZ
          SD_ERR9:
         ;
C:001ab0 91e0 053d         LDS     ZL,SDERROR
C:001ab2   +  SD_ERR1:LED_ON
C:001ab2 98c7      CBI     PORTB,7
C:001ab3 e005              LDI     DATA,5
C:001ab4 d0d5              RCALL   BEEP
C:001ab5   +          LED_OFF
C:001ab5 9ac7      SBI     PORTB,7
C:001ab6 e005              LDI     DATA,5
C:001ab7 d0e1              RCALL   DELAY
C:001ab8 95ea              DEC     ZL
C:001ab9 f7c1              BRNE    SD_ERR1
         ;
C:001aba d091              RCALL   UART_NEWLINE
C:001abb e0a0              LDI     XL,0
C:001abc e0b6              LDI     XH,6
C:001abd d096              RCALL   SET_CURSOR
C:001abe   +          LDIZ    MSG_HALT*2
C:001abe e8e2      LDI     ZL,LOW(MSG_HALT*2)
C:001abf e0f1      LDI     ZH,HIGH(MSG_HALT*2)
C:001ac0 d09f              RCALL   PRINTSTRZ
C:001ac1 9816              CBI     DDRE,6
C:001ac2 cfff      STOP2:  RJMP    STOP2
         ;
         ;======================================
         ;чтение ID Flash-ROM чипа
         ;out:   ZL,ZH
C:001ac3 d03c      F_ID:   RCALL   F_RST
C:001ac4 e900              LDI     DATA,$90
C:001ac5 d040              RCALL   F_CMD
C:001ac6 ef14              LDI     TEMP,FLASH_CTRL
C:001ac7 e003              LDI     DATA,0B00000011
C:001ac8 d077              RCALL   FPGA_REG
C:001ac9 e0a0              LDI     XL,$00
C:001aca e0b0              LDI     XH,$00
C:001acb e0c0              LDI     YL,$00
C:001acc d067              RCALL   F_IN
C:001acd 2fe0              MOV     ZL,DATA
C:001ace e0a1              LDI     XL,$01
C:001acf d064              RCALL   F_IN
C:001ad0 2ff0              MOV     ZH,DATA
C:001ad1 c02e              RJMP    F_RST
         ;
         ;--------------------------------------
         ;запись одного байта во Flash-ROM
         ;in:    RAM[Z] == data
         ;       XL,XH,YL == address
C:001ad2 ea00      F_WRITE:LDI     DATA,$A0
C:001ad3 d032              RCALL   F_CMD
C:001ad4 ef14              LDI     TEMP,FLASH_CTRL
C:001ad5 e001              LDI     DATA,0B00000001
C:001ad6 d069              RCALL   FPGA_REG
C:001ad7 ef10              LDI     TEMP,FLASH_LOADDR
C:001ad8 2f0a              MOV     DATA,XL
C:001ad9 d066              RCALL   FPGA_REG
C:001ada ef11              LDI     TEMP,FLASH_MIDADDR
C:001adb 2f0b              MOV     DATA,XH
C:001adc d063              RCALL   FPGA_REG
C:001add ef12              LDI     TEMP,FLASH_HIADDR
C:001ade 2f0c              MOV     DATA,YL
C:001adf d060              RCALL   FPGA_REG
C:001ae0 ef13              LDI     TEMP,FLASH_DATA
C:001ae1 8100              LD      DATA,Z
C:001ae2 d05d              RCALL   FPGA_REG
C:001ae3 ef14              LDI     TEMP,FLASH_CTRL
C:001ae4 e005              LDI     DATA,0B00000101
C:001ae5 d05a              RCALL   FPGA_REG
C:001ae6 e001              LDI     DATA,0B00000001
C:001ae7 d05d              RCALL   FPGA_SAME_REG
C:001ae8 e003              LDI     DATA,0B00000011
C:001ae9 d05b              RCALL   FPGA_SAME_REG
C:001aea ef13              LDI     TEMP,FLASH_DATA
C:001aeb d054              RCALL   FPGA_REG
C:001aec d058      F_WRIT1:RCALL   FPGA_SAME_REG
C:001aed 8110              LD      TEMP,Z
C:001aee 2701              EOR     DATA,TEMP
C:001aef fd07              SBRC    DATA,7
C:001af0 cffb              RJMP    F_WRIT1
C:001af1 9508              RET
         ;
         ;--------------------------------------
         ;стирание Flash-ROM
C:001af2 e800      F_ERASE:LDI     DATA,$80
C:001af3 d012              RCALL   F_CMD
C:001af4 e100              LDI     DATA,$10
C:001af5 d010              RCALL   F_CMD
C:001af6 ef14              LDI     TEMP,FLASH_CTRL
C:001af7 e003              LDI     DATA,0B00000011
C:001af8 d047              RCALL   FPGA_REG
C:001af9 ef13              LDI     TEMP,FLASH_DATA
C:001afa d045              RCALL   FPGA_REG
C:001afb   +  F_ERAS1:LED_OFF
C:001afb 9ac7      SBI     PORTB,7
C:001afc d048              RCALL   FPGA_SAME_REG
C:001afd   +          LED_ON
C:001afd 98c7      CBI     PORTB,7
C:001afe ff07              SBRS    DATA,7
C:001aff cffb              RJMP    F_ERAS1
         ;
         ; - - - - - - - - - - - - - - - - - - -
         ;сброс Flash-ROM чипа
C:001b00 ef00      F_RST:  LDI     DATA,$F0
C:001b01 d004              RCALL   F_CMD
C:001b02 e113              LDI     TEMP,19 ;~5 us @ 11.0592 MHz
C:001b03 951a      F_RST1: DEC     TEMP    ;1
C:001b04 f7f1              BRNE    F_RST1  ;2
C:001b05 9508              RET
         ;
         ;--------------------------------------
         ;комманда в Flash-ROM чип
         ;in:    DATA == instructions
C:001b06 930f      F_CMD:  PUSH    DATA
C:001b07 ef14              LDI     TEMP,FLASH_CTRL
C:001b08 e001              LDI     DATA,0B00000001
C:001b09 d036              RCALL   FPGA_REG
C:001b0a ef10              LDI     TEMP,FLASH_LOADDR
C:001b0b e505              LDI     DATA,$55
C:001b0c d033              RCALL   FPGA_REG
C:001b0d ef11              LDI     TEMP,FLASH_MIDADDR
C:001b0e e505              LDI     DATA,$55
C:001b0f d030              RCALL   FPGA_REG
C:001b10 ef13              LDI     TEMP,FLASH_DATA
C:001b11 ea0a              LDI     DATA,$AA
C:001b12 d02d              RCALL   FPGA_REG
C:001b13 ef14              LDI     TEMP,FLASH_CTRL
C:001b14 e005              LDI     DATA,0B00000101
C:001b15 d02a              RCALL   FPGA_REG
C:001b16 e001              LDI     DATA,0B00000001
C:001b17 d02d              RCALL   FPGA_SAME_REG
C:001b18 ef10              LDI     TEMP,FLASH_LOADDR
C:001b19 ea0a              LDI     DATA,$AA
C:001b1a d025              RCALL   FPGA_REG
C:001b1b ef11              LDI     TEMP,FLASH_MIDADDR
C:001b1c e20a              LDI     DATA,$2A
C:001b1d d022              RCALL   FPGA_REG
C:001b1e ef13              LDI     TEMP,FLASH_DATA
C:001b1f e505              LDI     DATA,$55
C:001b20 d01f              RCALL   FPGA_REG
C:001b21 ef14              LDI     TEMP,FLASH_CTRL
C:001b22 e005              LDI     DATA,0B00000101
C:001b23 d01c              RCALL   FPGA_REG
C:001b24 e001              LDI     DATA,0B00000001
C:001b25 d01f              RCALL   FPGA_SAME_REG
C:001b26 ef10              LDI     TEMP,FLASH_LOADDR
C:001b27 e505              LDI     DATA,$55
C:001b28 d017              RCALL   FPGA_REG
C:001b29 ef11              LDI     TEMP,FLASH_MIDADDR
C:001b2a e505              LDI     DATA,$55
C:001b2b d014              RCALL   FPGA_REG
C:001b2c ef13              LDI     TEMP,FLASH_DATA
C:001b2d 910f              POP     DATA
C:001b2e d011              RCALL   FPGA_REG
C:001b2f ef14              LDI     TEMP,FLASH_CTRL
C:001b30 e005              LDI     DATA,0B00000101
C:001b31 d00e              RCALL   FPGA_REG
C:001b32 e001              LDI     DATA,0B00000001
C:001b33 c011              RJMP    FPGA_SAME_REG
         ;
         ;--------------------------------------
         ;чтение одного байта Flash-ROM
         ;in:    XL,XH,YL == address
         ;out:   DATA == data
C:001b34 ef10      F_IN:   LDI     TEMP,FLASH_LOADDR
C:001b35 2f0a              MOV     DATA,XL
C:001b36 d009              RCALL   FPGA_REG
C:001b37 ef11              LDI     TEMP,FLASH_MIDADDR
C:001b38 2f0b              MOV     DATA,XH
C:001b39 d006              RCALL   FPGA_REG
C:001b3a ef12              LDI     TEMP,FLASH_HIADDR
C:001b3b 2f0c              MOV     DATA,YL
C:001b3c d003              RCALL   FPGA_REG
C:001b3d ef13              LDI     TEMP,FLASH_DATA
C:001b3e ef0f              LDI     DATA,$FF
C:001b3f c000              RJMP    FPGA_REG
         ;
         ;--------------------------------------
         ;обмен с регистрами в FPGA
         ;in:    TEMP == номер регистра
         ;       DATA == данные
         ;out:   DATA == данные
          FPGA_REG:
C:001b40 930f              PUSH    DATA
C:001b41   +          SPICS_SET
C:001b41 9ac0      SBI     PORTB,0
C:001b42 b91f              OUT     SPDR,TEMP
C:001b43 d003              RCALL   RD_WHEN_RDY
C:001b44 910f              POP     DATA
         ;обмен без установки регистра
         ;in:    DATA == данные
         ;out:   DATA == данные
          FPGA_SAME_REG:
C:001b45   +          SPICS_CLR
C:001b45 98c0      CBI     PORTB,0
C:001b46 b90f              OUT     SPDR,DATA
         ;ожидание окончания обмена с FPGA по SPI
         ;и чтение пришедших данных
         ;out:   DATA == данные
          RD_WHEN_RDY:
C:001b47 9b77              SBIS    SPSR,SPIF
C:001b48 cffe              RJMP    RD_WHEN_RDY
C:001b49 b10f              IN      DATA,SPDR
C:001b4a   +          SPICS_SET
C:001b4a 9ac0      SBI     PORTB,0
C:001b4b 9508              RET
         ;
         ;--------------------------------------
         ;
          UART_NEWLINE:
C:001b4c   +          LDIZ    MSG_NEWLINE*2
C:001b4c ebe0      LDI     ZL,LOW(MSG_NEWLINE*2)
C:001b4d e0f0      LDI     ZH,HIGH(MSG_NEWLINE*2)
         ;
         ; - - - - - - - - - - - - - - - - - - -
         ;вывод строки на UART
         ;in:    Z == указательна строку (в младших 64K)
          UART_PRINTSTRZ:
C:001b4e 9105      UPSTRZ1:LPM     DATA,Z+
C:001b4f 2300              TST     DATA
C:001b50 f011              BREQ    UPSTRZ2
C:001b51 d02f              RCALL   UART_PUTCHAR
C:001b52 cffb              RJMP    UPSTRZ1
C:001b53 9508      UPSTRZ2:RET
         ;
         ;--------------------------------------
         ;установка позиции печати на экране
         ;in:    XL == x (0..31)
         ;       XH == y (0..23)
          SET_CURSOR:
C:001b54 e210              LDI     TEMP,32
C:001b55 9fb1              MUL     XH,TEMP
C:001b56 27bb              CLR     XH
C:001b57 0da0              ADD     XL,R0
C:001b58 1db1              ADC     XH,R1
C:001b59 9711              SBIW    XL,1
C:001b5a e410              LDI     TEMP,SCR_LOADDR
C:001b5b 2f0a              MOV     DATA,XL
C:001b5c dfe3              RCALL   FPGA_REG
C:001b5d e411              LDI     TEMP,SCR_HIADDR
C:001b5e 2f0b              MOV     DATA,XH
C:001b5f cfe0              RJMP    FPGA_REG
         ;
         ;--------------------------------------
         ;вывод строки на экран и на UART
         ;in:    Z == указательна строку (в младших 64K)
          PRINTSTRZ:
C:001b60 9105      PRSTRZ1:LPM     DATA,Z+
C:001b61 2300              TST     DATA
C:001b62 f011              BREQ    PRSTRZ2
C:001b63 d017              RCALL   PUTCHAR
C:001b64 cffb              RJMP    PRSTRZ1
C:001b65 9508      PRSTRZ2:RET
         ;
         ;--------------------------------------
         ;out byte in dec
         ;in:    DATA == byte (0..99)
C:001b66 5d00      DECBYTE:SUBI    DATA,208
C:001b67 ff07              SBRS    DATA,7
C:001b68 5300              SUBI    DATA,48
C:001b69 5e08              SUBI    DATA,232
C:001b6a ff06              SBRS    DATA,6
C:001b6b 5108              SUBI    DATA,24
C:001b6c 5f04              SUBI    DATA,244
C:001b6d ff05              SBRS    DATA,5
C:001b6e 500c              SUBI    DATA,12
C:001b6f 5f0a              SUBI    DATA,250
C:001b70 ff04              SBRS    DATA,4
C:001b71 5006              SUBI    DATA,6
         ;
         ; - - - - - - - - - - - - - - - - - - -
         ;out byte in hex
         ;in:    DATA == byte
C:001b72 930f      HEXBYTE:PUSH    DATA
C:001b73 9502              SWAP    DATA
C:001b74 d001              RCALL   HEXHALF
C:001b75 910f              POP     DATA
C:001b76 700f      HEXHALF:ANDI    DATA,$0F
C:001b77 300a              CPI     DATA,$0A
C:001b78 f008              BRCS    HEXBYT1
C:001b79   +          ADDI    DATA,$07
C:001b79 5f09      SUBI    DATA,(-$07&$FF)
C:001b7a   +  HEXBYT1:ADDI    DATA,$30
C:001b7a 5d00      SUBI    DATA,(-$30&$FF)
         ;
         ; - - - - - - - - - - - - - - - - - - -
         ;вывод символа на экран и на UART
         ;in:    DATA == char
C:001b7b 930f      PUTCHAR:PUSH    DATA
C:001b7c 931f              PUSH    TEMP
C:001b7d e414              LDI     TEMP,SCR_CHAR
C:001b7e dfc1              RCALL   FPGA_REG
C:001b7f 911f              POP     TEMP
C:001b80 910f              POP     DATA
          UART_PUTCHAR:
C:001b81 931f              PUSH    TEMP
C:001b82   +  UPCHR1: INPORT  TEMP,UCSR1A
C:001b82 9110 009b LDS     TEMP,UCSR1A+$20*(UCSR1A<$40)
C:001b84 ff15              SBRS    TEMP,UDRE
C:001b85 cffc              RJMP    UPCHR1
C:001b86   +          OUTPORT UDR1,DATA
C:001b86 9300 009c STS     UDR1+$20*(UDR1<$40),DATA
C:001b88 911f              POP     TEMP
C:001b89 9508              RET
         ;
         ;--------------------------------------
         ;in:    DATA == продолжительность *0.1 сек
          BEEP:
C:001b8a e614      BEE2:   LDI     TEMP,100;100 периодов 1кГц
C:001b8b 981e      BEE1:   CBI     PORTE,6
C:001b8c d007              RCALL   BEEPDLY
C:001b8d 9a1e              SBI     PORTE,6
C:001b8e d005              RCALL   BEEPDLY
C:001b8f 951a              DEC     TEMP
C:001b90 f7d1              BRNE    BEE1
C:001b91 950a              DEC     DATA
C:001b92 f7b9              BRNE    BEE2
C:001b93 9508              RET
         
C:001b94 e684      BEEPDLY:LDI     R24,$64
C:001b95 e095              LDI     R25,$05
C:001b96 9701      BEEPDL1:SBIW    R24,1
C:001b97 f7f1              BRNE    BEEPDL1
C:001b98 9508              RET
         ;
         ;--------------------------------------
         ;in:    DATA == продолжительность *0.1 сек
C:001b99 e14e      DELAY:  LDI     R20,$1E ;\
C:001b9a ef5e              LDI     R21,$FE ;/ 0,1 ᥪ @ 11.0592MHz
C:001b9b 95c8      DELAY1: LPM             ;3
C:001b9c 95c8              LPM             ;3
C:001b9d 95c8              LPM             ;3
C:001b9e 95c8              LPM             ;3
C:001b9f 5041              SUBI    R20,1   ;1
C:001ba0 4050              SBCI    R21,0   ;1
C:001ba1 4000              SBCI    DATA,0  ;1
C:001ba2 f7c1              BRNE    DELAY1  ;2(1)
C:001ba3 9508              RET
         ;
         ;--------------------------------------
         ;


Segment usage:
   Code      :      7076 words (14152 bytes)
   Data      :        68 bytes
   EEPROM    :         0 bytes

Assembly completed with no errors.