123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- USB_INTR_VECTOR:
- push YL
- in YL, SREG
- push YL
- push YH
- waitForJ:
- inc YL
- sbis USBIN, USBMINUS
- brne waitForJ
- waitForK:
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- lds YL, usbSofCount
- inc YL
- sts usbSofCount, YL
- USB_SOF_HOOK
- rjmp sofError
- foundK:
- push bitcnt
- lds YL, usbInputBufOffset
- clr YH
- subi YL, lo8(-(usbRxBuf))
- sbci YH, hi8(-(usbRxBuf))
- push shift
- ldi shift,0x40
- nop2
- ldi bitcnt, 5
- sbis USBIN, USBMINUS
- rjmp haveTwoBitsK
- pop shift
- pop bitcnt
- rjmp waitForK
- haveTwoBitsK:
- push x1
- push x2
- push x3
- ldi leap2, 0x55
- push x4
- ldi leap, 0x55
- push cnt
- ldi cnt, USB_BUFSIZE
- ldi x2, 1<<USBPLUS
- bit0:
- in x1, USBIN
- andi x1, USBMASK
- rjmp handleBit
- b6checkUnstuff:
- dec bitcnt
- breq unstuff6
- bit7:
- subi cnt, 1
- brcs overflow
- in x1, USBIN
- andi x1, USBMASK
- cpse x1, x2
- rjmp b7handle0
- sec
- ror shift
- st y+, shift
- ldi shift, 0x40
- subi leap, 0x55
- brcc nextInst
- dec bitcnt
- brne bit0
- ldi x1, 1
- in bitcnt, USBIN
- rjmp unstuff
- b7handle0:
- mov x2,x1
- ldi bitcnt, 6
- lsr shift
- st y+, shift
- ldi shift, 0x40
- subi leap, 0x55
- brcs bit0
- rjmp bit0
- unstuff6:
- ldi x1,0xFF
- in bitcnt, USBIN
- nop
- unstuff:
- mov x2,bitcnt
- subi leap2, 0x55
- brcs nextInst
- sbci leap2,0
- ldi bitcnt,6
- andi x2, USBMASK
- cpi x1,0
- brmi bit7
- breq bitloop
- nop
- in x1, USBIN
- andi x1, USBMASK
- rjmp handleBit
- bitloop:
- in x1, USBIN
- andi x1, USBMASK
- breq se0
- handleBit:
- cpse x1, x2
- rjmp handle0
- sec
- ror shift
- brcs b6checkUnstuff
- nop2
- dec bitcnt
- brne bitloop
- ldi x1,0
- in bitcnt, USBIN
- rjmp unstuff
- handle0:
- mov x2, x1
- ldi bitcnt, 6
- lsr shift
- brcs bit7
- nop
- rjmp bitloop
-
- macro POP_STANDARD
- pop cnt
- pop x4
- pop x3
- pop x2
- pop x1
- pop shift
- pop bitcnt
- endm
- macro POP_RETI
- pop YH
- pop YL
- out SREG, YL
- pop YL
- endm
- bitstuffN:
- eor x1, x4
- ldi x2, 0
- nop2
- out USBOUT, x1
- rjmp didStuffN
-
- bitstuff7:
- eor x1, x4
- ldi x2, 0
- rol shift
- nop2
- rjmp didStuff7
- sendNakAndReti:
- ldi x3, USBPID_NAK
- rjmp sendX3AndReti
- sendAckAndReti:
- ldi cnt, USBPID_ACK
- sendCntAndReti:
- mov x3, cnt
- sendX3AndReti:
- ldi YL, 20
- ldi YH, 0
- ldi cnt, 2
- usbSendAndReti:
- in x2, USBDDR
- ori x2, USBMASK
- sbi USBOUT, USBMINUS
- in x1, USBOUT
- out USBDDR, x2
- ldi x4, USBMASK
- ldi shift, 0x80
- txByteLoop:
- ldi bitcnt, 0x49
- txBitLoop:
- sbrs shift, 0
- eor x1, x4
- out USBOUT, x1
- ror shift
- ror x2
- didStuffN:
- nop2
- nop
- cpi x2, 0xfc
- brcc bitstuffN
- lsr bitcnt
- brcc txBitLoop
- brne txBitLoop
- sbrs shift, 0
- eor x1, x4
- didStuff7:
- out USBOUT, x1
- ror shift
- ror x2
- nop
- cpi x2, 0xfc
- brcc bitstuff7
- ld shift, y+
- dec cnt
- brne txByteLoop
- cbr x1, USBMASK
- lds x2, usbNewDeviceAddr
- lsl x2
- out USBOUT, x1
- subi YL, 20 + 2
- sbci YH, 0
- breq skipAddrAssign
- sts usbDeviceAddr, x2
- skipAddrAssign:
- ldi x2, 1<<USB_INTR_PENDING_BIT
- USB_STORE_PENDING(x2)
- ori x1, USBIDLE
- in x2, USBDDR
- cbr x2, USBMASK
- mov x3, x1
- cbr x3, USBMASK
- ldi x4, 5
- se0Delay:
- dec x4
- brne se0Delay
- out USBOUT, x1
- out USBDDR, x2
- out USBOUT, x3
- rjmp doReturn
|