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

📄 isr.s

📁 采用Atmeag162单片机来制作的U盘程序源码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module ISR.C
	.area vector(rom, abs)
	.org 4
	jmp _usb_isr
	.area text(rom, con, rel)
	.dbfile D:\AvrUSB\ISR.C
	.dbfunc e usb_isr _usb_isr fV
;              x -> R20,R21
	.even
_usb_isr::
	xcall push_lset
	xcall push_gset1
	.dbline -1
	.dbline 30
; #include <iom162v.h>
; #include <macros.h>
; #include <stdio.h>
; #include <string.h>
; 
; #include "D12CI.h"
; #include "MAIN.h"
; #include "USB100.h"
; #include "BulkOnly.H"
; 
; void bus_reset(void);
; 
; void ep0_txdone(void);
; void ep0_rxdone(void);
; void ep1_txdone(void);
; void ep1_rxdone(void);
; void main_txdone(void);
; void main_rxdone(void);
; 
; EPPFLAGS             bEPPflags;
; extern CONTROL_XFER  ControlData;
; IO_REQUEST           ioRequest;
; extern BULK_CONTROL  Bulk_Control_r;
; extern BULK_CONTROL  Bulk_Control_w;
; extern BULK_STRUCT   Bulk_Block;
; extern unsigned char PageBuf[512];
; 
; #pragma interrupt_handler usb_isr:iv_INT0
; void usb_isr(void)
; {
	.dbline 32
;   unsigned int x;
;   bEPPflags.bits.in_isr=1;
	lds R24,_bEPPflags
	ori R24,16
	sts _bEPPflags,R24
	.dbline 33
;   x=D12_ReadInterruptRegister();
	xcall _D12_ReadInterruptRegister
	mov R20,R16
	clr R21
	.dbline 34
;   if(x!=0)
	cpi R20,0
	cpc R20,R21
	breq L2
X0:
	.dbline 35
;   {
	.dbline 36
;      if(x&D12_INT_BUSRESET)
	sbrs R20,6
	rjmp L4
	.dbline 37
;      {
	.dbline 38
;          bus_reset();
	xcall _bus_reset
	.dbline 39
;          bEPPflags.bits.bus_reset=1;
	lds R24,_bEPPflags
	ori R24,1
	sts _bEPPflags,R24
	.dbline 40
;      }
L4:
	.dbline 43
;      //if(x&D12_INT_EOT)
;      //    dma_eot();
;      if(x&D12_INT_SUSPENDCHANGE)
	sbrs R20,7
	rjmp L6
	.dbline 44
;          bEPPflags.bits.suspend=1;
	lds R24,_bEPPflags
	ori R24,2
	sts _bEPPflags,R24
L6:
	.dbline 45
;      if(x&D12_INT_ENDP0IN)
	sbrs R20,1
	rjmp L8
	.dbline 46
;          ep0_txdone();
	xcall _ep0_txdone
L8:
	.dbline 47
;      if(x&D12_INT_ENDP0OUT)
	sbrs R20,0
	rjmp L10
	.dbline 48
;          ep0_rxdone();
	xcall _ep0_rxdone
L10:
	.dbline 49
;      if(x&D12_INT_ENDP1IN)
	sbrs R20,3
	rjmp L12
	.dbline 50
;          ep1_txdone();
	xcall _ep1_txdone
L12:
	.dbline 51
;      if(x&D12_INT_ENDP1OUT)
	sbrs R20,2
	rjmp L14
	.dbline 52
;          ep1_rxdone();
	xcall _ep1_rxdone
L14:
	.dbline 53
;      if(x&D12_INT_ENDP2IN)
	sbrs R20,5
	rjmp L16
	.dbline 54
;          main_txdone();
	xcall _main_txdone
L16:
	.dbline 55
;      if(x&D12_INT_ENDP2OUT)
	sbrs R20,4
	rjmp L18
	.dbline 57
; 	  //  bEPPflags.bits.main_txdone=1;
;          main_rxdone();
	xcall _main_rxdone
L18:
	.dbline 58
;   }
L2:
	.dbline 59
;   bEPPflags.bits.in_isr=0;
	lds R24,_bEPPflags
	andi R24,239
	sts _bEPPflags,R24
	.dbline -2
	.dbline 60
; }
L1:
	xcall pop_gset1
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r x 20 i
	.dbend
	.dbfunc e bus_reset _bus_reset fV
	.even
_bus_reset::
	.dbline -1
	.dbline 62
; void bus_reset(void)
; {
	.dbline -2
	.dbline 63
; }
L20:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e ep0_rxdone _ep0_rxdone fV
;              i -> R20
;        ep_last -> R20
	.even
_ep0_rxdone::
	xcall push_gset1
	sbiw R28,2
	.dbline -1
	.dbline 65
; void ep0_rxdone(void)
; {
	.dbline 67
;   unsigned char ep_last,i;
;   ep_last=D12_ReadLastTransactionStatus(0);
	clr R16
	xcall _D12_ReadLastTransactionStatus
	mov R20,R16
	.dbline 68
;   if(ep_last&D12_SETUPPACKET)
	sbrs R16,5
	rjmp L22
	.dbline 69
;   {
	.dbline 70
;     ControlData.wLength=0;
	clr R2
	clr R3
	sts _ControlData+8+1,R3
	sts _ControlData+8,R2
	.dbline 71
;     ControlData.wCount=0;
	sts _ControlData+10+1,R3
	sts _ControlData+10,R2
	.dbline 72
;     if(D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),
	ldi R24,<_ControlData
	ldi R25,>_ControlData
	std y+1,R25
	std y+0,R24
	ldi R18,8
	clr R16
	xcall _D12_ReadEndpoint
	cpi R16,8
	breq L26
	.dbline 74
;            (unsigned char *)(&(ControlData.DeviceRequest)))!=sizeof(DEVICE_REQUEST))
;     {
	.dbline 75
;        D12_SetEndpointStatus(0,1);
	ldi R18,1
	clr R16
	xcall _D12_SetEndpointStatus
	.dbline 76
;        D12_SetEndpointStatus(1,1);
	ldi R18,1
	ldi R16,1
	xcall _D12_SetEndpointStatus
	.dbline 77
;        bEPPflags.bits.control_state=USB_IDLE;
	lds R24,_bEPPflags
	andi R24,159
	sts _bEPPflags,R24
	.dbline 78
;        return;
	xjmp L21
L26:
	.dbline 80
;     }
;     D12_AcknowledgeEndpoint(0);
	clr R16
	xcall _D12_AcknowledgeEndpoint
	.dbline 81
;     D12_AcknowledgeEndpoint(1);
	ldi R16,1
	xcall _D12_AcknowledgeEndpoint
	.dbline 82
;     ControlData.wLength=ControlData.DeviceRequest.wLength;
	lds R2,_ControlData+6
	lds R3,_ControlData+6+1
	sts _ControlData+8+1,R3
	sts _ControlData+8,R2
	.dbline 83
;     ControlData.wCount=0;
	clr R2
	clr R3
	sts _ControlData+10+1,R3
	sts _ControlData+10,R2
	.dbline 84
;     if(ControlData.DeviceRequest.bmRequestType&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
	lds R2,_ControlData
	sbrs R2,7
	rjmp L31
	.dbline 85
;     {
	.dbline 86
;        bEPPflags.bits.setup_packet=1;
	lds R24,_bEPPflags
	ori R24,4
	sts _bEPPflags,R24
	.dbline 87
;        bEPPflags.bits.control_state=USB_IDLE;
	andi R24,159
	sts _bEPPflags,R24
	.dbline 88
;     }
	xjmp L23
L31:
	.dbline 90
;     else
;     {
	.dbline 91
;       if(ControlData.DeviceRequest.wLength==0)
	lds R2,_ControlData+6
	lds R3,_ControlData+6+1
	tst R2
	brne L33
	tst R3
	brne L33
X1:
	.dbline 92
;       {
	.dbline 93
;         bEPPflags.bits.setup_packet=1;
	lds R24,_bEPPflags
	ori R24,4
	sts _bEPPflags,R24
	.dbline 94
;         bEPPflags.bits.control_state=USB_IDLE;
	andi R24,159
	sts _bEPPflags,R24
	.dbline 95
;       }
	xjmp L23
L33:
	.dbline 97
;       else
;       {
	.dbline 98
;         if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
	ldi R24,8
	ldi R25,0
	lds R2,_ControlData+6
	lds R3,_ControlData+6+1
	cp R24,R2
	cpc R25,R3
	brsh L36
	.dbline 99
;         {
	.dbline 100
;           bEPPflags.bits.control_state=USB_IDLE;
	lds R24,_bEPPflags
	andi R24,159
	sts _bEPPflags,R24
	.dbline 101
;           D12_SetEndpointStatus(0,1);
	ldi R18,1
	clr R16
	xcall _D12_SetEndpointStatus
	.dbline 102
;           D12_SetEndpointStatus(1,1);
	ldi R18,1
	ldi R16,1
	xcall _D12_SetEndpointStatus
	.dbline 103
;         }
	xjmp L23
L36:
	.dbline 105
;         else
;         {
	.dbline 106
;           bEPPflags.bits.control_state=USB_RECEIVE;
	lds R24,_bEPPflags
	andi R24,159
	ori R24,64
	sts _bEPPflags,R24
	.dbline 107
;         }
	.dbline 108
;       }
	.dbline 109
;     }
	.dbline 110
;   }
	xjmp L23
L22:
	.dbline 111
;   else if(bEPPflags.bits.control_state==USB_RECEIVE)
	lds R24,_bEPPflags
	lsr R24
	lsr R24
	lsr R24
	lsr R24
	lsr R24
	andi R24,3
	cpi R24,2
	brne L39
	.dbline 112
;   {
	.dbline 113
;     i=D12_ReadEndpoint(0,EP0_PACKET_SIZE,ControlData.dataBuffer+ControlData.wCount);
	ldi R24,<_ControlData+16
	ldi R25,>_ControlData+16
	lds R2,_ControlData+10
	lds R3,_ControlData+10+1
	add R2,R24
	adc R3,R25
	std y+1,R3
	std y+0,R2
	ldi R18,16
	clr R16
	xcall _D12_ReadEndpoint
	mov R20,R16
	.dbline 114
;     ControlData.wCount+=i;
	mov R2,R20
	clr R3
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	sts _ControlData+10+1,R5
	sts _ControlData+10,R4
	.dbline 115
;     if(i!=EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength)
	cpi R16,16
	brne L48
	lds R2,_ControlData+8
	lds R3,_ControlData+8+1
	cp R4,R2
	cpc R5,R3
	brlo L40
L48:
	.dbline 116
;     {
	.dbline 117
;        bEPPflags.bits.setup_packet=1;
	lds R24,_bEPPflags
	ori R24,4
	sts _bEPPflags,R24
	.dbline 118
;        bEPPflags.bits.control_state=USB_IDLE;
	andi R24,159
	sts _bEPPflags,R24
	.dbline 119
;     }
	.dbline 120
;   }
	xjmp L40
L39:
	.dbline 122
;   else
;   {
	.dbline 123
;     bEPPflags.bits.control_state=USB_IDLE;
	lds R24,_bEPPflags
	andi R24,159
	sts _bEPPflags,R24
	.dbline 124
;   }
L40:
L23:
	.dbline -2
	.dbline 125
; }
L21:
	adiw R28,2
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r ep_last 20 c
	.dbend
	.dbfunc e ep0_txdone _ep0_txdone fV
;              i -> R20,R21
	.even
_ep0_txdone::
	xcall push_gset1
	sbiw R28,2
	.dbline -1
	.dbline 127
; void ep0_txdone(void)
; {
	.dbline 128
;   short i=ControlData.wLength-ControlData.wCount;
	lds R2,_ControlData+10
	lds R3,_ControlData+10+1
	lds R20,_ControlData+8
	lds R21,_ControlData+8+1
	sub R20,R2
	sbc R21,R3
	.dbline 129
;   D12_ReadLastTransactionStatus(1);
	ldi R16,1
	xcall _D12_ReadLastTransactionStatus
	.dbline 130
;   if(bEPPflags.bits.control_state!=USB_TRANSMIT)
	lds R24,_bEPPflags
	lsr R24
	lsr R24
	lsr R24
	lsr R24
	lsr R24
	andi R24,3
	cpi R24,1
	breq L52
	.dbline 131
;      return;
	xjmp L49
L52:
	.dbline 132
;   if(i>=EP0_PACKET_SIZE)
	cpi R20,16
	ldi R30,0
	cpc R21,R30
	brlt L54
	.dbline 133
;   {
	.dbline 134
;      if(bEPPflags.bits.rom_state)
	lds R2,_bEPPflags
	lds R3,_bEPPflags+1
	sbrs R3,3
	rjmp L56
	.dbline 135
; 	    D12_CWriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pCData+ControlData.wCount);
	lds R2,_ControlData+14
	lds R3,_ControlData+14+1
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	std y+1,R5
	std y+0,R4
	ldi R18,16
	ldi R19,0
	ldi R16,1
	ldi R17,0
	xcall _D12_CWriteEndpoint
	xjmp L57
L56:
	.dbline 137
;      else		
;         D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData+ControlData.wCount);
	lds R2,_ControlData+12
	lds R3,_ControlData+12+1
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	std y+1,R5
	std y+0,R4
	ldi R18,16
	ldi R16,1
	xcall _D12_WriteEndpoint
L57:
	.dbline 138
;      ControlData.wCount+=EP0_PACKET_SIZE;
	lds R24,_ControlData+10
	lds R25,_ControlData+10+1
	adiw R24,16
	sts _ControlData+10+1,R25
	sts _ControlData+10,R24
	.dbline 139
;      bEPPflags.bits.control_state=USB_TRANSMIT;
	lds R24,_bEPPflags
	andi R24,159
	ori R24,32
	sts _bEPPflags,R24
	.dbline 140
;   }
	xjmp L55
L54:
	.dbline 141
;   else if(i!=0)
	cpi R20,0
	cpc R20,R21
	breq L63
X2:
	.dbline 142
;   {
	.dbline 143
;      if(bEPPflags.bits.rom_state)
	lds R2,_bEPPflags
	lds R3,_bEPPflags+1
	sbrs R3,3
	rjmp L65
	.dbline 144
; 	    D12_CWriteEndpoint(1,i,ControlData.pCData+ControlData.wCount);
	lds R2,_ControlData+14
	lds R3,_ControlData+14+1
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	std y+1,R5
	std y+0,R4
	movw R18,R20
	ldi R16,1
	ldi R17,0
	xcall _D12_CWriteEndpoint
	xjmp L66
L65:
	.dbline 146
; 	 else
;         D12_WriteEndpoint(1,i,ControlData.pData+ControlData.wCount);
	lds R2,_ControlData+12
	lds R3,_ControlData+12+1
	lds R4,_ControlData+10
	lds R5,_ControlData+10+1
	add R4,R2
	adc R5,R3
	std y+1,R5
	std y+0,R4
	mov R18,R20
	ldi R16,1
	xcall _D12_WriteEndpoint
L66:
	.dbline 147
;      ControlData.wCount+=i;
	lds R2,_ControlData+10
	lds R3,_ControlData+10+1
	add R2,R20
	adc R3,R21
	sts _ControlData+10+1,R3
	sts _ControlData+10,R2
	.dbline 148
;      bEPPflags.bits.control_state=USB_IDLE;
	lds R24,_bEPPflags
	andi R24,159
	sts _bEPPflags,R24
	.dbline 149
;   }

⌨️ 快捷键说明

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