⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb90s23x3.lst

📁 单片机AT90S系列 制作简易USB接口(软件模拟,无usb硬件)。asm源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
0001b2 9329      		st		Y+,temp2		;ulozenie spat ako dekodovany byte a zvys pointer do buffera
0001b3 17c6      		cp		USBBufptrY,ByteCount	;ak este neboli vsetky
0001b4 f7b9      		brne	NRZIloop		;tak opakuj
0001b5 916f      		pop		ByteCount		;obnov dlzku buffera
0001b6 91cf      		pop		USBBufptrY		;obnov pointer do buffera
0001b7 9508      		ret				;inak skonci
         ;------------------------------------------------------------------------------------------
          BitStuff:	;odstranenie bit-stuffingu v buffri
0001b8 2711      		clr		temp3			;pocitadlo vynechanych bitov
0001b9 2477      		clr		lastBitstufNumber	;0xFF do lastBitstufNumber
0001ba 947a      		dec		lastBitstufNumber
          BitStuffRepeat:
0001bb 93cf      		push	USBBufptrY		;zalohuj pointer do buffera
0001bc 936f      		push	ByteCount		;zalohuj dlzku buffera
0001bd 2f31      		mov		temp1,temp3		;pocitadlo vsetkych bitov
0001be e048      		ldi		temp0,8			;spocitat vsetky bity v bufferi
          SumAllBits:
0001bf 0f34      		add		temp1,temp0
0001c0 956a      		dec		ByteCount
0001c1 f7e9      		brne	SumAllBits
0001c2 e026      		ldi		temp2,6			;inicializuj pocitadlo jednotiek
0001c3 916f      		pop		ByteCount		;obnov dlzku buffera
0001c4 936f      		push	ByteCount		;zalohuj dlzku buffera
0001c5 0f6c      		add		ByteCount,USBBufptrY	;koniec buffera do ByteCount
0001c6 9563      		inc		ByteCount		;a pre istotu ho zvys o 2 (kvoli posuvaniu)
0001c7 9563      		inc		ByteCount
          BitStuffLoop:
0001c8 8148      		ld		temp0,Y			;nahraj prijaty byte z buffera
0001c9 e058      		ldi		bitcount,8		;pocitadlo bitov v byte
          BitStuffByteLoop:
0001ca 9547      		ror		temp0			;naplnenie carry z LSB
0001cb f008      		brcs	IncrementBitstuff	;ak LSB=0
0001cc e027      		ldi		temp2,7			;inicializuj pocitadlo jednotiek +1 (ak bola nula)
          IncrementBitstuff:
0001cd 952a      		dec		temp2			;zniz pocitadlo jednotiek (predpoklad jednotkoveho bitu)
0001ce f4a1      		brne	NeposunBuffer		;ak este nebolo 6 jednotiek za sebou - neposun buffer
0001cf 1537      		cp		temp1,lastBitstufNumber	;
0001d0 e026      		ldi		temp2,6			;inicializuj pocitadlo jednotiek (ak by sa nerobil bitstuffing tak sa musi zacat odznova)
0001d1 f488      		brcc	NeposunBuffer		;ak sa tu uz robil bitstuffing - neposun buffer
         
0001d2 953a      		dec		temp1
0001d3 2e73      		mov		lastBitstufNumber,temp1	;zapamataj si poslednu poziciu bitstuffingu
0001d4 3051      		cpi		bitcount,1		;aby sa ukazovalo na 7 bit (ktory sa ma vymazat alebo kde sa ma vlozit nula)
0001d5 f411      		brne	NoBitcountCorrect
0001d6 e059      		ldi		bitcount,9
0001d7 95c3      		inc		USBBufptrY		;zvys pointer do buffera
          NoBitcountCorrect:
0001d8 955a      		dec		bitcount
0001d9 fa90      		bst		BitStuffInOut,0
0001da f01e      		brts	CorrectOutBuffer	;ak je Out buffer - zvys dlzku buffera
0001db d037      		rcall	PosunDeleteBuffer	;posun In buffer
0001dc 951a      		dec		temp3			;zniz pocitadlo vynechani
0001dd c002      		rjmp	CorrectBufferEnd
          CorrectOutBuffer:
0001de d01b      		rcall	PosunInsertBuffer	;posun Out buffer
0001df 9513      		inc		temp3			;zvys pocitadlo vynechani
          CorrectBufferEnd:
0001e0 916f      		pop		ByteCount		;obnov dlzku buffera
0001e1 91cf      		pop		USBBufptrY		;obnov pointer do buffera
0001e2 cfd8      		rjmp	BitStuffRepeat		;a restartni od zaciatku
          NeposunBuffer:
0001e3 953a      		dec		temp1			;ak uz boli vsetky bity
0001e4 f021      		breq	EndBitStuff		;ukonci cyklus
0001e5 955a      		dec		bitcount		;zniz pocitadlo bitov v byte
0001e6 f719      		brne	BitStuffByteLoop	;ak este neboli vsetky bity v byte - chod na dalsi bit
         						;inak nahraj dalsi byte
0001e7 95c3      		inc		USBBufptrY		;zvys pointer do buffera
0001e8 cfdf      		rjmp	BitStuffLoop		;a opakuj
          EndBitStuff:
0001e9 916f      		pop		ByteCount		;obnov dlzku buffera
0001ea 91cf      		pop		USBBufptrY		;obnov pointer do buffera
0001eb fa90      		bst		BitStuffInOut,0
0001ec f03e      		brts	IncrementLength		;ak je Out buffer - zvys dlzku Out buffera
          DecrementLength:				;ak je In buffer - zniz dlzku In buffera
0001ed 3010      		cpi		temp3,0			;bolo aspon jedno znizenie
0001ee f051      		breq	NoChangeByteCount	;ak nie - nemen dlzku buffera
0001ef 956a      		dec		ByteCount		;ak je In buffer - zniz dlzku buffera
0001f0 5f18      		subi	temp3,256-8		;ak nebolo viac ako 8 bitov naviac
0001f1 f438      		brcc	NoChangeByteCount	;tak skonci
0001f2 956a      		dec		ByteCount		;inak este zniz dlzku buffera
0001f3 9508      		ret				;a skonci
          IncrementLength:
0001f4 2e81      		mov		OutBitStuffNumber,temp3	;zapamataj si pocet bitov naviac
0001f5 5018      		subi	temp3,8			;ak nebolo viac ako 8 bitov naviac
0001f6 f010      		brcs	NoChangeByteCount	;tak skonci
0001f7 9563      		inc		ByteCount		;inak zvys dlzku buffera
0001f8 2e81      		mov		OutBitStuffNumber,temp3	;a zapamataj si pocet bitov naviac (znizene o 8)
          NoChangeByteCount:
0001f9 9508      		ret				;skonci
         ;------------------------------------------------------------------------------------------
          PosunInsertBuffer:	;posuv buffera o jeden bit vpravo od konca az po poziciu: byte-USBBufptrY a bit-bitcount
0001fa 2f45      		mov		temp0,bitcount		;vypocet: bitcount= 9-bitcount
0001fb e059      		ldi		bitcount,9
0001fc 1b54      		sub		bitcount,temp0		;do bitcount poloha bitu, ktory treba nulovat
         
0001fd 8138      		ld		temp1,Y			;nahraj byte ktory este treba posunut od pozicie bitcount
0001fe 1f33      		rol		temp1			;a posun vlavo cez Carry (prenos z vyssieho byte a LSB do Carry)
0001ff ef2f      		ser		temp2			;FF do masky - temp2
          HalfInsertPosuvMask:
000200 0f22      		lsl		temp2			;nula do dalsieho spodneho bitu masky
000201 955a      		dec		bitcount		;az pokial sa nedosiahne hranica posuvania v byte
000202 f7e9      		brne	HalfInsertPosuvMask
         		
000203 2332      		and		temp1,temp2		;odmaskuj aby zostali iba vrchne posunute bity v temp1
000204 9520      		com		temp2			;invertuj masku
000205 9526      		lsr		temp2			;posun masku vpravo - na vlozenie nuloveho bitu
000206 8148      		ld		temp0,Y			;nahraj byte ktory este treba posunut od pozicie bitcount do temp0
000207 2342      		and		temp0,temp2		;odmaskuj aby zostali iba spodne neposunute bity v temp0
000208 2b34      		or		temp1,temp0		;a zluc posunutu a neposunutu cast
         
000209 8148      		ld		temp0,Y			;nahraj byte ktory este treba posunut od pozicie bitcount
00020a 1f44      		rol		temp0			;a posun ho vlavo cez Carry (aby sa nastavilo spravne Carry pre dalsie prenosy)
00020b 9339      		st		Y+,temp1		;a nahraj spat upraveny byte
          PosunInsertBufferLoop:
00020c 13c6      		cpse	USBBufptrY,ByteCount	;ak nie su vsetky cele byty
00020d c001      		rjmp	NoEndPosunInsertBuffer	;tak pokracuj
00020e 9508      		ret				;inak skonci
          NoEndPosunInsertBuffer:
00020f 8138      		ld		temp1,Y			;nahraj byte
000210 1f33      		rol		temp1			;a posun vlavo cez Carry (prenos z nizsieho byte a LSB do Carry)
000211 9339      		st		Y+,temp1		;a nahraj spat
000212 cff9      		rjmp	PosunInsertBufferLoop	;a pokracuj
         ;------------------------------------------------------------------------------------------
          PosunDeleteBuffer:	;posuv buffera o jeden bit vlavo od konca az po poziciu: byte-USBBufptrY a bit-bitcount
000213 2f45      		mov		temp0,bitcount		;vypocet: bitcount= 9-bitcount
000214 e059      		ldi		bitcount,9
000215 1b54      		sub		bitcount,temp0		;do bitcount poloha bitu, ktory este treba posunut
000216 2f4c      		mov		temp0,USBBufptrY	;uschovanie pointera do buffera
000217 9543      		inc		temp0			;pozicia celych bytov do temp0
000218 2fc6      		mov		USBBufptrY,ByteCount	;maximalna pozicia do pointra
          PosunDeleteBufferLoop:
000219 913a      		ld		temp1,-Y		;zniz buffer a nahraj byte
00021a 9537      		ror		temp1			;a posun vpravo cez Carry (prenos z vyssieho byte a LSB do Carry)
00021b 8338      		st		Y,temp1			;a nahraj spat
00021c 13c4      		cpse	USBBufptrY,temp0	;ak nie su vsetky cele byty
00021d cffb      		rjmp	PosunDeleteBufferLoop	;tak pokracuj
         
00021e 913a      		ld		temp1,-Y		;zniz buffer a nahraj byte ktory este treba posunut od pozicie bitcount
00021f 9537      		ror		temp1			;a posun vpravo cez Carry (prenos z vyssieho byte a LSB do Carry)
000220 ef2f      		ser		temp2			;FF do masky - temp2
          HalfDeletePosuvMask:
000221 955a      		dec		bitcount		;az pokial sa nedosiahne hranica posuvania v byte
000222 f011      		breq	DoneMask
000223 0f22      		lsl		temp2			;nula do dalsieho spodneho bitu masky
000224 cffc      		rjmp	HalfDeletePosuvMask
          DoneMask:
000225 2332      		and		temp1,temp2		;odmaskuj aby zostali iba vrchne posunute bity v temp1
000226 9520      		com		temp2			;invertuj masku
000227 8148      		ld		temp0,Y			;nahraj byte ktory este treba posunut od pozicie bitcount do temp0
000228 2342      		and		temp0,temp2		;odmaskuj aby zostali iba spodne neposunute bity v temp0
000229 2b34      		or		temp1,temp0		;a zluc posunutu a neposunutu cast
00022a 8338      		st		Y,temp1			;a nahraj spat
00022b 9508      		ret				;a skonci
         ;------------------------------------------------------------------------------------------
          MirrorInBufferBytes:
00022c 93cf      		push	USBBufptrY
00022d 936f      		push	ByteCount
00022e e6c0      		ldi		USBBufptrY,InputBufferBegin
00022f d003      		rcall	MirrorBufferBytes
000230 916f      		pop		ByteCount
000231 91cf      		pop		USBBufptrY
000232 9508      		ret
         ;------------------------------------------------------------------------------------------
          MirrorBufferBytes:
000233 0f6c      		add		ByteCount,USBBufptrY	;ByteCount ukazuje na koniec spravy
          MirrorBufferloop:
000234 8148      		ld		temp0,Y			;nahraj prijaty byte z buffera
000235 e038      		ldi		temp1,8			;pocitadlo bitov
          MirrorBufferByteLoop:
000236 9547      		ror		temp0			;do carry dalsi najnizsi bit
000237 1f22      		rol		temp2			;z carry dalsi bit na obratene poradie
000238 953a      		dec		temp1			;bol uz cely byte
000239 f7e1      		brne	MirrorBufferByteLoop	;ak nie tak opakuj dalsi najnizsi bit
00023a 9329      		st		Y+,temp2		;ulozenie spat ako obrateny byte  a zvys pointer do buffera
00023b 17c6      		cp		USBBufptrY,ByteCount	;ak este neboli vsetky
00023c f7b9      		brne	MirrorBufferloop	;tak opakuj
00023d 9508      		ret				;inak skonci
         ;------------------------------------------------------------------------------------------
          CheckCRCIn:
00023e 93cf      		push	USBBufptrY
00023f 936f      		push	ByteCount
000240 e6c0      		ldi		USBBufptrY,InputBufferBegin
000241 d011      		rcall	CheckCRC
000242 916f      		pop		ByteCount
000243 91cf      		pop		USBBufptrY
000244 9508      		ret
         ;------------------------------------------------------------------------------------------
          AddCRCOut:
000245 93cf      		push	USBBufptrY
000246 936f      		push	ByteCount
000247 eccf      		ldi		USBBufptrY,OutputBufferBegin
000248 d00a      		rcall	CheckCRC
000249 9540      		com		temp0			;negacia CRC
00024a 9530      		com		temp1
00024b 9339      		st		Y+,temp1		;ulozenie CRC na koniec buffera (najskor MSB)
00024c 8348      		st		Y,temp0			;ulozenie CRC na koniec buffera (potom LSB)
00024d 95ca      		dec		USBBufptrY		;pointer na poziciu CRC
00024e e062      		ldi		ByteCount,2		;otocit 2 byty CRC
00024f dfe3      		rcall	MirrorBufferBytes	;opacne poradie bitov CRC (pri vysielani CRC sa posiela naskor MSB)
000250 916f      		pop		ByteCount
000251 91cf      		pop		USBBufptrY
000252 9508      		ret
         ;------------------------------------------------------------------------------------------
          CheckCRC:	;vstup: USBBufptrY = zaciatok spravy	,ByteCount = dlzka spravy
000253 0f6c      		add		ByteCount,USBBufptrY	;ByteCount ukazuje na koniec spravy
000254 95c3      		inc		USBBufptrY		;nastav pointer na zaciatok spravy - vynechat SOP
000255 9149      		ld		temp0,Y+		;nahraj PID do temp0
         						;a nastav pointer na zaciatok spravy - vynechat aj PID
000256 3c43      		cpi		temp0,DATA0PID		;ci je DATA0 pole
000257 f011      		breq	ComputeDATACRC		;pocitaj CRC16
000258 344b      		cpi		temp0,DATA1PID		;ci je DATA1 pole
000259 f4a9      		brne	CRC16End		;ak nie tak skonci 
          ComputeDATACRC:
00025a ef4f      		ser		temp0			;inicializacia zvysku LSB na 0xff
00025b ef3f      		ser		temp1			;inicializacia zvysku MSB na 0xff		
          CRC16Loop:
00025c 9129      		ld		temp2,Y+		;nahraj spravu do temp2 a zvys pointer do buffera
00025d e018      		ldi		temp3,8			;pocitadlo bitov v byte - temp3
          CRC16LoopByte:
00025e fb37      		bst		temp1,7			;do T uloz MSB zvysku (zvysok je iba 16 bitovy - 8 bit vyssieho byte)
00025f f950      		bld		bitcount,0		;do bitcount LSB uloz T - MSB zvysku
000260 2752      		eor		bitcount,temp2		;XOR bitu spravy a bitu zvysku - v LSB bitcount
000261 1f44      		rol		temp0			;posun zvysok dolava - nizsi byte (dva byty - cez carry)
000262 1f33      		rol		temp1			;posun zvysok dolava - vyssi byte (dva byty - cez carry)
000263 7f4e      		cbr		temp0,1			;znuluj LSB zvysku
000264 9526      		lsr		temp2			;posun spravu doprava
000265 9557      		ror	bitcount		;vysledok XOR-u bitov z LSB do carry
000266 f420      		brcc	CRC16NoXOR		;ak je XOR bitu spravy a MSB zvysku = 0 , tak nerob XOR
000267 e850      		ldi		bitcount,CRC16poly>>8	;do bitcount CRC polynom - vrchny byte
000268 2735      		eor		temp1,bitcount		;a urob XOR zo zvyskom a CRC polynomom - vrchny byte
000269 e055      		ldi		bitcount,CRC16poly	;do bitcount CRC polynom - spodny byte
00026a 2745      		eor		temp0,bitcount		;a urob XOR zo zvyskom a CRC polynomom - spodny byte
          CRC16NoXOR:
00026b 951a      		dec		temp3			;boli uz vsetky bity v byte
00026c f789      		brne	CRC16LoopByte		;ak nie, tak chod na dalsi bit
00026d 17c6      		cp		USBBufptrY,ByteCount	;bol uz koniec spravy
00026e f769      		brne	CRC16Loop		;ak nie tak opakuj
          CRC16End:
00026f 9508      		ret				;inak skonci (v temp0 a temp1 je vysledok)
         ;------------------------------------------------------------------------------------------
          LoadDescriptorFromROM:
000270 95c8      		lpm				;nahraj z pozicie ROM pointra do R0
000271 9209      		st		Y+,R0			;R0 uloz do buffera a zvys buffer
000272 9631      		adiw	ZH:ZL,1			;zvys ukazovatel do ROM
000273 956a      		dec		ByteCount		;pokial nie su vsetky byty
000274 f7d9      		brne	LoadDescriptorFromROM	;tak nahravaj dalej
000275 c02b      		rjmp	EndFromRAMROM		;inak skonci
         ;------------------------------------------------------------------------------------------
          LoadDescriptorFromROMZeroInsert:
0002

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -