📄 ch375ev0.lis
字号:
018C 45C0 xjmp L45
018E L52:
018E .dbline 204
018E ;
018E ; /* 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 */
018E ; CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */
018E 08E2 ldi R16,40
0190 59DF xcall _CH375_WR_CMD_PORT
0192 .dbline 205
0192 ; i = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */
0192 81DF xcall _CH375_RD_DAT_PORT
0194 402F mov R20,R16
0196 .dbline 206
0196 ; if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 异常 */
0196 0830 cpi R16,8
0198 11F0 breq L54
019A .dbline 206
019A 0FE1 ldi R16,31
019C 3DC0 xjmp L45
019E L54:
019E .dbline 207
019E ; for ( i = 0; i != 8; i ++ )
019E 4427 clr R20
01A0 09C0 xjmp L59
01A2 L56:
01A2 .dbline 208
01A2 .dbline 209
01A2 79DF xcall _CH375_RD_DAT_PORT
01A4 80E0 ldi R24,<_DATA_BUFFER
01A6 90E0 ldi R25,>_DATA_BUFFER
01A8 E42F mov R30,R20
01AA FF27 clr R31
01AC E80F add R30,R24
01AE F91F adc R31,R25
01B0 0083 std z+0,R16
01B2 .dbline 210
01B2 L57:
01B2 .dbline 207
01B2 4395 inc R20
01B4 L59:
01B4 .dbline 207
01B4 4830 cpi R20,8
01B6 A9F7 brne L56
01B8 .dbline 211
01B8 ; { /* 根据长度读取数据 */
01B8 ; DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); /* 读出数据并保存 */
01B8 ; }
01B8 ; i = DATA_BUFFER[ 6 ]; /* U盘容量数据中的每扇区字节数,大端格式 */
01B8 40910900 lds R20,_DATA_BUFFER+6
01BC .dbline 213
01BC ;
01BC ; if ( i == 0x04 )
01BC 4430 cpi R20,4
01BE 21F4 brne L61
01C0 .dbline 214
01C0 ; BlockPerSector = 1024/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是1K字节 */
01C0 80E1 ldi R24,16
01C2 80930000 sts _BlockPerSector,R24
01C6 0FC0 xjmp L62
01C8 L61:
01C8 .dbline 215
01C8 ; else if ( i == 0x08 )
01C8 4830 cpi R20,8
01CA 21F4 brne L63
01CC .dbline 216
01CC ; BlockPerSector = 2048/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是2K字节 */
01CC 80E2 ldi R24,32
01CE 80930000 sts _BlockPerSector,R24
01D2 09C0 xjmp L64
01D4 L63:
01D4 .dbline 217
01D4 ; else if ( i == 0x10 )
01D4 4031 cpi R20,16
01D6 21F4 brne L65
01D8 .dbline 218
01D8 ; BlockPerSector = 4096/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是4K字节 */
01D8 80E4 ldi R24,64
01DA 80930000 sts _BlockPerSector,R24
01DE 03C0 xjmp L66
01E0 L65:
01E0 .dbline 220
01E0 ; else
01E0 ; BlockPerSector = 512/CH375_BLOCK_SIZE; /* 默认的磁盘的物理扇区是512字节 */
01E0 88E0 ldi R24,8
01E2 80930000 sts _BlockPerSector,R24
01E6 L66:
01E6 L64:
01E6 L62:
01E6 .dbline 222
01E6 ;
01E6 ; BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盘的扇区大小 */ // 512
01E6 20900000 lds R2,_BlockPerSector
01EA 80E4 ldi R24,64
01EC 829D mul R24,R2
01EE 10920200 sts _BytePerSector+1,R1
01F2 00920100 sts _BytePerSector,R0
01F6 .dbline 225
01F6 ;
01F6 ;
01F6 ; ShowNumber(2, 0,BytePerSector);
01F6 1001 movw R2,R0
01F8 3982 std y+1,R3
01FA 2882 std y+0,R2
01FC 2227 clr R18
01FE 3327 clr R19
0200 02E0 ldi R16,2
0202 10E0 ldi R17,0
0204 0E940000 xcall _ShowNumber
0208 .dbline 227
0208 ;
0208 ; CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC ); /* 设置USB存储器的每扇区数据包总数 */
0208 0BE0 ldi R16,11
020A 1CDF xcall _CH375_WR_CMD_PORT
020C .dbline 228
020C ; CH375_WR_DAT_PORT( 0x39 );
020C 09E3 ldi R16,57
020E 2FDF xcall _CH375_WR_DAT_PORT
0210 .dbline 229
0210 ; CH375_WR_DAT_PORT( BlockPerSector ); /* 设置每扇区数据包总数 */ //512
0210 00910000 lds R16,_BlockPerSector
0214 2CDF xcall _CH375_WR_DAT_PORT
0216 .dbline 230
0216 ; return( 0 ); /* U盘已经成功初始化 */
0216 0027 clr R16
0218 .dbline -2
0218 L45:
0218 2296 adiw R28,2
021A 0E940000 xcall pop_gset1
021E .dbline 0 ; func end
021E 0895 ret
0220 .dbsym r mIntStatus 20 c
0220 .dbsym r i 20 c
0220 .dbend
0220 .dbfunc e mClearError _mClearError fV
.even
0220 _mClearError::
0220 .dbline -1
0220 .dbline 235
0220 ; }
0220 ;
0220 ; /* 清除U盘错误以便重试 */
0220 ; void mClearError( void )
0220 ; {
0220 .dbline 236
0220 ; mDelaymS( 10 ); /* 延时10mS */
0220 0AE0 ldi R16,10
0222 FDDE xcall _mDelaymS
0224 .dbline 237
0224 ; CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 检查USB存储器错误 */
0224 0AE5 ldi R16,90
0226 0EDF xcall _CH375_WR_CMD_PORT
0228 .dbline 238
0228 ; mDelaymS( 10 ); /* 延时10mS */
0228 0AE0 ldi R16,10
022A F9DE xcall _mDelaymS
022C .dbline 239
022C ; mWaitInterrupt( ); /* 等待中断并获取状态 */
022C 47DF xcall _mWaitInterrupt
022E .dbline -2
022E L67:
022E .dbline 0 ; func end
022E 0895 ret
0230 .dbend
0230 .dbfunc e mReadSector _mReadSector fc
0230 ; mBlockCount -> R22,R23
0230 ; mIntStatus -> R20
0230 ; mBufferPoint -> R10,R11
0230 ; col -> R12,R13
0230 ; j -> y+2
0230 ; mLength -> R14
0230 ; iSectorCount -> y+18
0230 ; iLbaStart -> y+14
.even
0230 _mReadSector::
0230 0E940000 xcall push_arg4
0234 0E940000 xcall push_gset5
0238 2497 sbiw R28,4
023A .dbline -1
023A .dbline 245
023A ; }
023A ;
023A ; /* 从U盘读取多个扇区的数据块到缓冲区 */
023A ; unsigned char mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )
023A ; /* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */
023A ; {
023A .dbline 248
023A ; unsigned char mIntStatus;
023A ; unsigned char *mBufferPoint;
023A ; unsigned int mBlockCount,j=0,col=0;
023A 0024 clr R0
023C 1124 clr R1
023E 1B82 std y+3,R1
0240 0A82 std y+2,R0
0242 .dbline 248
0242 CC24 clr R12
0244 DD24 clr R13
0246 .dbline 250
0246 ; unsigned char mLength;
0246 ; CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从USB存储器读数据块 */
0246 04E5 ldi R16,84
0248 FDDE xcall _CH375_WR_CMD_PORT
024A .dbline 251
024A ; CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */
024A FE01 movw R30,R28
024C 0685 ldd R16,z+14
024E 0FDF xcall _CH375_WR_DAT_PORT
0250 .dbline 252
0250 ; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
0250 88E0 ldi R24,8
0252 90E0 ldi R25,0
0254 FE01 movw R30,R28
0256 2684 ldd R2,z+14
0258 3784 ldd R3,z+15
025A 4088 ldd R4,z+16
025C 5188 ldd R5,z+17
025E 8A93 st -y,R24
0260 8101 movw R16,R2
0262 9201 movw R18,R4
0264 0E940000 xcall lsr32
0268 02DF xcall _CH375_WR_DAT_PORT
026A .dbline 253
026A ; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
026A FE01 movw R30,R28
026C 2684 ldd R2,z+14
026E 3784 ldd R3,z+15
0270 4088 ldd R4,z+16
0272 5188 ldd R5,z+17
0274 1201 movw R2,R4
0276 4424 clr R4
0278 5524 clr R5
027A 022D mov R16,R2
027C F8DE xcall _CH375_WR_DAT_PORT
027E .dbline 254
027E ; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */
027E 88E1 ldi R24,24
0280 90E0 ldi R25,0
0282 FE01 movw R30,R28
0284 2684 ldd R2,z+14
0286 3784 ldd R3,z+15
0288 4088 ldd R4,z+16
028A 5188 ldd R5,z+17
028C 8A93 st -y,R24
028E 8101 movw R16,R2
0290 9201 movw R18,R4
0292 0E940000 xcall lsr32
0296 EBDE xcall _CH375_WR_DAT_PORT
0298 .dbline 255
0298 ; CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */
0298 0A89 ldd R16,y+18
029A E9DE xcall _CH375_WR_DAT_PORT
029C .dbline 256
029C ; mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */
029C 80E0 ldi R24,<_DATA_BUFFER
029E 90E0 ldi R25,>_DATA_BUFFER
02A0 5C01 movw R10,R24
02A2 .dbline 257
02A2 20900000 lds R2,_BlockPerSector
02A6 0A88 ldd R0,y+18
02A8 029C mul R0,R2
02AA B001 movw R22,R0
02AC 48C0 xjmp L72
02AE L69:
02AE .dbline 257
02AE ; for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */
02AE .dbline 258
02AE ; mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
02AE 06DF xcall _mWaitInterrupt
02B0 402F mov R20,R16
02B2 .dbline 259
02B2 ; if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存储器读数据块,请求数据读出 */
02B2 0D31 cpi R16,29
02B4 09F0 breq X6
02B6 47C0 xjmp L71
02B8 X6:
02B8 .dbline 259
02B8 .dbline 260
02B8 ; CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */
02B8 08E2 ldi R16,40
02BA C4DE xcall _CH375_WR_CMD_PORT
02BC .dbline 261
02BC ; mLength = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */
02BC ECDE xcall _CH375_RD_DAT_PORT
02BE E02E mov R14,R16
02C0 37C0 xjmp L76
02C2 L75:
02C2 .dbline 262
02C2 ; while ( mLength ) { /* 根据长度读取数据 */
02C2 .dbline 263
02C2 ; DATA_BUFFER[mLength] = CH375_RD_DAT_PORT(); /* 读出数据并保存 */
02C2 E9DE xcall _CH375_RD_DAT_PORT
02C4 80E0 ldi R24,<_DATA_BUFFER
02C6 90E0 ldi R25,>_DATA_BUFFER
02C8 EE2D mov R30,R14
02CA FF27 clr R31
02CC E80F add R30,R24
02CE F91F adc R31,R25
02D0 0083 std z+0,R16
02D2 .dbline 264
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -