Blame | Last modification | View Log | Download | RSS feed
#include "_global.h"; include "_t_beep.h";------------------------------------------------------------------------------;uint8_t random8();LFSR; taps:31,28; 8 shift-cycles per call.global random8.func random8random8:lds r18,(_rnd)+2lds r19,(_rnd)+3sts (_rnd)+3,r18rol r18rol r19mov r24,r19rol r18rol r19rol r18rol r19rol r18rol r19eor r24,r19lds r18,(_rnd)+1sts (_rnd)+2,r18lds r18,_rndsts (_rnd)+1,r18sts _rnd,r24ret.endfunc;;------------------------------------------------------------------------------;DBMASK=0x07ff#define DBMASK_HI 7;------------------------------------------------------------------------------;void load_fpga(uint_farptr_t confdata);1) запрет прерываний;2) инициализация SPI;3) распаковка данных и загрузка FPGA.global load_fpga.func load_fpgaload_fpga:cli;инициализация SPIldi r18,(1<<SPI2X)out _SFR_IO_ADDR(SPSR),r18ldi r18,(1<<SPE)|(1<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)out _SFR_IO_ADDR(SPCR),r18;загрузка FPGAlds r18,_SFR_MEM_ADDR(DDRF)sbr r18,(1<<PF0) ;устанавливаем nCONFIGsts _SFR_MEM_ADDR(DDRF),r18ldi r19,184 ;задержка 50 мкс.L_1: dec r19 ;1brne .L_1 ;2cbr r18,(1<<PF0) ;сбрасываем nCONFIGsts _SFR_MEM_ADDR(DDRF),r18.L_2: sbis _SFR_IO_ADDR(PINF),PF1 ;ждём 1 на nSTATUSrjmp .L_2mov r30,r22 ;значение входного параметра в RAMPZ,Zmov r31,r23out _SFR_IO_ADDR(RAMPZ),r24push r28push r29ldi r28,lo8(megabuffer) ;указатель на буфер в Yldi r29,hi8(megabuffer)ldi r18,0x80;.L_ms: elpm r0,Z+st Y+,r0;out _SFR_IO_ADDR(SPDR),r0.L_3: sbis _SFR_IO_ADDR(SPSR),SPIFrjmp .L_3;subi r28,lo8(megabuffer) ;sbci r29,hi8(megabuffer) ;andi r29,DBMASK_HI ;Y warpsubi r28,lo8(-(megabuffer)) ;sbci r29,hi8(-(megabuffer)) ;.L_m0: ldi r21,0x02ldi r20,0xff.L_m1:.L_m1x: add r18,r18brne .L_m2elpm r18,Z+rol r18.L_m2: rol r20brcc .L_m1xdec r21brne .L_x2ldi r19,2asr r20brcs .L_n1inc r19inc r20breq .L_n2ldi r21,0x03ldi r20,0x3frjmp .L_m1.L_x2: dec r21brne .L_x3lsr r20brcs .L_msinc r21rjmp .L_m1.L_x6: add r19,r20.L_n2: ldi r21,0x04ldi r20,0xffrjmp .L_m1.L_n1: inc r20brne .L_m4inc r21.L_n5: ror r20brcs .L_demlzendrol r21add r18,r18brne .L_n6elpm r18,Z+rol r18.L_n6: brcc .L_n5add r19,r21ldi r21,6rjmp .L_m1.L_x3: dec r21brne .L_x4ldi r19,1rjmp .L_m3.L_x4: dec r21brne .L_x5inc r20brne .L_m4ldi r21,0x05ldi r20,0x1frjmp .L_m1.L_x5: dec r21brne .L_x6mov r21,r20.L_m4: elpm r20,Z+.L_m3: dec r21mov r26,r20mov r27,r21add r26,r28adc r27,r29.L_ldirloop:subi r26,lo8(megabuffer) ;sbci r27,hi8(megabuffer) ;andi r27,DBMASK_HI ;X warpsubi r26,lo8(-(megabuffer)) ;sbci r27,hi8(-(megabuffer)) ;ld r0,X+st Y+,r0;out _SFR_IO_ADDR(SPDR),r0.L_4: sbis _SFR_IO_ADDR(SPSR),SPIFrjmp .L_4;subi r28,lo8(megabuffer) ;sbci r29,hi8(megabuffer) ;andi r29,DBMASK_HI ;Y warpsubi r28,lo8(-(megabuffer)) ;sbci r29,hi8(-(megabuffer)) ;dec r19brne .L_ldirlooprjmp .L_m0.L_demlzend:sbis _SFR_IO_ADDR(PINF),PF2 ;ждём 1 на CONFDONErjmp .L_demlzendpop r29pop r28ret.endfunc;;------------------------------------------------------------------------------;.global TIMER3_COMPA_vect.func TIMER3_COMPA_vectTIMER3_COMPA_vect:push r18in r18,_SFR_IO_ADDR(SREG)push r18lds r18,mscountersbrc r18,4cbi _SFR_IO_ADDR(PORTB),7 ; led oninc r18sts mscounter,r18brne .L_t3_cmpasbi _SFR_IO_ADDR(PORTB),7 ; led offlds r18,(mscounter)+1inc r18sts (mscounter)+1,r18.L_t3_cmpa:pop r18out _SFR_IO_ADDR(SREG),r18pop r18reti.endfunc;;------------------------------------------------------------------------------;.global INT6_vect.func INT6_vectINT6_vect:push r18in r18,_SFR_IO_ADDR(SREG)push r18lds r18,int6vectsbrc r18,0call t_beep_intsbrc r18,1sts newframe,r18pop r18out _SFR_IO_ADDR(SREG),r18pop r18reti.endfunc;;------------------------------------------------------------------------------