📄 bulkonly.s
字号:
.module BulkOnly.C
.area text(rom, con, rel)
.dbfile J:\PDIUSBD12-Materials\富昌\优盘5.0\BulkOnly.C
.dbfunc e Bulk_CBWHandler _Bulk_CBWHandler fV
.even
_Bulk_CBWHandler::
sbiw R28,2
.dbline -1
.dbline 23
; #include <iom162v.h>
; #include <macros.h>
;
; #include "BulkOnly.H"
; #include "D12CI.H"
; #include "MAIN.H"
;
;
; extern CONTROL_XFER ControlData;
; extern EPPFLAGS bEPPflags;
; BULK_STRUCT Bulk_Block;
;
; extern BULK_CONTROL Bulk_Control_r;
; extern BULK_CONTROL Bulk_Control_w;
; extern unsigned char PageBuf[512];
;
; #define Bulk_CBW Bulk_Block.cbw
; #define Bulk_CSW Bulk_Block.csw
; #define CBW_bCBWCBLength Bulk_Block.cbw.dCBWDataTransferLength
; #define CSW_dCSWDataResidue Bulk_Block.csw.dCSWDataResidue
;
; void Bulk_CBWHandler( void )
; {
.dbline 24
; if(sizeof(CBW)==D12_ReadEndpoint(4,EP2_PACKET_SIZE,(unsigned char*)&Bulk_CBW))
ldi R24,<_Bulk_Block
ldi R25,>_Bulk_Block
std y+1,R25
std y+0,R24
ldi R18,64
ldi R16,4
xcall _D12_ReadEndpoint
cpi R16,31
brne L2
.dbline 25
; {
.dbline 26
; if(IsCBWValid())
xcall _IsCBWValid
tst R16
breq L4
.dbline 27
; {
.dbline 28
; RBC_Hander();
xcall _RBC_Hander
.dbline 29
; return;
xjmp L1
L4:
.dbline 31
; }
; }
L2:
.dbline 32
; Bulk_ErrorHandler(CSW_PHASE_ERROR,0);
clr R18
clr R19
ldi R16,2
xcall _Bulk_ErrorHandler
.dbline 33
; Bulk_CSWHandler();
xcall _Bulk_CSWHandler
.dbline -2
L1:
adiw R28,2
.dbline 0 ; func end
ret
.dbend
.dbfunc e Bulk_CSWHandler _Bulk_CSWHandler fV
.even
_Bulk_CSWHandler::
sbiw R28,2
.dbline -1
.dbline 36
; }
; void Bulk_CSWHandler( void )
; {
.dbline 37
; D12_WriteEndpoint(5,sizeof(CSW),(unsigned char *)&Bulk_CSW);
ldi R24,<_Bulk_Block
ldi R25,>_Bulk_Block
std y+1,R25
std y+0,R24
ldi R18,13
ldi R16,5
xcall _D12_WriteEndpoint
.dbline 38
; bEPPflags.bits.bulk_state=BULK_IDLE;
lds R24,_bEPPflags+2
andi R24,248
sts _bEPPflags+2,R24
.dbline -2
L6:
adiw R28,2
.dbline 0 ; func end
ret
.dbend
.dbfunc e Bulk_code_transmit _Bulk_code_transmit fV
; len -> R12,R13
; pRomData -> R10,R11
.even
_Bulk_code_transmit::
xcall push_gset4
movw R12,R18
movw R10,R16
sbiw R28,2
.dbline -1
.dbline 41
; }
; void Bulk_code_transmit(const unsigned char * pRomData,unsigned short len)
; {
.dbline 42
; ControlData.wCount=0;
clr R2
clr R3
sts _ControlData+10+1,R3
sts _ControlData+10,R2
.dbline 43
; ControlData.pCData=pRomData;
sts _ControlData+14+1,R11
sts _ControlData+14,R10
.dbline 44
; ControlData.wLength=len;
sts _ControlData+8+1,R13
sts _ControlData+8,R12
.dbline 45
; if(ControlData.wLength>=CBW_bCBWCBLength)
lds R4,_Bulk_Block+8+2
lds R5,_Bulk_Block+8+2+1
lds R2,_Bulk_Block+8
lds R3,_Bulk_Block+8+1
movw R6,R12
clr R8
clr R9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L12
.dbline 46
; ControlData.wLength=CBW_bCBWCBLength;
sts _ControlData+8+1,R3
sts _ControlData+8,R2
L12:
.dbline 47
; Bulk_ErrorHandler(CSW_GOOD,ControlData.wLength);
lds R18,_ControlData+8
lds R19,_ControlData+8+1
clr R16
xcall _Bulk_ErrorHandler
.dbline 48
; if(ControlData.wLength>=EP2_PACKET_SIZE)
lds R24,_ControlData+8
lds R25,_ControlData+8+1
cpi R24,64
ldi R30,0
cpc R25,R30
brlo L19
.dbline 49
; {
.dbline 50
; D12_CWriteEndpoint(5,EP2_PACKET_SIZE,ControlData.pCData);
lds R2,_ControlData+14
lds R3,_ControlData+14+1
std y+1,R3
std y+0,R2
ldi R18,64
ldi R19,0
ldi R16,5
ldi R17,0
xcall _D12_CWriteEndpoint
.dbline 51
; ControlData.wCount+=EP2_PACKET_SIZE;
lds R24,_ControlData+10
lds R25,_ControlData+10+1
subi R24,192 ; offset = 64
sbci R25,255
sts _ControlData+10+1,R25
sts _ControlData+10,R24
.dbline 52
; bEPPflags.bits.bulk_state=BULK_REQEST_TRANS;
lds R24,_bEPPflags+2
andi R24,248
ori R24,3
sts _bEPPflags+2,R24
.dbline 53
; }
xjmp L20
L19:
.dbline 55
.dbline 56
std y+1,R11
std y+0,R10
lds R18,_ControlData+8
lds R19,_ControlData+8+1
ldi R16,5
ldi R17,0
xcall _D12_CWriteEndpoint
.dbline 57
lds R2,_ControlData+8
lds R3,_ControlData+8+1
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 58
lds R24,_bEPPflags+2
andi R24,248
ori R24,2
sts _bEPPflags+2,R24
.dbline 59
L20:
.dbline -2
L8:
adiw R28,2
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r len 12 s
.dbsym r pRomData 10 pkc
.dbend
.dbfunc e IsCBWValid _IsCBWValid fc
.even
_IsCBWValid::
xcall push_gset2
.dbline -1
.dbline 62
; else
; {
; D12_CWriteEndpoint(5,ControlData.wLength,pRomData);
; ControlData.wCount+=ControlData.wLength;
; bEPPflags.bits.bulk_state=BULK_DATA_END;
; }
; }
; BOOLEAN IsCBWValid(void)
; {
.dbline 63
; if((Bulk_CBW.dCBWSignature==CBW_SIGNATURE)&&
ldi R20,85
ldi R21,83
ldi R22,66
ldi R23,67
lds R4,_Bulk_Block+2
lds R5,_Bulk_Block+2+1
lds R2,_Bulk_Block
lds R3,_Bulk_Block+1
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L30
ldi R24,1
lds R2,_Bulk_Block+13
cp R24,R2
brlo L30
ldi R24,16
lds R2,_Bulk_Block+14
cp R24,R2
brlo L30
.dbline 66
; (Bulk_CBW.bCBWLUN<=1)&&
; (Bulk_CBW.bCBWCBLength<=MAX_CDBLEN))
; return TRUE;
ldi R16,1
xjmp L29
L30:
.dbline 68
; else
; return FALSE;
clr R16
.dbline -2
L29:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbend
.dbfunc e Bulk_ErrorHandler _Bulk_ErrorHandler fV
; wByteCount -> R18,R19
; CSWStatus -> R16
.even
_Bulk_ErrorHandler::
xcall push_gset2
.dbline -1
.dbline 71
; }
; void Bulk_ErrorHandler(unsigned char CSWStatus,unsigned int wByteCount)
; {
.dbline 72
; Bulk_CSW.dCSWDataResidue=Bulk_CBW.dCBWDataTransferLength-wByteCount;
movw R2,R18
clr R4
clr R5
lds R8,_Bulk_Block+8+2
lds R9,_Bulk_Block+8+2+1
lds R6,_Bulk_Block+8
lds R7,_Bulk_Block+8+1
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
sts _Bulk_Block+8+1,R7
sts _Bulk_Block+8,R6
sts _Bulk_Block+8+2+1,R9
sts _Bulk_Block+8+2,R8
.dbline 73
; Bulk_CSW.dCSWSignature=CSW_SIGNATURE;
ldi R20,85
ldi R21,83
ldi R22,66
ldi R23,83
sts _Bulk_Block+1,R21
sts _Bulk_Block,R20
sts _Bulk_Block+2+1,R23
sts _Bulk_Block+2,R22
.dbline 74
; Bulk_CSW.bCSWStatus=CSWStatus;
sts _Bulk_Block+12,R16
.dbline -2
L34:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r wByteCount 18 i
.dbsym r CSWStatus 16 c
.dbend
.area bss(ram, con, rel)
.dbfile J:\PDIUSBD12-Materials\富昌\优盘5.0\BulkOnly.C
_Bulk_Block::
.blkb 31
.dbstruct 0 16 _GENERIC_RBC
.dbfield 0 OperationCode c
.dbfield 1 Reserved0 A[15:15]c
.dbend
.dbstruct 0 7 _INQUIRY_SPC
.dbfield 0 OperationCode i
.dbfield 2 EVPD F[0:1]
.dbfield 2 CMDDT F[1:1]
.dbfield 2 Reserved0 F[2:6]
.dbfield 3 PageCode c
.dbfield 4 Reserved1 c
.dbfield 5 AllocationLength c
.dbfield 6 Control c
.dbend
.dbstruct 0 6 _MODE_SENSE_SPC
.dbfield 0 OperationCode c
.dbfield 1 Reserved0 F[0:3]
.dbfield 1 DisableBlockDescriptor F[3:1]
.dbfield 1 Reserved1 F[4:4]
.dbfield 1 PageCode F[8:6]
.dbfield 1 PageControl F[14:2]
.dbfield 3 Reserved2 c
.dbfield 4 ParameterLength c
.dbfield 5 Control c
.dbend
.dbstruct 0 10 _READ10_RBC
.dbfield 0 OperationCode c
.dbfield 1 Reserved0 c
.dbfield 2 LogicalBlockAddress A[4:4]c
.dbfield 6 Reserved1 c
.dbfield 7 TransferLength A[2:2]c
.dbfield 9 Control c
.dbend
.dbstruct 0 10 _READ_CAPACITY_RBC
.dbfield 0 OperationCode c
.dbfield 1 Reserved0 A[8:8]c
.dbfield 9 Control c
.dbend
.dbstruct 0 11 _READ_FORMAT_CAPACITY_RBC
.dbfield 0 OperationCode c
.dbfield 1 Reserved0 A[5:5]c
.dbfield 6 AllocationLength A[2:2]c
.dbfield 8 Reserved1 A[3:3]c
.dbend
.dbstruct 0 7 _TEST_UNIT_SPC
.dbfield 0 OperationCode c
.dbfield 1 Reserved0 A[4:4]c
.dbfield 5 Control i
.dbend
.dbstruct 0 11 _VERIFY_RBC
.dbfield 0 OperationCode i
.dbfield 2 Reserved0 c
.dbfield 3 LogicalBlockAddress A[4:4]c
.dbfield 7 Reserved1 c
.dbfield 8 TransferLength A[2:2]c
.dbfield 10 Control c
.dbend
.dbstruct 0 10 _WRITE10_RBC
.dbfield 0 OperationCode c
.dbfield 1 Reserved0 F[0:3]
.dbfield 1 FUA F[3:1]
.dbfield 1 Reserved1 F[4:4]
.dbfield 2 LogicalBlockAddress A[4:4]c
.dbfield 6 Reserved2 c
.dbfield 7 TransferLength A[2:2]c
.dbfield 9 Control c
.dbend
.dbstruct 0 7 _MEDIA_REMOVAL_SPC
.dbfield 0 OperationCode c
.dbfield 1 Reserved0 A[3:3]c
.dbfield 4 Prevent F[0:2]
.dbfield 4 Reserved1 F[2:6]
.dbfield 5 Control i
.dbend
.dbunion 0 16 _CDB_RBC
.dbfield 0 RbcCdb_Generic S[_GENERIC_RBC]
.dbfield 0 SpcCdb_Inquiry S[_INQUIRY_SPC]
.dbfield 0 SpcCdb_ModeSense S[_MODE_SENSE_SPC]
.dbfield 0 RbcCdb_Read10 S[_READ10_RBC]
.dbfield 0 RbcCdb_ReadCapacity S[_READ_CAPACITY_RBC]
.dbfield 0 RbcCdb_ReadFormatCapacity S[_READ_FORMAT_CAPACITY_RBC]
.dbfield 0 SpcCdb_TestUnit S[_TEST_UNIT_SPC]
.dbfield 0 RbcCdb_Verify S[_VERIFY_RBC]
.dbfield 0 RbcCdb_Write10 S[_WRITE10_RBC]
.dbfield 0 SpcCdb_Removeal S[_MEDIA_REMOVAL_SPC]
.dbend
.dbstruct 0 31 _COMMAND_BLOCK_WRAPPER
.dbfield 0 dCBWSignature l
.dbfield 4 dCBWTag l
.dbfield 8 dCBWDataTransferLength l
.dbfield 12 bmCBWFlags c
.dbfield 13 bCBWLUN c
.dbfield 14 bCBWCBLength c
.dbfield 15 CBWCB S[_CDB_RBC]
.dbend
.dbstruct 0 13 _COMMAND_STATUS_WRAPPER
.dbfield 0 dCSWSignature l
.dbfield 4 dCSWTag l
.dbfield 8 dCSWDataResidue l
.dbfield 12 bCSWStatus c
.dbend
.dbunion 0 31 _BULK_STRUCT
.dbfield 0 cbw S[_COMMAND_BLOCK_WRAPPER]
.dbfield 0 csw S[_COMMAND_STATUS_WRAPPER]
.dbend
.dbsym e Bulk_Block _Bulk_Block S[_BULK_STRUCT]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -