📄 usb90s23x3.lst
字号:
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 + -