Blame | Last modification | View Log | Download | RSS feed
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 $0100BUFFER:.ORG $0300BUF4FAT:.ORG $0500D:000500 CAL_FAT:.BYTE 1 ;тип обнаруженной FATD:000501 MANYFAT:.BYTE 1 ;количество FAT-таблицD:000502 BYTSSEC:.BYTE 1 ;количество секторов в кластереD:000503 ROOTCLS:.BYTE 4 ;сектор начала root директорииD:000507 SEC_FAT:.BYTE 4 ;количество секторов одной FATD:00050b RSVDSEC:.BYTE 2 ;размер резервной областиD:00050d STARTRZ:.BYTE 4 ;начало диска/разделаD:000511 FRSTDAT:.BYTE 4 ;адрес первого сектора данных от BPBD: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 ;кол-во кластеров файла минус 1D:000534 ZTFILCLS:.BYTE 4D:000538 ZMPHWOST:.BYTE 1D:000539 ZKOL_CLS:.BYTE 4D:00053d SDERROR:.BYTE 1LASTSECFLAG:D:00053e .BYTE 1D:00053f F_ADDR0:.BYTE 1D:000540 F_ADDR1:.BYTE 1D:000541 F_ADDR2:.BYTE 1D:000542 ERRFLG1:.BYTE 1D:000543 ERRFLG2:.BYTE 1;;--------------------------------------;.CSEG.ORG 0C:000000 940c 1525 JMP STARTC:000002 940c 1525 JMP START ;EXT_INT0 ; IRQ0 HandlerC:000004 940c 1525 JMP START ;EXT_INT1 ; IRQ1 HandlerC:000006 940c 1525 JMP START ;EXT_INT2 ; IRQ2 HandlerC:000008 940c 1525 JMP START ;EXT_INT3 ; IRQ3 HandlerC:00000a 940c 1525 JMP START ;EXT_INT4 ; IRQ4 HandlerC:00000c 940c 1525 JMP START ;EXT_INT5 ; IRQ5 HandlerC:00000e 940c 1525 JMP START ;EXT_INT6 ; IRQ6 HandlerC:000010 940c 1525 JMP START ;EXT_INT7 ; IRQ7 HandlerC:000012 940c 1525 JMP START ;TIM2_COMP ; Timer2 Compare HandlerC:000014 940c 1525 JMP START ;TIM2_OVF ; Timer2 Overflow HandlerC:000016 940c 1525 JMP START ;TIM1_CAPT ; Timer1 Capture HandlerC:000018 940c 1525 JMP START ;TIM1_COMPA ; Timer1 CompareA HandlerC:00001a 940c 1525 JMP START ;TIM1_COMPB ; Timer1 CompareB HandlerC:00001c 940c 1525 JMP START ;TIM1_OVF ; Timer1 Overflow HandlerC:00001e 940c 1525 JMP START ;TIM0_COMP ; Timer0 Compare HandlerC:000020 940c 1525 JMP START ;TIM0_OVF ; Timer0 Overflow HandlerC:000022 940c 1525 JMP START ;SPI_STC ; SPI Transfer Complete HandlerC:000024 940c 1525 JMP START ;USART0_RXC ; USART0 RX Complete HandlerC:000026 940c 1525 JMP START ;USART0_DRE ; USART0,UDR Empty HandlerC:000028 940c 1525 JMP START ;USART0_TXC ; USART0 TX Complete HandlerC:00002a 940c 1525 JMP START ;ADC ; ADC Conversion Complete HandlerC:00002c 940c 1525 JMP START ;EE_RDY ; EEPROM Ready HandlerC:00002e 940c 1525 JMP START ;ANA_COMP ; Analog Comparator HandlerC:000030 940c 1525 JMP START ;TIM1_COMPC ; Timer1 CompareC HandlerC:000032 940c 1525 JMP START ;TIM3_CAPT ; Timer3 Capture HandlerC:000034 940c 1525 JMP START ;TIM3_COMPA ; Timer3 CompareA HandlerC:000036 940c 1525 JMP START ;TIM3_COMPB ; Timer3 CompareB HandlerC:000038 940c 1525 JMP START ;TIM3_COMPC ; Timer3 CompareC HandlerC:00003a 940c 1525 JMP START ;TIM3_OVF ; Timer3 Overflow HandlerC:00003c 940c 1525 JMP START ;USART1_RXC ; USART1 RX Complete HandlerC:00003e 940c 1525 JMP START ;USART1_DRE ; USART1,UDR Empty HandlerC:000040 940c 1525 JMP START ;USART1_TXC ; USART1 TX Complete HandlerC:000042 940c 1525 JMP START ;TWI_INT ; Two-wire Serial Interface Interrupt HandlerC:000044 940c 1525 JMP START ;SPM_RDY ; SPM Ready Handler;;--------------------------------------;MSG_CFGFPGA:.DB $0D,$0A,$0A,$0A,"Load FPGA configuration... ",0C:000046 0D0A0A0A4C6F6164204650474120636F6E66696775726174696F6E2E2E2E2000MSG_OK:.DB "Ok!",$0AC:000056 4F6B210AMSG_NEWLINE:.DB $0D,$0A,0,0C:000058 0D0A0000;MSG_TITLE:.DB " ZX Evolution Flasher ",0C:00005A 20205A582045766F6C7574696F6E20466C61736865722000MSG_ID_FLASH:.DB "ID flash memory chip: ",0,0C:000066 494420666C617368206D656D6F727920636869703A200000MSG_OPENFILE:.DB "Open file from SD-card...",0C:000072 4F70656E2066696C652066726F6D2053442D636172642E2E2E00MSG_SDERROR:.DB "SD error: ",0,0C:00007F 5344206572726F723A200000MSG_CARD:.DB "Card",0,0C:000085 436172640000MSG_READERROR:.DB "Read error",0,0C:000088 52656164206572726F720000MSG_FAT:.DB "FAT",0C:00008E 46415400MSG_FILE:.DB "File",0,0C:000090 46696C650000MSG_NOTFOUND:.DB " not found",0,0C:000093 206E6F7420666F756E640000MSG_EMPTY:.DB " empty",0,0C:000099 20656D7074790000MSG_TOOBIG:.DB " too big",0,0C:00009D 20746F6F206269670000MSG_F_ERASE:.DB "Erase...",0,0C:0000A2 45726173652E2E2E0000MSG_F_WRITE:.DB "Write...",0,0C:0000A7 57726974652E2E2E0000MSG_F_CHECK:.DB "Check...",0,0C:0000AC 436865636B2E2E2E0000MSG_F_COMPLETE:.DB "Successfully complete.",0,0C:0000B1 5375636365737366756C6C7920636F6D706C6574652E0000MSG_F_ERROR:.DB "ERROR!",0,0C:0000BD 4552524F52210000MSG_HALT:.DB "HALT!",0C:0000C1 48414C542100;CMD00: .DB $40,$00,$00,$00,$00,$95C:0000C4 400000000095CMD08: .DB $48,$00,$00,$01,$AA,$87C:0000C7 48000001AA87CMD16: .DB $50,$00,$00,$02,$00,$FFC:0000CA 5000000200FFCMD55: .DB $77,$00,$00,$00,$00,$FF ;app_cmdC:0000CD 7700000000FFCMD58: .DB $7A,$00,$00,$00,$00,$FF ;read_ocrC:0000D0 7A00000000FFCMD59: .DB $7B,$00,$00,$00,$00,$FF ;crc_on_offC:0000D3 7B00000000FFFILENAME:.DB "ZXEVO ROM",0C: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_STOPLDI 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,NULLC:0014d8 e310 LDI TEMP,48C:0014d9 9310 0070 STS TWBR,TEMP;reset RTC;write 0 to control/status register [0] on PCF8583C:0014db d027 RCALL TW_SEND_STARTC:0014dc 7108 ANDI DATA,TW_START|TW_REP_STARTC:0014dd f051 BREQ RTC_ERROR1C:0014de ea00 LDI DATA,RTC_ADDRESSC:0014df d02e RCALL TW_SEND_ADDRC:0014e0 3108 CPI DATA,TW_MT_SLA_ACKC:0014e1 f431 BRNE RTC_ERROR1C:0014e2 e000 LDI DATA,0C:0014e3 d02a RCALL TW_SEND_DATAC:0014e4 3208 CPI DATA,TW_MT_DATA_ACKC:0014e5 f411 BRNE RTC_ERROR1C:0014e6 e000 LDI DATA,0C:0014e7 d026 RCALL TW_SEND_DATARTC_ERROR1:C:0014e8 + TW_SEND_STOPC:0014e8 e914 LDI TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)C:0014e9 9310 0074 STS TWCR,TEMP;restore mode register from NVRAMC:0014eb d017 RCALL TW_SEND_STARTC:0014ec 7108 ANDI DATA,TW_START|TW_REP_STARTC:0014ed f081 BREQ RTC_ERROR2C:0014ee ea00 LDI DATA,RTC_ADDRESSC:0014ef d01e RCALL TW_SEND_ADDRC:0014f0 3108 CPI DATA,TW_MT_SLA_ACKC:0014f1 f461 BRNE RTC_ERROR2C:0014f2 ef0e LDI DATA,RTC_COMMON_MODE_REGC:0014f3 d01a RCALL TW_SEND_DATAC:0014f4 3208 CPI DATA,TW_MT_DATA_ACKC:0014f5 f441 BRNE RTC_ERROR2C:0014f6 d00c RCALL TW_SEND_STARTC:0014f7 3100 CPI DATA,TW_REP_STARTC:0014f8 ea01 LDI DATA,RTC_ADDRESS|$01C:0014f9 d014 RCALL TW_SEND_ADDRC:0014fa 3400 CPI DATA,TW_MR_SLA_ACKC:0014fb f411 BRNE RTC_ERROR2C:0014fc d01e RCALL TW_READ_DATAC:0014fd c001 RJMP RTC_OK2RTC_ERROR2:C:0014fe e000 LDI DATA,0RTC_OK2:C:0014ff + TW_SEND_STOPC:0014ff e914 LDI TEMP,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)C:001500 9310 0074 STS TWCR,TEMPC:001502 9508 RET;;--------------------------------------;out: DATA == i2c statusTW_SEND_START:;start transmitC:001503 ea04 LDI DATA,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)C:001504 9300 0074 STS TWCR,DATA;wait for flagTW_SS_WAIT:C:001506 9100 0074 LDS DATA,TWCRC:001508 ff07 SBRS DATA,TWINTC:001509 cffc RJMP TW_SS_WAIT;return statusC:00150a 9100 0071 LDS DATA,TWSRC:00150c 7f08 ANDI DATA,$F8C:00150d 9508 RET;;--------------------------------------;in: DATA == data/address;out: DATA == i2c statusTW_SEND_ADDR:TW_SEND_DATA:;set data/addressC:00150e 9300 0073 STS TWDR,DATA;enable transmitC:001510 e804 LDI DATA,(1<<TWINT)|(1<<TWEN)C:001511 9300 0074 STS TWCR,DATA;wait for end transmitTW_SD_WAIT:C:001513 9100 0074 LDS DATA,TWCRC:001515 ff07 SBRS DATA,TWINTC:001516 cffc RJMP TW_SD_WAIT;return statusC:001517 9100 0071 LDS DATA,TWSRC:001519 7f08 ANDI DATA,$F8C:00151a 9508 RET;;--------------------------------------;out: DATA == dataTW_READ_DATA:;enable transmitC:00151b e804 LDI DATA,(1<<TWINT)|(1<<TWEN)C:00151c 9300 0074 STS TWCR,DATA;wait for flag setTW_RD_WAIT:C:00151e 9100 0074 LDS DATA,TWCRC:001520 ff07 SBRS DATA,TWINTC:001521 cffc RJMP TW_RD_WAIT;get dataC:001522 9100 0073 LDS DATA,TWDR;NOT return status; LDS DATA,TWSR; ANDI DATA,$F8C:001524 9508 RET;;--------------------------------------;;;;--------------------------------------;C:001525 94f8 START: CLIC:001526 24ff CLR NULLC:001527 e011 LDI TEMP,$01C:001528 2ee1 MOV ONE,TEMPC:001529 ef1f LDI TEMP,$FFC:00152a 2ed1 MOV FF,TEMP;WatchDog OFFC:00152b e11f LDI TEMP,0B00011111C:00152c bd11 OUT WDTCR,TEMPC:00152d bcf1 OUT WDTCR,NULLC:00152e bef4 OUT MCUCSR,NULL;C:00152f ef1f LDI TEMP,LOW(RAMEND)C:001530 bf1d OUT SPL,TEMPC:001531 e110 LDI TEMP,HIGH(RAMEND)C:001532 bf1e OUT SPH,TEMP;C:001533 beeb OUT RAMPZ,ONE;C:001534 ef1f LDI TEMP, 0B11111111C:001535 + OUTPORT PORTG,TEMPC:001535 9310 0065 STS PORTG+$20*(PORTG<$40),TEMPC:001537 e010 LDI TEMP, 0B00000000C:001538 + OUTPORT DDRG,TEMPC:001538 9310 0064 STS DDRG+$20*(DDRG<$40),TEMPC:00153a e018 LDI TEMP, 0B00001000C:00153b + OUTPORT PORTF,TEMPC:00153b 9310 0062 STS PORTF+$20*(PORTF<$40),TEMPC:00153d + OUTPORT DDRF,TEMPC:00153d 9310 0061 STS DDRF+$20*(DDRF<$40),TEMPC:00153f ef13 LDI TEMP, 0B11110011C:001540 b913 OUT PORTE,TEMPC:001541 e010 LDI TEMP, 0B00000000C:001542 b912 OUT DDRE,TEMPC:001543 ef1f LDI TEMP, 0B11111111C:001544 bb12 OUT PORTD,TEMPC:001545 e010 LDI TEMP, 0B00000000C:001546 bb11 OUT DDRD,TEMPC:001547 ed1f LDI TEMP, 0B11011111C:001548 bb15 OUT PORTC,TEMPC:001549 e010 LDI TEMP, 0B00000000C:00154a bb14 OUT DDRC,TEMPC:00154b ef19 LDI TEMP, 0B11111001C:00154c bb18 OUT PORTB,TEMPC:00154d e817 LDI TEMP, 0B10000111C:00154e bb17 OUT DDRB,TEMPC:00154f ef1f LDI TEMP, 0B11111111C:001550 bb1b OUT PORTA,TEMPC:001551 e010 LDI TEMP, 0B00000000C:001552 bb1a OUT DDRA,TEMP;UART1 Set baud rateC:001553 + OUTPORT UBRR1H,NULLC:001553 92f0 0098 STS UBRR1H+$20*(UBRR1H<$40),NULLC:001555 e015 LDI TEMP,5 ;115200 baud @ 11059.2 kHz, Normal speedC:001556 + OUTPORT UBRR1L,TEMPC:001556 9310 0099 STS UBRR1L+$20*(UBRR1L<$40),TEMP;UART1 Normal SpeedC:001558 + OUTPORT UCSR1A,NULLC:001558 92f0 009b STS UCSR1A+$20*(UCSR1A<$40),NULL;UART1 data8bit, 2stopbitsC:00155a e01e LDI TEMP,(1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS)C:00155b + OUTPORT UCSR1C,TEMPC:00155b 9310 009d STS UCSR1C+$20*(UCSR1C<$40),TEMP;UART1 Разрешаем передачуC:00155d e018 LDI TEMP,(1<<TXEN)C:00155e + OUTPORT UCSR1B,TEMPC:00155e 9310 009a STS UCSR1B+$20*(UCSR1B<$40),TEMP;SPI initC:001560 e011 LDI TEMP,(1<<SPI2X)C:001561 b91e OUT SPSR,TEMPC: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 UP11C:001566 e005 LDI DATA,5C:001567 d631 RCALL DELAYC:001568 + LDIZ MSG_CFGFPGA*2C:001568 e8ec LDI ZL,LOW(MSG_CFGFPGA*2)C:001569 e0f0 LDI ZH,HIGH(MSG_CFGFPGA*2)C:00156a d5e3 RCALL UART_PRINTSTRZ;загрузка FPGAC:00156b + INPORT TEMP,DDRFC:00156b 9110 0061 LDS TEMP,DDRF+$20*(DDRF<$40)C:00156d 6011 SBR TEMP,(1<<nCONFIG)C:00156e + OUTPORT DDRF,TEMPC:00156e 9310 0061 STS DDRF+$20*(DDRF<$40),TEMPC:001570 e913 LDI TEMP,147 ;40 us @ 11.0592 MHzC:001571 951a LDFPGA1:DEC TEMP ;1C:001572 f7f1 BRNE LDFPGA1 ;2C:001573 + INPORT TEMP,DDRFC:001573 9110 0061 LDS TEMP,DDRF+$20*(DDRF<$40)C:001575 7f1e CBR TEMP,(1<<nCONFIG)C:001576 + OUTPORT DDRF,TEMPC:001576 9310 0061 STS DDRF+$20*(DDRF<$40),TEMPC:001578 9b01 LDFPGA2:SBIS PINF,nSTATUSC:001579 cffe RJMP LDFPGA2C:00157a + LDIZ PACKED_FPGA*2C:00157a ebe8 LDI ZL,LOW(PACKED_FPGA*2)C:00157b e0f1 LDI ZH,HIGH(PACKED_FPGA*2)C:00157c + LDIY BUFFERC:00157c e0c0 LDI YL,LOW(BUFFER)C:00157d e0d1 LDI YH,HIGH(BUFFER);(не трогаем стек! всё ОЗУ под буфер)C:00157e e810 LDI TEMP,$80C:00157f 9005 MS: LPM R0,Z+C:001580 9209 ST Y+,R0;-begin-PUT_BYTE_1---C:001581 b80f OUT SPDR,R0C:001582 9b77 PUTB1: SBIS SPSR,SPIFC:001583 cffe RJMP PUTB1;-end---PUT_BYTE_1---C:001584 50d1 SUBI YH,HIGH(BUFFER) ;C:001585 70df ANDI YH,DBMASK_HI ;Y warpC:001586 + ADDI YH,HIGH(BUFFER) ;C:001586 5fdf SUBI YH,(-HIGH(BUFFER)&$FF)C:001587 e052 M0: LDI R21,$02C:001588 ef4f LDI R20,$FFM1:C:001589 0f11 M1X: ADD TEMP,TEMPC:00158a f411 BRNE M2C:00158b 9115 LPM TEMP,Z+C:00158c 1f11 ROL TEMPC:00158d 1f44 M2: ROL R20C:00158e f7d0 BRCC M1XC:00158f 955a DEC R21C:001590 f449 BRNE X2C:001591 e002 LDI DATA,2C:001592 9545 ASR R20C:001593 f080 BRCS N1C:001594 9503 INC DATAC:001595 9543 INC R20C:001596 f051 BREQ N2C:001597 e053 LDI R21,$03C:001598 e34f LDI R20,$3FC:001599 cfef RJMP M1C:00159a 955a X2: DEC R21C:00159b f4b1 BRNE X3C:00159c 9546 LSR R20C:00159d f308 BRCS MSC:00159e 9553 INC R21C:00159f cfe9 RJMP M1C:0015a0 0f04 X6: ADD DATA,R20C:0015a1 e054 N2: LDI R21,$04C:0015a2 ef4f LDI R20,$FFC:0015a3 cfe5 RJMP M1C:0015a4 9543 N1: INC R20C:0015a5 f4d1 BRNE M4C:0015a6 9553 INC R21C:0015a7 9547 N5: ROR R20C:0015a8 f158 BRCS DEMLZENDC:0015a9 1f55 ROL R21C:0015aa 0f11 ADD TEMP,TEMPC:0015ab f411 BRNE N6C:0015ac 9115 LPM TEMP,Z+C:0015ad 1f11 ROL TEMPC:0015ae f7c0 N6: BRCC N5C:0015af 0f05 ADD DATA,R21C:0015b0 e056 LDI R21,6C:0015b1 cfd7 RJMP M1C:0015b2 955a X3: DEC R21C:0015b3 f411 BRNE X4C:0015b4 e001 LDI DATA,1C:0015b5 c00b RJMP M3C:0015b6 955a X4: DEC R21C:0015b7 f429 BRNE X5C:0015b8 9543 INC R20C:0015b9 f431 BRNE M4C:0015ba e055 LDI R21,$05C:0015bb e14f LDI R20,$1FC:0015bc cfcc RJMP M1C:0015bd 955a X5: DEC R21C:0015be f709 BRNE X6C:0015bf 2f54 MOV R21,R20C:0015c0 9145 M4: LPM R20,Z+C:0015c1 955a M3: DEC R21C:0015c2 2fa4 MOV XL,R20C:0015c3 2fb5 MOV XH,R21C:0015c4 0fac ADD XL,YLC:0015c5 1fbd ADC XH,YHLDIRLOOP:C:0015c6 50b1 SUBI XH,HIGH(BUFFER) ;C:0015c7 70bf ANDI XH,DBMASK_HI ;X warpC: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,R0C:0015cc 9b77 PUTB2: SBIS SPSR,SPIFC:0015cd cffe RJMP PUTB2;-end---PUT_BYTE_2---C:0015ce 50d1 SUBI YH,HIGH(BUFFER) ;C:0015cf 70df ANDI YH,DBMASK_HI ;Y warpC:0015d0 + ADDI YH,HIGH(BUFFER) ;C:0015d0 5fdf SUBI YH,(-HIGH(BUFFER)&$FF)C:0015d1 950a DEC DATAC:0015d2 f799 BRNE LDIRLOOPC:0015d3 cfb3 RJMP M0;теперь можно юзать стекDEMLZEND:C:0015d4 9b02 SBIS PINF,CONF_DONEC:0015d5 cffe RJMP DEMLZEND;SPI reinitC:0015d6 e510 LDI TEMP,(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)C:0015d7 b91d OUT SPCR,TEMPC:0015d8 9a16 SBI DDRE,6C:0015d9 + LED_OFFC:0015d9 9ac7 SBI PORTB,7C:0015da + LDIZ MSG_OK*2C: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_MODEC:0015de e41e LDI TEMP,SCR_MODEC:0015df d560 RCALL FPGA_REG; - - - - - - - - - - - - - - - - - - -C:0015e0 e0a0 LDI XL,0C:0015e1 e0b0 LDI XH,0C:0015e2 d571 RCALL SET_CURSORC:0015e3 + LDIZ MSG_TITLE*2C:0015e3 ebe4 LDI ZL,LOW(MSG_TITLE*2)C:0015e4 e0f0 LDI ZH,HIGH(MSG_TITLE*2)C:0015e5 d57a RCALL PRINTSTRZC:0015e6 + LDIZ LARGEBOOTSTART*2-4C:0015e6 efec LDI ZL,LOW(LARGEBOOTSTART*2-4)C:0015e7 edff LDI ZH,HIGH(LARGEBOOTSTART*2-4); OUT RAMPZ,ONEC:0015e8 91a7 ELPM XL,Z+C:0015e9 91b6 ELPM XH,ZC:0015ea 2f0a MOV DATA,XLC:0015eb 710f ANDI DATA,$1FC:0015ec f0d9 BREQ PRVERS9C:0015ed 2f1b MOV TEMP,XHC:0015ee 0faa LSL XLC:0015ef 1f11 ROL TEMPC:0015f0 0faa LSL XLC:0015f1 1f11 ROL TEMPC:0015f2 0faa LSL XLC:0015f3 1f11 ROL TEMPC:0015f4 701f ANDI TEMP,$0FC:0015f5 f091 BREQ PRVERS9C:0015f6 301d CPI TEMP,13C:0015f7 f480 BRCC PRVERS9C:0015f8 2f2b MOV COUNT,XHC:0015f9 9526 LSR COUNTC:0015fa 732f ANDI COUNT,$3FC:0015fb 3029 CPI COUNT,9C:0015fc f058 BRCS PRVERS9C:0015fd 930f PUSH DATAC:0015fe e208 LDI DATA,$28 ;"("C:0015ff d57b RCALL PUTCHARC:001600 2f02 MOV DATA,COUNTC:001601 d564 RCALL DECBYTEC:001602 2f01 MOV DATA,TEMPC:001603 d562 RCALL DECBYTEC:001604 910f POP DATAC:001605 d560 RCALL DECBYTEC:001606 e209 LDI DATA,$29 ;")"C:001607 d573 RCALL PUTCHARPRVERS9:; - - - - - - - - - - - - - - - - - - -;информация о Flash-ROM чипеC:001608 d543 RCALL UART_NEWLINEC:001609 e0a0 LDI XL,0C:00160a e0b2 LDI XH,2C:00160b d548 RCALL SET_CURSORC:00160c + LDIZ MSG_ID_FLASH*2C:00160c ecec LDI ZL,LOW(MSG_ID_FLASH*2)C:00160d e0f0 LDI ZH,HIGH(MSG_ID_FLASH*2)C:00160e d551 RCALL PRINTSTRZC:00160f d4b3 RCALL F_IDC:001610 2f0e MOV DATA,ZLC:001611 d560 RCALL HEXBYTEC:001612 e200 LDI DATA,$20C:001613 d567 RCALL PUTCHARC:001614 2f0f MOV DATA,ZHC:001615 d55c RCALL HEXBYTE; - - - - - - - - - - - - - - - - - - -C:001616 d535 RCALL UART_NEWLINEC:001617 e0a0 LDI XL,0C:001618 e0b3 LDI XH,3C:001619 d53a RCALL SET_CURSORC:00161a + LDIZ MSG_OPENFILE*2C: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_CS1C:00161e ef0f SER DATAC:00161f d520 RCALL FPGA_REGC:001620 e210 LDI TEMP,32C:001621 d2ad RCALL SD_RD_DUMMYC:001622 e517 LDI TEMP,SD_CS0C:001623 ef0f SER DATAC:001624 d51b RCALL FPGA_REGC:001625 ef8f SER R24C:001626 + SDINIT1:LDIZ CMD00*2C:001626 e8e8 LDI ZL,LOW(CMD00*2)C:001627 e0f1 LDI ZH,HIGH(CMD00*2)C:001628 d2ab RCALL SD_WR_PGM_6C:001629 958a DEC R24C:00162a f411 BRNE SDINIT2C:00162b e001 LDI DATA,1 ;нет SDC:00162c c44a RJMP SD_ERRORC:00162d 3001 SDINIT2:CPI DATA,$01C:00162e f7b9 BRNE SDINIT1C:00162f + LDIZ CMD08*2C:00162f e8ee LDI ZL,LOW(CMD08*2)C:001630 e0f1 LDI ZH,HIGH(CMD08*2)C:001631 d2a2 RCALL SD_WR_PGM_6C:001632 e080 LDI R24,$00C:001633 ff02 SBRS DATA,2C:001634 e480 LDI R24,$40C:001635 e014 LDI TEMP,4C:001636 d298 RCALL SD_RD_DUMMYC:001637 + SDINIT3:LDIZ CMD55*2C:001637 e9ea LDI ZL,LOW(CMD55*2)C:001638 e0f1 LDI ZH,HIGH(CMD55*2)C:001639 d29a RCALL SD_WR_PGM_6C:00163a e012 LDI TEMP,2C:00163b d293 RCALL SD_RD_DUMMYC:00163c e609 LDI DATA,ACMD_41C:00163d d290 RCALL SD_EXCHANGEC:00163e 2f08 MOV DATA,R24C:00163f d28e RCALL SD_EXCHANGEC:001640 + LDIZ CMD55*2+2C:001640 e9ec LDI ZL,LOW(CMD55*2+2)C:001641 e0f1 LDI ZH,HIGH(CMD55*2+2)C:001642 e014 LDI TEMP,4C:001643 d293 RCALL SD_WR_PGXC:001644 2300 TST DATAC:001645 f789 BRNE SDINIT3C:001646 + SDINIT4:LDIZ CMD59*2C:001646 eae6 LDI ZL,LOW(CMD59*2)C:001647 e0f1 LDI ZH,HIGH(CMD59*2)C:001648 d28b RCALL SD_WR_PGM_6C:001649 2300 TST DATAC:00164a f7d9 BRNE SDINIT4C:00164b + SDINIT5:LDIZ CMD16*2C:00164b e9e4 LDI ZL,LOW(CMD16*2)C:00164c e0f1 LDI ZH,HIGH(CMD16*2)C:00164d d286 RCALL SD_WR_PGM_6C:00164e 2300 TST DATAC:00164f f7d9 BRNE SDINIT5;; - - - - - - - - - - - - - - - - - - -;поиск FAT, инициализация переменныхC:001650 + WC_FAT: LDIX 0C:001650 e0a0 LDI XL,LOW(0)C:001651 e0b0 LDI XH,HIGH(0)C:001652 + LDIY 0C:001652 e0c0 LDI YL,LOW(0)C:001653 e0d0 LDI YH,HIGH(0)C:001654 d2c2 RCALL LOADLSTC:001655 + LDIZ BUF4FAT+$01BEC:001655 ebee LDI ZL,LOW(BUF4FAT+$01BE)C:001656 e0f4 LDI ZH,HIGH(BUF4FAT+$01BE)C:001657 8100 LD DATA,ZC:001658 2300 TST DATAC:001659 f4b9 BRNE RDFAT05C:00165a ece2 LDI ZL,$C2C:00165b 8100 LD DATA,ZC:00165c e010 LDI TEMP,0C:00165d 3001 CPI DATA,$01C:00165e f051 BREQ RDFAT06C:00165f e012 LDI TEMP,2C:001660 300b CPI DATA,$0BC:001661 f039 BREQ RDFAT06C:001662 300c CPI DATA,$0CC:001663 f029 BREQ RDFAT06C:001664 e011 LDI TEMP,1C:001665 3006 CPI DATA,$06C:001666 f011 BREQ RDFAT06C:001667 300e CPI DATA,$0EC:001668 f441 BRNE RDFAT05C:001669 9310 0500 RDFAT06:STS CAL_FAT,TEMPC:00166b ece6 LDI ZL,$C6C:00166c 91a1 LD XL,Z+C:00166d 91b1 LD XH,Z+C:00166e 91c1 LD YL,Z+C:00166f 81d0 LD YH,ZC:001670 c02f RJMP RDFAT00C:001671 + RDFAT05:LDIZ BUF4FATC:001671 e0e0 LDI ZL,LOW(BUF4FAT)C:001672 e0f3 LDI ZH,HIGH(BUF4FAT)C:001673 8535 LDD BITS,Z+$0DC:001674 e000 LDI DATA,0C:001675 e010 LDI TEMP,0C:001676 e028 LDI COUNT,8C:001677 9537 RDF051: ROR BITSC:001678 1d0f ADC DATA,NULLC:001679 952a DEC COUNTC:00167a f7e1 BRNE RDF051C:00167b 950a DEC DATAC:00167c f409 BRNE RDF052C:00167d 9513 INC TEMPC:00167e 8506 RDF052: LDD DATA,Z+$0EC:00167f 8407 LDD R0,Z+$0FC:001680 2900 OR DATA,R0C:001681 f009 BREQ RDF053C:001682 9513 INC TEMPC:001683 8903 RDF053: LDD DATA,Z+$13C:001684 8804 LDD R0,Z+$14C:001685 2900 OR DATA,R0C:001686 f409 BRNE RDF054C:001687 9513 INC TEMPC:001688 a100 RDF054: LDD DATA,Z+$20C:001689 a001 LDD R0,Z+$21C:00168a 2900 OR DATA,R0C:00168b a002 LDD R0,Z+$22C:00168c 2900 OR DATA,R0C:00168d a003 LDD R0,Z+$23C:00168e 2900 OR DATA,R0C:00168f f409 BRNE RDF055C:001690 9513 INC TEMPC:001691 8905 RDF055: LDD DATA,Z+$15C:001692 7f00 ANDI DATA,$F0C:001693 3f00 CPI DATA,$F0C:001694 f409 BRNE RDF056C:001695 9513 INC TEMPC:001696 3014 RDF056: CPI TEMP,4C:001697 f011 BREQ RDF057C:001698 e003 LDI DATA,3 ;не найдена FATC:001699 c3dd RJMP SD_ERRORC:00169a 92d0 0500 RDF057: STS CAL_FAT,FFC:00169c + LDIY 0C:00169c e0c0 LDI YL,LOW(0)C:00169d e0d0 LDI YH,HIGH(0)C:00169e + LDIX 0C:00169e e0a0 LDI XL,LOW(0)C:00169f e0b0 LDI XH,HIGH(0)C:0016a0 + RDFAT00:STSX STARTRZ+0C:0016a0 93a0 050d STS STARTRZ+0,XLC:0016a2 93b0 050e STS STARTRZ+0+1,XHC:0016a4 + STSY STARTRZ+2C:0016a4 93c0 050f STS STARTRZ+2,YLC:0016a6 93d0 0510 STS STARTRZ+2+1,YHC:0016a8 d26e RCALL LOADLSTC:0016a9 + LDIY 0C:0016a9 e0c0 LDI YL,LOW(0)C:0016aa e0d0 LDI YH,HIGH(0)C:0016ab 89a6 LDD XL,Z+22C:0016ac 89b7 LDD XH,Z+23 ;bpb_fatsz16C:0016ad 2f0b MOV DATA,XHC:0016ae 2b0a OR DATA,XLC:0016af f421 BRNE RDFAT01 ;если не fat12/16 (bpb_fatsz16=0)C:0016b0 a1a4 LDD XL,Z+36 ;то берем bpb_fatsz32 из смещения +36C:0016b1 a1b5 LDD XH,Z+37C:0016b2 a1c6 LDD YL,Z+38C:0016b3 a1d7 LDD YH,Z+39C:0016b4 + RDFAT01:STSX SEC_FAT+0C:0016b4 93a0 0507 STS SEC_FAT+0,XLC:0016b6 93b0 0508 STS SEC_FAT+0+1,XHC:0016b8 + STSY SEC_FAT+2 ;число секторов на fat-таблицуC:0016b8 93c0 0509 STS SEC_FAT+2,YLC:0016ba 93d0 050a STS SEC_FAT+2+1,YHC:0016bc + LDIY 0C:0016bc e0c0 LDI YL,LOW(0)C:0016bd e0d0 LDI YH,HIGH(0)C:0016be 89a3 LDD XL,Z+19C:0016bf 89b4 LDD XH,Z+20 ;bpb_totsec16C:0016c0 2f0b MOV DATA,XHC:0016c1 2b0a OR DATA,XLC:0016c2 f421 BRNE RDFAT02 ;если не fat12/16 (bpb_totsec16=0)C:0016c3 a1a0 LDD XL,Z+32 ;то берем из bpb_totsec32 смещения +32C:0016c4 a1b1 LDD XH,Z+33C:0016c5 a1c2 LDD YL,Z+34C:0016c6 a1d3 LDD YH,Z+35C:0016c7 + RDFAT02:STSX SEC_DSC+0C:0016c7 93a0 0515 STS SEC_DSC+0,XLC:0016c9 93b0 0516 STS SEC_DSC+0+1,XHC:0016cb + STSY SEC_DSC+2 ;к-во секторов на диске/разделеC:0016cb 93c0 0517 STS SEC_DSC+2,YLC:0016cd 93d0 0518 STS SEC_DSC+2+1,YH;вычисляем rootdirsectorsC:0016cf 89a1 LDD XL,Z+17C:0016d0 89b2 LDD XH,Z+18 ;bpb_rootentcntC:0016d1 + LDIY 0C:0016d1 e0c0 LDI YL,LOW(0)C:0016d2 e0d0 LDI YH,HIGH(0)C:0016d3 2f0b MOV DATA,XHC:0016d4 2b0a OR DATA,XLC:0016d5 f019 BREQ RDFAT03C:0016d6 e100 LDI DATA,$10C:0016d7 d315 RCALL BCDE_AC:0016d8 01ed MOVW YL,XL ;это реализована формула;rootdirsectors = ( (bpb_rootentcnt*32)+(bpb_bytspersec-1) )/bpb_bytspersec;в Y rootdirsectors;если fat32, то Y=0 всегдаC:0016d9 93df RDFAT03:PUSH YHC:0016da 93cf PUSH YLC:0016db 8900 LDD DATA,Z+16 ;bpb_numfatsC:0016dc 9300 0501 STS MANYFAT,DATAC:0016de + LDSX SEC_FAT+0C:0016de 91a0 0507 LDS XL,SEC_FAT+0C:0016e0 91b0 0508 LDS XH,SEC_FAT+0+1C:0016e2 + LDSY SEC_FAT+2C:0016e2 91c0 0509 LDS YL,SEC_FAT+2C:0016e4 91d0 050a LDS YH,SEC_FAT+2+1C:0016e6 950a DEC DATAC:0016e7 0faa RDF031: LSL XLC:0016e8 1fbb ROL XHC:0016e9 1fcc ROL YLC:0016ea 1fdd ROL YHC:0016eb 950a DEC DATAC:0016ec f7d1 BRNE RDF031C:0016ed 918f POP R24C:0016ee 919f POP R25;полный размер fat-области в секторахC:0016ef d316 RCALL HLDEPBC ;прибавили rootdirsectorsC:0016f0 8586 LDD R24,Z+14C:0016f1 8597 LDD R25,Z+15 ;bpb_rsvdseccntC:0016f2 9380 050b STS RSVDSEC+0,R24C:0016f4 9390 050c STS RSVDSEC+1,R25C:0016f6 d30f RCALL HLDEPBC ;прибавили bpb_resvdseccntC:0016f7 + STSX FRSTDAT+0C:0016f7 93a0 0511 STS FRSTDAT+0,XLC:0016f9 93b0 0512 STS FRSTDAT+0+1,XHC:0016fb + STSY FRSTDAT+2 ;положили номер первого сектора данныхC:0016fb 93c0 0513 STS FRSTDAT+2,YLC:0016fd 93d0 0514 STS FRSTDAT+2+1,YHC:0016ff + LDIZ SEC_DSCC:0016ff e1e5 LDI ZL,LOW(SEC_DSC)C:001700 e0f5 LDI ZH,HIGH(SEC_DSC)C:001701 d2ee RCALL BCDEHLM ;вычли из полного к-ва секторов разделаC:001702 + LDIZ BUF4FATC:001702 e0e0 LDI ZL,LOW(BUF4FAT)C:001703 e0f3 LDI ZH,HIGH(BUF4FAT)C:001704 8505 LDD DATA,Z+13C:001705 9300 0502 STS BYTSSEC,DATAC:001707 d2e5 RCALL BCDE_A ;разделили на к-во секторов в кластереC:001708 + STSX CLS_DSC+0C:001708 93a0 0519 STS CLS_DSC+0,XLC:00170a 93b0 051a STS CLS_DSC+0+1,XHC:00170c + STSY CLS_DSC+2 ;положили кол-во кластеров на разделеC:00170c 93c0 051b STS CLS_DSC+2,YLC:00170e 93d0 051c STS CLS_DSC+2+1,YHC:001710 9100 0500 LDS DATA,CAL_FATC:001712 3f0f CPI DATA,$FFC:001713 f519 BRNE RDFAT04C:001714 + LDSX CLS_DSC+0C:001714 91a0 0519 LDS XL,CLS_DSC+0C:001716 91b0 051a LDS XH,CLS_DSC+0+1C:001718 + LDSY CLS_DSC+2C:001718 91c0 051b LDS YL,CLS_DSC+2C:00171a 91d0 051c LDS YH,CLS_DSC+2+1C:00171c + PUSHYC:00171c 93cf PUSH YLC:00171d 93df PUSH YHC:00171e + PUSHXC:00171e 93af PUSH XLC:00171f 93bf PUSH XHC:001720 0faa LSL XLC:001721 1fbb ROL XHC:001722 1fcc ROL YLC:001723 1fdd ROL YHC:001724 d2e6 RCALL RASCHETC:001725 e001 LDI DATA,1C:001726 + POPXC:001726 91bf POP XHC:001727 91af POP XLC:001728 + POPYC:001728 91df POP YHC:001729 91cf POP YLC:00172a f061 BREQ RDFAT04C:00172b 0faa LSL XLC:00172c 1fbb ROL XHC:00172d 1fcc ROL YLC:00172e 1fdd ROL YHC:00172f 0faa LSL XLC:001730 1fbb ROL XHC:001731 1fcc ROL YLC:001732 1fdd ROL YHC:001733 d2d7 RCALL RASCHETC:001734 e002 LDI DATA,2C:001735 f009 BREQ RDFAT04C:001736 2700 CLR DATAC:001737 9300 0500 RDFAT04:STS CAL_FAT,DATA;для fat12/16 вычисляем адрес первого сектора директории;для fat32 берем по смещемию +44;на выходе YX == сектор rootdirC:001739 + LDIX 0C:001739 e0a0 LDI XL,LOW(0)C:00173a e0b0 LDI XH,HIGH(0)C:00173b + LDIY 0C:00173b e0c0 LDI YL,LOW(0)C:00173c e0d0 LDI YH,HIGH(0)C:00173d 2300 TST DATAC:00173e f031 BREQ FSRROO2C:00173f 950a DEC DATAC:001740 f021 BREQ FSRROO2C:001741 a5a4 LDD XL,Z+44C:001742 a5b5 LDD XH,Z+45C:001743 a5c6 LDD YL,Z+46C:001744 a5d7 LDD YH,Z+47C:001745 + FSRROO2:STSX ROOTCLS+0C:001745 93a0 0503 STS ROOTCLS+0,XLC:001747 93b0 0504 STS ROOTCLS+0+1,XHC:001749 + STSY ROOTCLS+2 ;сектор root директорииC:001749 93c0 0505 STS ROOTCLS+2,YLC:00174b 93d0 0506 STS ROOTCLS+2+1,YHC:00174d + STSX TEK_DIR+0C:00174d 93a0 0525 STS TEK_DIR+0,XLC:00174f 93b0 0526 STS TEK_DIR+0+1,XHC:001751 + STSY TEK_DIR+2C:001751 93c0 0527 STS TEK_DIR+2,YLC:001753 93d0 0528 STS TEK_DIR+2+1,YHC:001755 + FSRR121:PUSHXC:001755 93af PUSH XLC:001756 93bf PUSH XHC:001757 + PUSHYC:001757 93cf PUSH YLC:001758 93df PUSH YHC:001759 + LDSX RSVDSECC:001759 91a0 050b LDS XL,RSVDSECC:00175b 91b0 050c LDS XH,RSVDSEC+1C:00175d + LDIY 0C:00175d e0c0 LDI YL,LOW(0)C:00175e e0d0 LDI YH,HIGH(0)C:00175f + LDIZ STARTRZC:00175f e0ed LDI ZL,LOW(STARTRZ)C:001760 e0f5 LDI ZH,HIGH(STARTRZ)C:001761 d29b RCALL BCDEHLPC:001762 + STSX FATSTR0+0C:001762 93a0 051d STS FATSTR0+0,XLC:001764 93b0 051e STS FATSTR0+0+1,XHC:001766 + STSY FATSTR0+2C:001766 93c0 051f STS FATSTR0+2,YLC:001768 93d0 0520 STS FATSTR0+2+1,YHC:00176a + LDIZ SEC_FATC:00176a e0e7 LDI ZL,LOW(SEC_FAT)C:00176b e0f5 LDI ZH,HIGH(SEC_FAT)C:00176c d290 RCALL BCDEHLPC:00176d + STSX FATSTR1+0C:00176d 93a0 0521 STS FATSTR1+0,XLC:00176f 93b0 0522 STS FATSTR1+0+1,XHC:001771 + STSY FATSTR1+2C:001771 93c0 0523 STS FATSTR1+2,YLC:001773 93d0 0524 STS FATSTR1+2+1,YHC:001775 + POPYC:001775 91df POP YHC:001776 91cf POP YLC:001777 + POPXC:001777 91bf POP XHC:001778 91af POP XLC:001779 e011 LDI TEMP,1C:00177a 2e0a MOV R0,XLC:00177b 2a0b OR R0,XHC:00177c 2a0c OR R0,YLC:00177d 2a0d OR R0,YHC:00177e f039 BREQ LASTCLSC:00177f 931f NEXTCLS:PUSH TEMPC:001780 d1e4 RCALL RDFATZPC:001781 d1d1 RCALL LST_CLSC:001782 911f POP TEMPC:001783 f410 BRCC LASTCLSC:001784 9513 INC TEMPC:001785 cff9 RJMP NEXTCLSC:001786 9310 0529 LASTCLS:STS KCLSDIR,TEMPC:001788 + LDIY 0C: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 FNDMP32C: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 ZLC:00179f 01df MOVW XL,ZLC:0017a0 + LDIZ FILENAME*2C: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 DATAC:0017a4 f041 BREQ NASHELC:0017a5 911d LD TEMP,X+C:0017a6 1701 CP DATA,TEMPC:0017a7 f3d1 BREQ DALSHE;не совпалоC:0017a8 2ffb MOV ZH,XHC:0017a9 91ef POP ZLC:0017aa cfe3 RJMP FNDMP31;нет такого файлаFNDMP37:C:0017ab e004 LDI DATA,4 ;нет файлаC:0017ac c2ca RJMP SD_ERROR;найден описательC:0017ad 2ffb NASHEL: MOV ZH,XHC:0017ae 91ef POP ZL;; - - - - - - - - - - - - - - - - - - -;инициализация переменных;для последующего чтения файла;Z указывает на описатель файлаC:0017af 8da2 LDD XL,Z+$1AC:0017b0 8db3 LDD XH,Z+$1BC:0017b1 89c4 LDD YL,Z+$14C:0017b2 89d5 LDD YH,Z+$15 ;считали номер первого кластера файлаC:0017b3 + STSX TFILCLS+0C:0017b3 93a0 052b STS TFILCLS+0,XLC:0017b5 93b0 052c STS TFILCLS+0+1,XHC:0017b7 + STSY TFILCLS+2C:0017b7 93c0 052d STS TFILCLS+2,YLC:0017b9 93d0 052e STS TFILCLS+2+1,YHC:0017bb + STSX ZTFILCLS+0C:0017bb 93a0 0534 STS ZTFILCLS+0,XLC:0017bd 93b0 0535 STS ZTFILCLS+0+1,XHC:0017bf + STSY ZTFILCLS+2C:0017bf 93c0 0536 STS ZTFILCLS+2,YLC:0017c1 93d0 0537 STS ZTFILCLS+2+1,YHC:0017c3 8da4 LDD XL,Z+$1CC:0017c4 8db5 LDD XH,Z+$1DC:0017c5 8dc6 LDD YL,Z+$1EC:0017c6 8dd7 LDD YH,Z+$1F ;считали длину файлаC:0017c7 2f0a MOV DATA,XLC:0017c8 2b0b OR DATA,XHC:0017c9 2b0c OR DATA,YLC:0017ca 2b0d OR DATA,YHC:0017cb f411 BRNE F01C:0017cc e005 LDI DATA,5 ;пустой файлC:0017cd c2a9 RJMP SD_ERRORF01:C:0017ce e008 LDI DATA,$08C:0017cf 15ae CP XL,ONEC:0017d0 05bf CPC XH,NULLC:0017d1 07c0 CPC YL,DATAC:0017d2 05df CPC YH,NULLC:0017d3 f010 BRCS F02C:0017d4 e005 LDI DATA,5 ;большой файлC:0017d5 c2a1 RJMP SD_ERRORF02:C:0017d6 ef8f LDI R24,LOW(511)C:0017d7 e091 LDI R25,HIGH(511)C:0017d8 d22d RCALL HLDEPBCC:0017d9 d20a RCALL BCDE200 ;получили кол-во секторовC:0017da 9711 SBIW XL,1C:0017db 09cf SBC YL,NULLC:0017dc 09df SBC YH,NULLC:0017dd 9100 0502 LDS DATA,BYTSSECC:0017df 950a DEC DATAC:0017e0 230a AND DATA,XLC:0017e1 9503 INC DATAC:0017e2 9300 052f STS MPHWOST,DATA ;кол-во секторов в последнем кластереC:0017e4 9300 0538 STS ZMPHWOST,DATAC:0017e6 9100 0502 LDS DATA,BYTSSECC:0017e8 d204 RCALL BCDE_AC:0017e9 + STSX KOL_CLS+0C:0017e9 93a0 0530 STS KOL_CLS+0,XLC:0017eb 93b0 0531 STS KOL_CLS+0+1,XHC:0017ed + STSY KOL_CLS+2C:0017ed 93c0 0532 STS KOL_CLS+2,YLC:0017ef 93d0 0533 STS KOL_CLS+2+1,YHC:0017f1 + STSX ZKOL_CLS+0C:0017f1 93a0 0539 STS ZKOL_CLS+0,XLC:0017f3 93b0 053a STS ZKOL_CLS+0+1,XHC:0017f5 + STSY ZKOL_CLS+2C:0017f5 93c0 053b STS ZKOL_CLS+2,YLC:0017f7 93d0 053c STS ZKOL_CLS+2+1,YHC:0017f9 92f0 052a STS NUMSECK,NULL; - - - - - - - - - - - - - - - - - - -;всё нормально, начинаем;стираниеC:0017fb d350 RCALL UART_NEWLINEC:0017fc e0a0 LDI XL,0C:0017fd e0b4 LDI XH,4C:0017fe d355 RCALL SET_CURSORC:0017ff + LDIZ MSG_F_ERASE*2C:0017ff e4e4 LDI ZL,LOW(MSG_F_ERASE*2)C:001800 e0f1 LDI ZH,HIGH(MSG_F_ERASE*2)C:001801 d35e RCALL PRINTSTRZC:001802 d2ef RCALL F_ERASE;записьC:001803 d348 RCALL UART_NEWLINEC:001804 e0a0 LDI XL,0C:001805 e0b5 LDI XH,5C:001806 d34d RCALL SET_CURSORC:001807 + LDIZ MSG_F_WRITE*2C:001807 e4ee LDI ZL,LOW(MSG_F_WRITE*2)C:001808 e0f1 LDI ZH,HIGH(MSG_F_WRITE*2)C:001809 d356 RCALL PRINTSTRZC:00180a e0a0 LDI XL,0C:00180b e1b0 LDI XH,16C:00180c d347 RCALL SET_CURSORC:00180d e001 LDI DATA,$01 ;"░"C:00180e e414 LDI TEMP,SCR_CHARC:00180f d330 RCALL FPGA_REGC:001810 ef1f LDI TEMP,$FFC:001811 + FCHXY1: SPICS_CLRC:001811 98c0 CBI PORTB,0C:001812 + SPICS_SETC:001812 9ac0 SBI PORTB,0C:001813 951a DEC TEMPC:001814 f7e1 BRNE FCHXY1C:001815 e0a0 LDI XL,0C:001816 e1b0 LDI XH,16C:001817 d33c RCALL SET_CURSORC:001818 92f0 053f STS F_ADDR0,NULLC:00181a 92f0 0540 STS F_ADDR1,NULLC:00181c 92f0 0541 STS F_ADDR2,NULLC:00181e d1f6 F13: RCALL NEXTSECC:00181f 9300 053e STS LASTSECFLAG,DATAC:001821 + LDIZ BUFFERC:001821 e0e0 LDI ZL,LOW(BUFFER)C:001822 e0f1 LDI ZH,HIGH(BUFFER)C:001823 91a0 053f LDS XL,F_ADDR0C:001825 91b0 0540 LDS XH,F_ADDR1C:001827 91c0 0541 LDS YL,F_ADDR2C:001829 d2a8 F11: RCALL F_WRITEC:00182a 9611 ADIW XL,1C:00182b 1dcf ADC YL,NULLC:00182c 9631 ADIW ZL,1C:00182d 30f3 CPI ZH,HIGH(BUFFER+512)C:00182e f7d1 BRNE F11C:00182f + LED_OFFC:00182f 9ac7 SBI PORTB,7C:001830 fdb1 SBRC XH,1C:001831 + LED_ON ;мигать при программированииC:001831 98c7 CBI PORTB,7C:001832 93a0 053f STS F_ADDR0,XLC:001834 93b0 0540 STS F_ADDR1,XHC:001836 93c0 0541 STS F_ADDR2,YLC:001838 30a0 CPI XL,$00C:001839 f431 BRNE F12C:00183a 2f0b MOV DATA,XHC:00183b 7007 ANDI DATA,$07C:00183c f419 BRNE F12C:00183d e002 LDI DATA,$02 ;"▒"C:00183e e414 LDI TEMP,SCR_CHARC:00183f d300 RCALL FPGA_REGF12:C:001840 9100 053e LDS DATA,LASTSECFLAGC:001842 2300 TST DATAC:001843 f6d1 BRNE F13;проверкаC:001844 d2bb RCALL F_RSTC:001845 ef14 LDI TEMP,FLASH_CTRLC:001846 e003 LDI DATA,0B00000011C:001847 d2f8 RCALL FPGA_REGC:001848 d303 RCALL UART_NEWLINEC:001849 e0a0 LDI XL,0C:00184a e0b6 LDI XH,6C:00184b d308 RCALL SET_CURSORC:00184c + LDIZ MSG_F_CHECK*2C:00184c e5e8 LDI ZL,LOW(MSG_F_CHECK*2)C:00184d e0f1 LDI ZH,HIGH(MSG_F_CHECK*2)C:00184e d311 RCALL PRINTSTRZC:00184f e0a0 LDI XL,0C:001850 e1b0 LDI XH,16C:001851 d302 RCALL SET_CURSORC:001852 + LDSX ZTFILCLS+0C:001852 91a0 0534 LDS XL,ZTFILCLS+0C:001854 91b0 0535 LDS XH,ZTFILCLS+0+1C:001856 + LDSY ZTFILCLS+2C:001856 91c0 0536 LDS YL,ZTFILCLS+2C:001858 91d0 0537 LDS YH,ZTFILCLS+2+1C:00185a + STSX TFILCLS+0C:00185a 93a0 052b STS TFILCLS+0,XLC:00185c 93b0 052c STS TFILCLS+0+1,XHC:00185e + STSY TFILCLS+2C:00185e 93c0 052d STS TFILCLS+2,YLC:001860 93d0 052e STS TFILCLS+2+1,YHC:001862 9100 0538 LDS DATA,ZMPHWOSTC:001864 9300 052f STS MPHWOST,DATAC:001866 + LDSX ZKOL_CLS+0C:001866 91a0 0539 LDS XL,ZKOL_CLS+0C:001868 91b0 053a LDS XH,ZKOL_CLS+0+1C:00186a + LDSY ZKOL_CLS+2C:00186a 91c0 053b LDS YL,ZKOL_CLS+2C:00186c 91d0 053c LDS YH,ZKOL_CLS+2+1C:00186e + STSX KOL_CLS+0C:00186e 93a0 0530 STS KOL_CLS+0,XLC:001870 93b0 0531 STS KOL_CLS+0+1,XHC:001872 + STSY KOL_CLS+2C:001872 93c0 0532 STS KOL_CLS+2,YLC:001874 93d0 0533 STS KOL_CLS+2+1,YHC:001876 92f0 052a STS NUMSECK,NULLC:001878 92f0 0542 STS ERRFLG1,NULLC:00187a 92f0 0543 STS ERRFLG2,NULL;C:00187c 92f0 053f STS F_ADDR0,NULLC:00187e 92f0 0540 STS F_ADDR1,NULLC:001880 92f0 0541 STS F_ADDR2,NULLC:001882 d192 F25: RCALL NEXTSECC:001883 9300 053e STS LASTSECFLAG,DATAC:001885 + LDIZ BUFFERC:001885 e0e0 LDI ZL,LOW(BUFFER)C:001886 e0f1 LDI ZH,HIGH(BUFFER)C:001887 91a0 053f LDS XL,F_ADDR0C:001889 91b0 0540 LDS XH,F_ADDR1C:00188b 91c0 0541 LDS YL,F_ADDR2C:00188d d2a6 F21: RCALL F_INC:00188e 9111 LD TEMP,Z+C:00188f 1701 CP DATA,TEMPC:001890 f011 BREQ F26C:001891 92e0 0542 STS ERRFLG1,ONEC:001893 9611 F26: ADIW XL,1C:001894 1dcf ADC YL,NULLC:001895 30f3 CPI ZH,HIGH(BUFFER+512)C:001896 f7b1 BRNE F21C:001897 + LED_OFFC:001897 9ac7 SBI PORTB,7C:001898 fdb3 SBRC XH,3C:001899 + LED_ON ;мигать при проверкеC:001899 98c7 CBI PORTB,7C:00189a 93a0 053f STS F_ADDR0,XLC:00189c 93b0 0540 STS F_ADDR1,XHC:00189e 93c0 0541 STS F_ADDR2,YLC:0018a0 30a0 CPI XL,$00C:0018a1 f481 BRNE F22C:0018a2 2f0b MOV DATA,XHC:0018a3 7007 ANDI DATA,$07C:0018a4 f469 BRNE F22C:0018a5 9110 0542 LDS TEMP,ERRFLG1C:0018a7 2311 TST TEMPC:0018a8 f031 BREQ F23C:0018a9 92e0 0543 STS ERRFLG2,ONEC:0018ab 92f0 0542 STS ERRFLG1,NULLC:0018ad e508 LDI DATA,$58 ;"X"C:0018ae c001 RJMP F24C:0018af e003 F23: LDI DATA,$03 ;"█"C:0018b0 e414 F24: LDI TEMP,SCR_CHARC:0018b1 d28e RCALL FPGA_REGF22:C:0018b2 9100 053e LDS DATA,LASTSECFLAGC:0018b4 2300 TST DATAC:0018b5 f661 BRNE F25;стопC:0018b6 + LED_OFFC:0018b6 9ac7 SBI PORTB,7C:0018b7 d294 RCALL UART_NEWLINEC:0018b8 e0a0 LDI XL,0C:0018b9 e0b7 LDI XH,7C:0018ba d299 RCALL SET_CURSORC:0018bb + LDIZ MSG_F_ERROR*2C: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,ERRFLG2C:0018bf 2311 TST TEMPC:0018c0 f411 BRNE F91C:0018c1 + LDIZ MSG_F_COMPLETE*2C:0018c1 e6e2 LDI ZL,LOW(MSG_F_COMPLETE*2)C:0018c2 e0f1 LDI ZH,HIGH(MSG_F_COMPLETE*2)C:0018c3 d29c F91: RCALL PRINTSTRZC:0018c4 d287 RCALL UART_NEWLINEC:0018c5 e0a0 LDI XL,0C:0018c6 e0b9 LDI XH,9C:0018c7 d28c RCALL SET_CURSORC:0018c8 + LDIZ MSG_HALT*2C:0018c8 e8e2 LDI ZL,LOW(MSG_HALT*2)C:0018c9 e0f1 LDI ZH,HIGH(MSG_HALT*2)C:0018ca d295 RCALL PRINTSTRZC:0018cb 9816 CBI DDRE,6C:0018cc cfff STOP1: RJMP STOP1;;--------------------------------------;out: DATASD_RECEIVE:C:0018cd ef0f SER DATA; - - - - - - - - - - - - - - - - - - -;in: DATA;out: DATASD_EXCHANGE:C:0018ce c276 RJMP FPGA_SAME_REG;;--------------------------------------;in; TEMP - nSD_RD_DUMMY:C:0018cf ef0f SER DATAC:0018d0 dffd RCALL SD_EXCHANGEC:0018d1 951a DEC TEMPC:0018d2 f7e1 BRNE SD_RD_DUMMYC:0018d3 9508 RET;;--------------------------------------;in: ZSD_WR_PGM_6:C:0018d4 e012 LDI TEMP,2C:0018d5 dff9 RCALL SD_RD_DUMMYC:0018d6 e016 LDI TEMP,6SD_WR_PGX:C:0018d7 9105 SDWRP61:LPM DATA,Z+C:0018d8 dff5 RCALL SD_EXCHANGEC:0018d9 951a DEC TEMPC:0018da f7e1 BRNE SDWRP61; - - - - - - - - - - - - - - - - - - -;out: DATASD_WAIT_NOTFF:C:0018db e210 LDI TEMP,32C:0018dc ef0f SDWNFF2:SER DATAC:0018dd dff0 RCALL SD_EXCHANGEC:0018de 3f0f CPI DATA,$FFC:0018df f411 BRNE SDWNFF1C:0018e0 951a DEC TEMPC:0018e1 f7d1 BRNE SDWNFF2C:0018e2 9508 SDWNFF1:RET;;--------------------------------------;in: Z - куда; Y,X - №сектораSD_READ_SECTOR:C:0018e3 + PUSHZC:0018e3 93ef PUSH ZLC:0018e4 93ff PUSH ZHC:0018e5 + LDIZ CMD58*2C:0018e5 eae0 LDI ZL,LOW(CMD58*2)C:0018e6 e0f1 LDI ZH,HIGH(CMD58*2)C:0018e7 dfec RCALL SD_WR_PGM_6C:0018e8 dfe4 RCALL SD_RECEIVEC:0018e9 fd06 SBRC DATA,6C:0018ea c007 RJMP SDRDSE1C:0018eb 0faa LSL XLC:0018ec 1fbb ROL XHC:0018ed 1fcc ROL YLC:0018ee 2fdc MOV YH,YLC:0018ef 2fcb MOV YL,XHC:0018f0 2fba MOV XH,XLC:0018f1 27aa CLR XLSDRDSE1:C:0018f2 e015 LDI TEMP,3+2C:0018f3 dfdb RCALL SD_RD_DUMMYC:0018f4 e501 LDI DATA,CMD_17C:0018f5 dfd8 RCALL SD_EXCHANGEC:0018f6 2f0d MOV DATA,YHC:0018f7 dfd6 RCALL SD_EXCHANGEC:0018f8 2f0c MOV DATA,YLC:0018f9 dfd4 RCALL SD_EXCHANGEC:0018fa 2f0b MOV DATA,XHC:0018fb dfd2 RCALL SD_EXCHANGEC:0018fc 2f0a MOV DATA,XLC:0018fd dfd0 RCALL SD_EXCHANGEC:0018fe ef0f SER DATAC:0018ff dfce RCALL SD_EXCHANGEC:001900 ef8f SER R24C:001901 dfd9 SDRDSE2:RCALL SD_WAIT_NOTFFC:001902 958a DEC R24C:001903 f069 BREQ SDRDSE8C:001904 3f0e CPI DATA,$FEC:001905 f7d9 BRNE SDRDSE2C:001906 + POPZC:001906 91ff POP ZHC:001907 91ef POP ZLC:001908 e080 LDI R24,$00C:001909 e092 LDI R25,$02C:00190a dfc2 SDRDSE3:RCALL SD_RECEIVEC:00190b 9301 ST Z+,DATAC:00190c 9701 SBIW R24,1C:00190d f7e1 BRNE SDRDSE3C:00190e e012 LDI TEMP,2C:00190f dfbf RCALL SD_RD_DUMMY;SDRDSE4:RCALL SD_WAIT_NOTFF; CPI DATA,$FF; BRNE SDRDSE4C:001910 9508 RETSDRDSE8:C:001911 e002 LDI DATA,2 ;ошибка при чтении сектораC:001912 c164 RJMP SD_ERROR;;--------------------------------------;чтение сектора данныхLOAD_DATA:C:001913 + LDIZ BUFFERC: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 BUF4FATC:001917 e0e0 LDI ZL,LOW(BUF4FAT)C:001918 e0f3 LDI ZH,HIGH(BUF4FAT)C:001919 dfc9 RCALL SD_READ_SECTOR ;читать один секторC:00191a + LDIZ BUF4FATC:00191a e0e0 LDI ZL,LOW(BUF4FAT)C:00191b e0f3 LDI ZH,HIGH(BUF4FAT)C:00191c 9508 RET;;--------------------------------------;чтение сектора dir по номеру описателя (Y);на выходе: DATA=#ff (sreg.Z=0) выход за пределы dirC:00191d + RDDIRSC:PUSHYC:00191d 93cf PUSH YLC:00191e 93df PUSH YHC:00191f 01de MOVW XL,YLC:001920 + LDIY 0C:001920 e0c0 LDI YL,LOW(0)C:001921 e0d0 LDI YH,HIGH(0)C:001922 e100 LDI DATA,$10C:001923 d0c9 RCALL BCDE_AC:001924 93af PUSH XLC:001925 9100 0502 LDS DATA,BYTSSECC:001927 930f PUSH DATAC:001928 d0c4 RCALL BCDE_AC:001929 9100 0529 LDS DATA,KCLSDIRC:00192b 950a DEC DATAC:00192c 170a CP DATA,XLC:00192d f438 BRCC RDDIRS3C:00192e 91cf POP YLC:00192f 91cf POP YLC:001930 + POPYC:001930 91df POP YHC:001931 91cf POP YLC:001932 ef0f SER DATAC:001933 2300 TST DATAC:001934 9508 RETC:001935 + RDDIRS3:LDSY TEK_DIR+2C:001935 91c0 0527 LDS YL,TEK_DIR+2C:001937 91d0 0528 LDS YH,TEK_DIR+2+1C:001939 2f0a MOV DATA,XLC:00193a 2300 TST DATAC:00193b + LDSX TEK_DIR+0C:00193b 91a0 0525 LDS XL,TEK_DIR+0C:00193d 91b0 0526 LDS XH,TEK_DIR+0+1C:00193f f029 BREQ RDDIRS1C:001940 930f RDDIRS2:PUSH DATAC:001941 d023 RCALL RDFATZPC:001942 910f POP DATAC:001943 950a DEC DATAC:001944 f7d9 BRNE RDDIRS2C:001945 d07c RDDIRS1:RCALL REALSECC:001946 900f POP R0C:001947 940a DEC R0C:001948 910f POP DATAC:001949 2100 AND DATA,R0C:00194a 0fa0 ADD XL,DATAC:00194b 1dbf ADC XH,NULLC:00194c 1dcf ADC YL,NULLC:00194d 1ddf ADC YH,NULLC:00194e dfc8 RCALL LOADLSTC:00194f + POPYC:00194f 91df POP YHC:001950 91cf POP YLC:001951 2700 CLR DATAC:001952 9508 RET;;--------------------------------------;out: sreg.C == CLR - EOCmark;(chng: TEMP)C:001953 e01f LST_CLS:LDI TEMP,$0FC:001954 9100 0500 LDS DATA,CAL_FATC:001956 2300 TST DATAC:001957 f419 BRNE LST_CL1C:001958 3fa7 CPI XL,$F7C:001959 07b1 CPC XH,TEMPC:00195a 9508 RETC:00195b 950a LST_CL1:DEC DATAC:00195c f419 BRNE LST_CL2C:00195d 3fa7 CPI XL,$F7C:00195e 05bd CPC XH,FFC:00195f 9508 RETC:001960 3fa7 LST_CL2:CPI XL,$F7C:001961 05bd CPC XH,FFC:001962 05cd CPC YL,FFC:001963 07d1 CPC YH,TEMPC:001964 9508 RET;;--------------------------------------;C:001965 9100 0500 RDFATZP:LDS DATA,CAL_FATC:001967 2300 TST DATAC:001968 f131 BREQ RDFATS0 ;FAT12C:001969 950a DEC DATAC:00196a f071 BREQ RDFATS1 ;FAT16;FAT32C:00196b 0faa LSL XLC:00196c 1fbb ROL XHC:00196d 1fcc ROL YLC:00196e 1fdd ROL YHC:00196f 2f0a MOV DATA,XLC:001970 2fab MOV XL,XHC:001971 2fbc MOV XH,YLC:001972 2fcd MOV YL,YHC:001973 27dd CLR YHC:001974 d009 RCALL RDFATS2C:001975 9631 ADIW ZL,1C:001976 91c1 LD YL,Z+C:001977 81d0 LD YH,ZC:001978 9508 RET;FAT16C:001979 + RDFATS1:LDIY 0C:001979 e0c0 LDI YL,LOW(0)C:00197a e0d0 LDI YH,HIGH(0)C:00197b 2f0a MOV DATA,XLC:00197c 2fab MOV XL,XHC:00197d 27bb CLR XHC:00197e 930f RDFATS2:PUSH DATAC:00197f + PUSHYC:00197f 93cf PUSH YLC:001980 93df PUSH YHC:001981 + LDIZ FATSTR0C:001981 e1ed LDI ZL,LOW(FATSTR0)C:001982 e0f5 LDI ZH,HIGH(FATSTR0)C:001983 d079 RCALL BCDEHLPC:001984 df92 RCALL LOADLSTC:001985 + POPYC:001985 91df POP YHC:001986 91cf POP YLC:001987 910f POP DATAC:001988 0fe0 ADD ZL,DATAC:001989 1dff ADC ZH,NULLC:00198a 0fe0 ADD ZL,DATAC:00198b 1dff ADC ZH,NULLC:00198c 91a1 LD XL,Z+C:00198d 81b0 LD XH,ZC:00198e 9508 RET;FAT12C:00198f 01fd RDFATS0:MOVW ZL,XLC:001990 0fee LSL ZLC:001991 1fff ROL ZHC:001992 0fea ADD ZL,XLC:001993 1ffb ADC ZH,XHC:001994 95f6 LSR ZHC:001995 95e7 ROR ZLC:001996 2f0a MOV DATA,XLC:001997 2faf MOV XL,ZHC:001998 27bb CLR XHC:001999 27cc CLR YLC:00199a 27dd CLR YHC:00199b 95a6 LSR XLC:00199c 930f PUSH DATAC:00199d + PUSHZC:00199d 93ef PUSH ZLC:00199e 93ff PUSH ZHC:00199f + LDIZ FATSTR0C:00199f e1ed LDI ZL,LOW(FATSTR0)C:0019a0 e0f5 LDI ZH,HIGH(FATSTR0)C:0019a1 d05b RCALL BCDEHLPC:0019a2 df74 RCALL LOADLSTC:0019a3 + POPYC:0019a3 91df POP YHC:0019a4 91cf POP YLC:0019a5 70d1 ANDI YH,$01C:0019a6 0fec ADD ZL,YLC:0019a7 1ffd ADC ZH,YHC:0019a8 91c1 LD YL,Z+C:0019a9 30f5 CPI ZH,HIGH(BUF4FAT+512)C:0019aa f431 BRNE RDFATS4C:0019ab 93cf PUSH YLC:0019ac + LDIY 0C:0019ac e0c0 LDI YL,LOW(0)C:0019ad e0d0 LDI YH,HIGH(0)C:0019ae 9611 ADIW XL,1C:0019af df67 RCALL LOADLSTC:0019b0 91cf POP YLC:0019b1 910f RDFATS4:POP DATAC:0019b2 81b0 LD XH,ZC:0019b3 2fac MOV XL,YLC:0019b4 + LDIY 0C:0019b4 e0c0 LDI YL,LOW(0)C:0019b5 e0d0 LDI YH,HIGH(0)C:0019b6 9506 LSR DATAC:0019b7 f440 BRCC RDFATS3C:0019b8 95b6 LSR XHC:0019b9 95a7 ROR XLC:0019ba 95b6 LSR XHC:0019bb 95a7 ROR XLC:0019bc 95b6 LSR XHC:0019bd 95a7 ROR XLC:0019be 95b6 LSR XHC:0019bf 95a7 ROR XLC:0019c0 70bf RDFATS3:ANDI XH,$0FC:0019c1 9508 RET;;--------------------------------------;вычисление реального сектора;на входе YX==номер FAT;на выходе YX==адрес сектораC:0019c2 2f0d REALSEC:MOV DATA,YHC:0019c3 2b0c OR DATA,YLC:0019c4 2b0b OR DATA,XHC:0019c5 2b0a OR DATA,XLC:0019c6 f459 BRNE REALSE1C:0019c7 + LDIZ FATSTR1C:0019c7 e2e1 LDI ZL,LOW(FATSTR1)C:0019c8 e0f5 LDI ZH,HIGH(FATSTR1)C:0019c9 + LDSX SEC_FAT+0C:0019c9 91a0 0507 LDS XL,SEC_FAT+0C:0019cb 91b0 0508 LDS XH,SEC_FAT+0+1C:0019cd + LDSY SEC_FAT+2C:0019cd 91c0 0509 LDS YL,SEC_FAT+2C:0019cf 91d0 050a LDS YH,SEC_FAT+2+1C:0019d1 c02b RJMP BCDEHLPC:0019d2 9712 REALSE1:SBIW XL,2 ;номер кластера-2C:0019d3 09cf SBC YL,NULLC:0019d4 09df SBC YH,NULLC:0019d5 9100 0502 LDS DATA,BYTSSECC:0019d7 c004 RJMP REALSE2C:0019d8 0faa REALSE3:LSL XLC:0019d9 1fbb ROL XHC:0019da 1fcc ROL YLC:0019db 1fdd ROL YHC:0019dc 9506 REALSE2:LSR DATAC:0019dd f7d0 BRCC REALSE3;умножили на размер кластераC:0019de + LDIZ STARTRZC:0019de e0ed LDI ZL,LOW(STARTRZ)C:0019df e0f5 LDI ZH,HIGH(STARTRZ)C:0019e0 d01c RCALL BCDEHLP ;прибавили смещение от начала дискаC:0019e1 + LDIZ FRSTDATC: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,XHC:0019e5 2fbc MOV XH,YLC:0019e6 2fcd MOV YL,YHC:0019e7 e0d0 LDI YH,0C:0019e8 e001 LDI DATA,1; - - - - - - - - - - - - - - - - - - -;YXDATA>>до"переноса";если в DATA вкл.только один бит, то получается;YX=YX/DATAC:0019e9 95d6 BCDE_A1:LSR YHC:0019ea 95c7 ROR YLC:0019eb 95b7 ROR XHC:0019ec 95a7 ROR XLC:0019ed 9507 BCDE_A: ROR DATAC:0019ee f7d0 BRCC BCDE_A1C:0019ef 9508 RET;;--------------------------------------;YX=[Z]-YXC:0019f0 9101 BCDEHLM:LD DATA,Z+C:0019f1 1b0a SUB DATA,XLC:0019f2 2fa0 MOV XL,DATAC:0019f3 9101 LD DATA,Z+C:0019f4 0b0b SBC DATA,XHC:0019f5 2fb0 MOV XH,DATAC:0019f6 9101 LD DATA,Z+C:0019f7 0b0c SBC DATA,YLC:0019f8 2fc0 MOV YL,DATAC:0019f9 8100 LD DATA,ZC:0019fa 0b0d SBC DATA,YHC:0019fb 2fd0 MOV YH,DATAC:0019fc 9508 RET;;--------------------------------------;YX=YX+[Z]C:0019fd 9101 BCDEHLP:LD DATA,Z+C:0019fe 0fa0 ADD XL,DATAC:0019ff 9101 LD DATA,Z+C:001a00 1fb0 ADC XH,DATAC:001a01 9101 LD DATA,Z+C:001a02 1fc0 ADC YL,DATAC:001a03 8100 LD DATA,ZC:001a04 1fd0 ADC YH,DATAC:001a05 9508 RET;;--------------------------------------;YX=YX+R25R24C:001a06 0fa8 HLDEPBC:ADD XL,R24C:001a07 1fb9 ADC XH,R25C:001a08 1dcf ADC YL,NULLC:001a09 1ddf ADC YH,NULLC:001a0a 9508 RET;;--------------------------------------;C:001a0b dfd8 RASCHET:RCALL BCDE200C:001a0c + LDIZ SEC_FATC:001a0c e0e7 LDI ZL,LOW(SEC_FAT)C:001a0d e0f5 LDI ZH,HIGH(SEC_FAT)C:001a0e dfe1 RCALL BCDEHLMC:001a0f 2f0a MOV DATA,XLC:001a10 7f00 ANDI DATA,$F0C:001a11 2b0b OR DATA,XHC:001a12 2b0c OR DATA,YLC:001a13 2b0d OR DATA,YHC:001a14 9508 RET;;--------------------------------------;чтение очередного сектора файла в BUFFER;out: DATA == 0 - считан последний сектор файлаNEXTSEC:C:001a15 e517 LDI TEMP,SD_CS0C:001a16 ef0f SER DATAC:001a17 d128 RCALL FPGA_REGC:001a18 + LDIZ KOL_CLSC: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,TEMPC:001a1d 9111 LD TEMP,Z+C:001a1e 2b01 OR DATA,TEMPC:001a1f 9111 LD TEMP,Z+C:001a20 2b01 OR DATA,TEMPC:001a21 f1e1 BREQ LSTCLSFC:001a22 + LDSX TFILCLS+0C:001a22 91a0 052b LDS XL,TFILCLS+0C:001a24 91b0 052c LDS XH,TFILCLS+0+1C:001a26 + LDSY TFILCLS+2C:001a26 91c0 052d LDS YL,TFILCLS+2C:001a28 91d0 052e LDS YH,TFILCLS+2+1C:001a2a df97 RCALL REALSECC:001a2b 9100 052a LDS DATA,NUMSECKC:001a2d 0fa0 ADD XL,DATAC:001a2e 1dbf ADC XH,NULLC:001a2f 1dcf ADC YL,NULLC:001a30 1ddf ADC YH,NULLC:001a31 dee1 RCALL LOAD_DATAC:001a32 + LDSX TFILCLS+0C:001a32 91a0 052b LDS XL,TFILCLS+0C:001a34 91b0 052c LDS XH,TFILCLS+0+1C:001a36 + LDSY TFILCLS+2C:001a36 91c0 052d LDS YL,TFILCLS+2C:001a38 91d0 052e LDS YH,TFILCLS+2+1C:001a3a 9100 052a LDS DATA,NUMSECKC:001a3c 9503 INC DATAC:001a3d 9300 052a STS NUMSECK,DATAC:001a3f 9110 0502 LDS TEMP,BYTSSECC:001a41 1710 CP TEMP,DATAC:001a42 f4c9 BRNE NEXT_OKC:001a43 92f0 052a STS NUMSECK,NULLC:001a45 df1f RCALL RDFATZPC:001a46 + STSX TFILCLS+0C:001a46 93a0 052b STS TFILCLS+0,XLC:001a48 93b0 052c STS TFILCLS+0+1,XHC:001a4a + STSY TFILCLS+2C:001a4a 93c0 052d STS TFILCLS+2,YLC:001a4c 93d0 052e STS TFILCLS+2+1,YHC:001a4e + LDIZ KOL_CLSC:001a4e e3e0 LDI ZL,LOW(KOL_CLS)C:001a4f e0f5 LDI ZH,HIGH(KOL_CLS)C:001a50 8100 LD DATA,ZC:001a51 5001 SUBI DATA,1C:001a52 9301 ST Z+,DATAC:001a53 8100 LD DATA,ZC:001a54 090f SBC DATA,NULLC:001a55 9301 ST Z+,DATAC:001a56 8100 LD DATA,ZC:001a57 090f SBC DATA,NULLC:001a58 9301 ST Z+,DATAC:001a59 8100 LD DATA,ZC:001a5a 090f SBC DATA,NULLC:001a5b 9301 ST Z+,DATAC:001a5c ef0f NEXT_OK:SER DATAC:001a5d 9508 RETC:001a5e + LSTCLSF:LDSX TFILCLS+0C:001a5e 91a0 052b LDS XL,TFILCLS+0C:001a60 91b0 052c LDS XH,TFILCLS+0+1C:001a62 + LDSY TFILCLS+2C:001a62 91c0 052d LDS YL,TFILCLS+2C:001a64 91d0 052e LDS YH,TFILCLS+2+1C:001a66 df5b RCALL REALSECC:001a67 9100 052a LDS DATA,NUMSECKC:001a69 0fa0 ADD XL,DATAC:001a6a 1dbf ADC XH,NULLC:001a6b 1dcf ADC YL,NULLC:001a6c 1ddf ADC YH,NULLC:001a6d dea5 RCALL LOAD_DATAC:001a6e 9100 052a LDS DATA,NUMSECKC:001a70 9503 INC DATAC:001a71 9300 052a STS NUMSECK,DATAC:001a73 9110 052f LDS TEMP,MPHWOSTC:001a75 1b01 SUB DATA,TEMPC:001a76 9508 RET;;--------------------------------------;ошибкиSD_ERROR:C:001a77 9300 053d STS SDERROR,DATAC:001a79 ef1f LDI TEMP,LOW(RAMEND)C:001a7a bf1d OUT SPL,TEMPC:001a7b e110 LDI TEMP,HIGH(RAMEND)C:001a7c bf1e OUT SPH,TEMPC:001a7d d0ce RCALL UART_NEWLINEC:001a7e e0a0 LDI XL,0C:001a7f e0b4 LDI XH,4C:001a80 d0d3 RCALL SET_CURSORC:001a81 + LDIZ MSG_SDERROR*2C:001a81 efee LDI ZL,LOW(MSG_SDERROR*2)C:001a82 e0f0 LDI ZH,HIGH(MSG_SDERROR*2)C:001a83 d0dc RCALL PRINTSTRZC:001a84 9100 053d LDS DATA,SDERRORC:001a86 3001 CPI DATA,1C:001a87 f421 BRNE SD_ERR2C:001a88 + LDIZ MSG_CARD*2C:001a88 e0ea LDI ZL,LOW(MSG_CARD*2)C:001a89 e0f1 LDI ZH,HIGH(MSG_CARD*2)C:001a8a d0d5 RCALL PRINTSTRZC:001a8b c011 RJMP SD_NOTFOUNDSD_ERR2:C:001a8c 3002 CPI DATA,2C:001a8d f421 BRNE SD_ERR3C:001a8e + LDIZ MSG_READERROR*2C:001a8e e1e0 LDI ZL,LOW(MSG_READERROR*2)C:001a8f e0f1 LDI ZH,HIGH(MSG_READERROR*2)C:001a90 d0cf RCALL PRINTSTRZC:001a91 c01e RJMP SD_ERR9SD_ERR3:C:001a92 3003 CPI DATA,3C:001a93 f421 BRNE SD_ERR4C:001a94 + LDIZ MSG_FAT*2C:001a94 e1ec LDI ZL,LOW(MSG_FAT*2)C:001a95 e0f1 LDI ZH,HIGH(MSG_FAT*2)C:001a96 d0c9 RCALL PRINTSTRZC:001a97 c005 RJMP SD_NOTFOUNDSD_ERR4:C:001a98 3004 CPI DATA,4C:001a99 f439 BRNE SD_ERR5C:001a9a + LDIZ MSG_FILE*2C:001a9a e2e0 LDI ZL,LOW(MSG_FILE*2)C:001a9b e0f1 LDI ZH,HIGH(MSG_FILE*2)C:001a9c d0c3 RCALL PRINTSTRZSD_NOTFOUND:C:001a9d + LDIZ MSG_NOTFOUND*2C:001a9d e2e6 LDI ZL,LOW(MSG_NOTFOUND*2)C:001a9e e0f1 LDI ZH,HIGH(MSG_NOTFOUND*2)C:001a9f d0c0 RCALL PRINTSTRZC:001aa0 c00f RJMP SD_ERR9SD_ERR5:C:001aa1 3005 CPI DATA,5C:001aa2 f439 BRNE SD_ERR6C:001aa3 + LDIZ MSG_FILE*2C:001aa3 e2e0 LDI ZL,LOW(MSG_FILE*2)C:001aa4 e0f1 LDI ZH,HIGH(MSG_FILE*2)C:001aa5 d0ba RCALL PRINTSTRZC:001aa6 + LDIZ MSG_EMPTY*2C:001aa6 e3e2 LDI ZL,LOW(MSG_EMPTY*2)C:001aa7 e0f1 LDI ZH,HIGH(MSG_EMPTY*2)C:001aa8 d0b7 RCALL PRINTSTRZC:001aa9 c006 RJMP SD_ERR9SD_ERR6:C:001aaa + LDIZ MSG_FILE*2C:001aaa e2e0 LDI ZL,LOW(MSG_FILE*2)C:001aab e0f1 LDI ZH,HIGH(MSG_FILE*2)C:001aac d0b3 RCALL PRINTSTRZC:001aad + LDIZ MSG_TOOBIG*2C:001aad e3ea LDI ZL,LOW(MSG_TOOBIG*2)C:001aae e0f1 LDI ZH,HIGH(MSG_TOOBIG*2)C:001aaf d0b0 RCALL PRINTSTRZSD_ERR9:;C:001ab0 91e0 053d LDS ZL,SDERRORC:001ab2 + SD_ERR1:LED_ONC:001ab2 98c7 CBI PORTB,7C:001ab3 e005 LDI DATA,5C:001ab4 d0d5 RCALL BEEPC:001ab5 + LED_OFFC:001ab5 9ac7 SBI PORTB,7C:001ab6 e005 LDI DATA,5C:001ab7 d0e1 RCALL DELAYC:001ab8 95ea DEC ZLC:001ab9 f7c1 BRNE SD_ERR1;C:001aba d091 RCALL UART_NEWLINEC:001abb e0a0 LDI XL,0C:001abc e0b6 LDI XH,6C:001abd d096 RCALL SET_CURSORC:001abe + LDIZ MSG_HALT*2C:001abe e8e2 LDI ZL,LOW(MSG_HALT*2)C:001abf e0f1 LDI ZH,HIGH(MSG_HALT*2)C:001ac0 d09f RCALL PRINTSTRZC:001ac1 9816 CBI DDRE,6C:001ac2 cfff STOP2: RJMP STOP2;;======================================;чтение ID Flash-ROM чипа;out: ZL,ZHC:001ac3 d03c F_ID: RCALL F_RSTC:001ac4 e900 LDI DATA,$90C:001ac5 d040 RCALL F_CMDC:001ac6 ef14 LDI TEMP,FLASH_CTRLC:001ac7 e003 LDI DATA,0B00000011C:001ac8 d077 RCALL FPGA_REGC:001ac9 e0a0 LDI XL,$00C:001aca e0b0 LDI XH,$00C:001acb e0c0 LDI YL,$00C:001acc d067 RCALL F_INC:001acd 2fe0 MOV ZL,DATAC:001ace e0a1 LDI XL,$01C:001acf d064 RCALL F_INC:001ad0 2ff0 MOV ZH,DATAC:001ad1 c02e RJMP F_RST;;--------------------------------------;запись одного байта во Flash-ROM;in: RAM[Z] == data; XL,XH,YL == addressC:001ad2 ea00 F_WRITE:LDI DATA,$A0C:001ad3 d032 RCALL F_CMDC:001ad4 ef14 LDI TEMP,FLASH_CTRLC:001ad5 e001 LDI DATA,0B00000001C:001ad6 d069 RCALL FPGA_REGC:001ad7 ef10 LDI TEMP,FLASH_LOADDRC:001ad8 2f0a MOV DATA,XLC:001ad9 d066 RCALL FPGA_REGC:001ada ef11 LDI TEMP,FLASH_MIDADDRC:001adb 2f0b MOV DATA,XHC:001adc d063 RCALL FPGA_REGC:001add ef12 LDI TEMP,FLASH_HIADDRC:001ade 2f0c MOV DATA,YLC:001adf d060 RCALL FPGA_REGC:001ae0 ef13 LDI TEMP,FLASH_DATAC:001ae1 8100 LD DATA,ZC:001ae2 d05d RCALL FPGA_REGC:001ae3 ef14 LDI TEMP,FLASH_CTRLC:001ae4 e005 LDI DATA,0B00000101C:001ae5 d05a RCALL FPGA_REGC:001ae6 e001 LDI DATA,0B00000001C:001ae7 d05d RCALL FPGA_SAME_REGC:001ae8 e003 LDI DATA,0B00000011C:001ae9 d05b RCALL FPGA_SAME_REGC:001aea ef13 LDI TEMP,FLASH_DATAC:001aeb d054 RCALL FPGA_REGC:001aec d058 F_WRIT1:RCALL FPGA_SAME_REGC:001aed 8110 LD TEMP,ZC:001aee 2701 EOR DATA,TEMPC:001aef fd07 SBRC DATA,7C:001af0 cffb RJMP F_WRIT1C:001af1 9508 RET;;--------------------------------------;стирание Flash-ROMC:001af2 e800 F_ERASE:LDI DATA,$80C:001af3 d012 RCALL F_CMDC:001af4 e100 LDI DATA,$10C:001af5 d010 RCALL F_CMDC:001af6 ef14 LDI TEMP,FLASH_CTRLC:001af7 e003 LDI DATA,0B00000011C:001af8 d047 RCALL FPGA_REGC:001af9 ef13 LDI TEMP,FLASH_DATAC:001afa d045 RCALL FPGA_REGC:001afb + F_ERAS1:LED_OFFC:001afb 9ac7 SBI PORTB,7C:001afc d048 RCALL FPGA_SAME_REGC:001afd + LED_ONC:001afd 98c7 CBI PORTB,7C:001afe ff07 SBRS DATA,7C:001aff cffb RJMP F_ERAS1;; - - - - - - - - - - - - - - - - - - -;сброс Flash-ROM чипаC:001b00 ef00 F_RST: LDI DATA,$F0C:001b01 d004 RCALL F_CMDC:001b02 e113 LDI TEMP,19 ;~5 us @ 11.0592 MHzC:001b03 951a F_RST1: DEC TEMP ;1C:001b04 f7f1 BRNE F_RST1 ;2C:001b05 9508 RET;;--------------------------------------;комманда в Flash-ROM чип;in: DATA == instructionsC:001b06 930f F_CMD: PUSH DATAC:001b07 ef14 LDI TEMP,FLASH_CTRLC:001b08 e001 LDI DATA,0B00000001C:001b09 d036 RCALL FPGA_REGC:001b0a ef10 LDI TEMP,FLASH_LOADDRC:001b0b e505 LDI DATA,$55C:001b0c d033 RCALL FPGA_REGC:001b0d ef11 LDI TEMP,FLASH_MIDADDRC:001b0e e505 LDI DATA,$55C:001b0f d030 RCALL FPGA_REGC:001b10 ef13 LDI TEMP,FLASH_DATAC:001b11 ea0a LDI DATA,$AAC:001b12 d02d RCALL FPGA_REGC:001b13 ef14 LDI TEMP,FLASH_CTRLC:001b14 e005 LDI DATA,0B00000101C:001b15 d02a RCALL FPGA_REGC:001b16 e001 LDI DATA,0B00000001C:001b17 d02d RCALL FPGA_SAME_REGC:001b18 ef10 LDI TEMP,FLASH_LOADDRC:001b19 ea0a LDI DATA,$AAC:001b1a d025 RCALL FPGA_REGC:001b1b ef11 LDI TEMP,FLASH_MIDADDRC:001b1c e20a LDI DATA,$2AC:001b1d d022 RCALL FPGA_REGC:001b1e ef13 LDI TEMP,FLASH_DATAC:001b1f e505 LDI DATA,$55C:001b20 d01f RCALL FPGA_REGC:001b21 ef14 LDI TEMP,FLASH_CTRLC:001b22 e005 LDI DATA,0B00000101C:001b23 d01c RCALL FPGA_REGC:001b24 e001 LDI DATA,0B00000001C:001b25 d01f RCALL FPGA_SAME_REGC:001b26 ef10 LDI TEMP,FLASH_LOADDRC:001b27 e505 LDI DATA,$55C:001b28 d017 RCALL FPGA_REGC:001b29 ef11 LDI TEMP,FLASH_MIDADDRC:001b2a e505 LDI DATA,$55C:001b2b d014 RCALL FPGA_REGC:001b2c ef13 LDI TEMP,FLASH_DATAC:001b2d 910f POP DATAC:001b2e d011 RCALL FPGA_REGC:001b2f ef14 LDI TEMP,FLASH_CTRLC:001b30 e005 LDI DATA,0B00000101C:001b31 d00e RCALL FPGA_REGC:001b32 e001 LDI DATA,0B00000001C:001b33 c011 RJMP FPGA_SAME_REG;;--------------------------------------;чтение одного байта Flash-ROM;in: XL,XH,YL == address;out: DATA == dataC:001b34 ef10 F_IN: LDI TEMP,FLASH_LOADDRC:001b35 2f0a MOV DATA,XLC:001b36 d009 RCALL FPGA_REGC:001b37 ef11 LDI TEMP,FLASH_MIDADDRC:001b38 2f0b MOV DATA,XHC:001b39 d006 RCALL FPGA_REGC:001b3a ef12 LDI TEMP,FLASH_HIADDRC:001b3b 2f0c MOV DATA,YLC:001b3c d003 RCALL FPGA_REGC:001b3d ef13 LDI TEMP,FLASH_DATAC:001b3e ef0f LDI DATA,$FFC:001b3f c000 RJMP FPGA_REG;;--------------------------------------;обмен с регистрами в FPGA;in: TEMP == номер регистра; DATA == данные;out: DATA == данныеFPGA_REG:C:001b40 930f PUSH DATAC:001b41 + SPICS_SETC:001b41 9ac0 SBI PORTB,0C:001b42 b91f OUT SPDR,TEMPC:001b43 d003 RCALL RD_WHEN_RDYC:001b44 910f POP DATA;обмен без установки регистра;in: DATA == данные;out: DATA == данныеFPGA_SAME_REG:C:001b45 + SPICS_CLRC:001b45 98c0 CBI PORTB,0C:001b46 b90f OUT SPDR,DATA;ожидание окончания обмена с FPGA по SPI;и чтение пришедших данных;out: DATA == данныеRD_WHEN_RDY:C:001b47 9b77 SBIS SPSR,SPIFC:001b48 cffe RJMP RD_WHEN_RDYC:001b49 b10f IN DATA,SPDRC:001b4a + SPICS_SETC:001b4a 9ac0 SBI PORTB,0C:001b4b 9508 RET;;--------------------------------------;UART_NEWLINE:C:001b4c + LDIZ MSG_NEWLINE*2C: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 DATAC:001b50 f011 BREQ UPSTRZ2C:001b51 d02f RCALL UART_PUTCHARC:001b52 cffb RJMP UPSTRZ1C:001b53 9508 UPSTRZ2:RET;;--------------------------------------;установка позиции печати на экране;in: XL == x (0..31); XH == y (0..23)SET_CURSOR:C:001b54 e210 LDI TEMP,32C:001b55 9fb1 MUL XH,TEMPC:001b56 27bb CLR XHC:001b57 0da0 ADD XL,R0C:001b58 1db1 ADC XH,R1C:001b59 9711 SBIW XL,1C:001b5a e410 LDI TEMP,SCR_LOADDRC:001b5b 2f0a MOV DATA,XLC:001b5c dfe3 RCALL FPGA_REGC:001b5d e411 LDI TEMP,SCR_HIADDRC:001b5e 2f0b MOV DATA,XHC:001b5f cfe0 RJMP FPGA_REG;;--------------------------------------;вывод строки на экран и на UART;in: Z == указательна строку (в младших 64K)PRINTSTRZ:C:001b60 9105 PRSTRZ1:LPM DATA,Z+C:001b61 2300 TST DATAC:001b62 f011 BREQ PRSTRZ2C:001b63 d017 RCALL PUTCHARC:001b64 cffb RJMP PRSTRZ1C:001b65 9508 PRSTRZ2:RET;;--------------------------------------;out byte in dec;in: DATA == byte (0..99)C:001b66 5d00 DECBYTE:SUBI DATA,208C:001b67 ff07 SBRS DATA,7C:001b68 5300 SUBI DATA,48C:001b69 5e08 SUBI DATA,232C:001b6a ff06 SBRS DATA,6C:001b6b 5108 SUBI DATA,24C:001b6c 5f04 SUBI DATA,244C:001b6d ff05 SBRS DATA,5C:001b6e 500c SUBI DATA,12C:001b6f 5f0a SUBI DATA,250C:001b70 ff04 SBRS DATA,4C:001b71 5006 SUBI DATA,6;; - - - - - - - - - - - - - - - - - - -;out byte in hex;in: DATA == byteC:001b72 930f HEXBYTE:PUSH DATAC:001b73 9502 SWAP DATAC:001b74 d001 RCALL HEXHALFC:001b75 910f POP DATAC:001b76 700f HEXHALF:ANDI DATA,$0FC:001b77 300a CPI DATA,$0AC:001b78 f008 BRCS HEXBYT1C:001b79 + ADDI DATA,$07C:001b79 5f09 SUBI DATA,(-$07&$FF)C:001b7a + HEXBYT1:ADDI DATA,$30C:001b7a 5d00 SUBI DATA,(-$30&$FF);; - - - - - - - - - - - - - - - - - - -;вывод символа на экран и на UART;in: DATA == charC:001b7b 930f PUTCHAR:PUSH DATAC:001b7c 931f PUSH TEMPC:001b7d e414 LDI TEMP,SCR_CHARC:001b7e dfc1 RCALL FPGA_REGC:001b7f 911f POP TEMPC:001b80 910f POP DATAUART_PUTCHAR:C:001b81 931f PUSH TEMPC:001b82 + UPCHR1: INPORT TEMP,UCSR1AC:001b82 9110 009b LDS TEMP,UCSR1A+$20*(UCSR1A<$40)C:001b84 ff15 SBRS TEMP,UDREC:001b85 cffc RJMP UPCHR1C:001b86 + OUTPORT UDR1,DATAC:001b86 9300 009c STS UDR1+$20*(UDR1<$40),DATAC:001b88 911f POP TEMPC:001b89 9508 RET;;--------------------------------------;in: DATA == продолжительность *0.1 секBEEP:C:001b8a e614 BEE2: LDI TEMP,100;100 периодов 1кГцC:001b8b 981e BEE1: CBI PORTE,6C:001b8c d007 RCALL BEEPDLYC:001b8d 9a1e SBI PORTE,6C:001b8e d005 RCALL BEEPDLYC:001b8f 951a DEC TEMPC:001b90 f7d1 BRNE BEE1C:001b91 950a DEC DATAC:001b92 f7b9 BRNE BEE2C:001b93 9508 RETC:001b94 e684 BEEPDLY:LDI R24,$64C:001b95 e095 LDI R25,$05C:001b96 9701 BEEPDL1:SBIW R24,1C:001b97 f7f1 BRNE BEEPDL1C:001b98 9508 RET;;--------------------------------------;in: DATA == продолжительность *0.1 секC:001b99 e14e DELAY: LDI R20,$1E ;\C:001b9a ef5e LDI R21,$FE ;/ 0,1 ᥪ @ 11.0592MHzC:001b9b 95c8 DELAY1: LPM ;3C:001b9c 95c8 LPM ;3C:001b9d 95c8 LPM ;3C:001b9e 95c8 LPM ;3C:001b9f 5041 SUBI R20,1 ;1C:001ba0 4050 SBCI R21,0 ;1C:001ba1 4000 SBCI DATA,0 ;1C:001ba2 f7c1 BRNE DELAY1 ;2(1)C:001ba3 9508 RET;;--------------------------------------;Segment usage:Code : 7076 words (14152 bytes)Data : 68 bytesEEPROM : 0 bytesAssembly completed with no errors.