📄 urw.lst
字号:
015C 9508 RET
_mInitDisk:
mIntStatus --> R20
i --> R20
015D 940E06FB CALL push_gset1
015F 9722 SBIW R28,2
(0180) } /* CH375出错,例如芯片型号错或者处于串口方式或者不支持 */
(0181) }
(0182)
(0183) /* 初始化磁盘 */
(0184) unsigned char mInitDisk( )
(0185) {
(0186) unsigned char mIntStatus, i;
(0187) CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */
0160 E202 LDI R16,0x22
0161 DF77 RCALL _CH375_WR_CMD_PORT
(0188) mIntStatus = CH375_RD_DAT_PORT( ); //获取中断状态
0162 DF9F RCALL _CH375_RD_DAT_PORT
0163 2F40 MOV R20,R16
(0189) if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB设备断开 */
0164 3106 CPI R16,0x16
0165 F409 BNE 0x0167
0166 C05C RJMP 0x01C3
(0190) CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */
0167 E501 LDI R16,0x51
0168 DF70 RCALL _CH375_WR_CMD_PORT
(0191) mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
0169 DFAB RCALL _mWaitInterrupt
016A 2F40 MOV R20,R16
(0192) if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */
016B 3104 CPI R16,0x14
016C F009 BEQ 0x016E
016D C055 RJMP 0x01C3
(0193) CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */
016E E503 LDI R16,0x53
016F DF69 RCALL _CH375_WR_CMD_PORT
(0194) mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
0170 DFA4 RCALL _mWaitInterrupt
0171 2F40 MOV R20,R16
(0195) if ( mIntStatus != USB_INT_SUCCESS )
0172 3104 CPI R16,0x14
0173 F031 BEQ 0x017A
(0196) { /* 出错重试 */
(0197) mDelaymS( 200 );
0174 EC08 LDI R16,0xC8
0175 DF50 RCALL _mDelaymS
(0198) CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */
0176 E503 LDI R16,0x53
0177 DF61 RCALL _CH375_WR_CMD_PORT
(0199) mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
0178 DF9C RCALL _mWaitInterrupt
0179 2F40 MOV R20,R16
(0200) }
(0201) if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */
017A 3144 CPI R20,0x14
017B F011 BEQ 0x017E
017C 2F04 MOV R16,R20
017D C045 RJMP 0x01C3
(0202)
(0203) /* 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 */
(0204) CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */
017E E208 LDI R16,0x28
017F DF59 RCALL _CH375_WR_CMD_PORT
(0205) i = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */
0180 DF81 RCALL _CH375_RD_DAT_PORT
0181 2F40 MOV R20,R16
(0206) if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 异常 */
0182 3008 CPI R16,0x8
0183 F011 BEQ 0x0186
0184 E10F LDI R16,0x1F
0185 C03D RJMP 0x01C3
(0207) for ( i = 0; i != 8; i ++ )
0186 2744 CLR R20
0187 C009 RJMP 0x0191
(0208) { /* 根据长度读取数据 */
(0209) DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); /* 读出数据并保存 */
0188 DF79 RCALL _CH375_RD_DAT_PORT
0189 EA83 LDI R24,0xA3
018A E091 LDI R25,1
018B 2FE4 MOV R30,R20
018C 27FF CLR R31
018D 0FE8 ADD R30,R24
018E 1FF9 ADC R31,R25
018F 8300 STD Z+0,R16
0190 9543 INC R20
0191 3048 CPI R20,0x8
0192 F7A9 BNE 0x0188
(0210) }
(0211) i = DATA_BUFFER[ 6 ]; /* U盘容量数据中的每扇区字节数,大端格式 */
0193 914001A9 LDS R20,0x1A9
(0212)
(0213) if ( i == 0x04 )
0195 3044 CPI R20,4
0196 F421 BNE 0x019B
(0214) BlockPerSector = 1024/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是1K字节 */
0197 E180 LDI R24,0x10
0198 938001A0 STS BlockPerSector,R24
019A C00F RJMP 0x01AA
(0215) else if ( i == 0x08 )
019B 3048 CPI R20,0x8
019C F421 BNE 0x01A1
(0216) BlockPerSector = 2048/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是2K字节 */
019D E280 LDI R24,0x20
019E 938001A0 STS BlockPerSector,R24
01A0 C009 RJMP 0x01AA
(0217) else if ( i == 0x10 )
01A1 3140 CPI R20,0x10
01A2 F421 BNE 0x01A7
(0218) BlockPerSector = 4096/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是4K字节 */
01A3 E480 LDI R24,0x40
01A4 938001A0 STS BlockPerSector,R24
01A6 C003 RJMP 0x01AA
(0219) else
(0220) BlockPerSector = 512/CH375_BLOCK_SIZE; /* 默认的磁盘的物理扇区是512字节 */
01A7 E088 LDI R24,0x8
01A8 938001A0 STS BlockPerSector,R24
(0221)
(0222) BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盘的扇区大小 */ // 512
01AA 902001A0 LDS R2,BlockPerSector
01AC E480 LDI R24,0x40
01AD 9D82 MUL R24,R2
01AE 921001A2 STS BytePerSector+1,R1
01B0 920001A1 STS BytePerSector,R0
(0223)
(0224)
(0225) ShowNumber(2, 0,BytePerSector);
01B2 0110 MOVW R2,R0
01B3 8239 STD Y+1,R3
01B4 8228 STD Y+0,R2
01B5 2722 CLR R18
01B6 2733 CLR R19
01B7 E002 LDI R16,2
01B8 E010 LDI R17,0
01B9 940E059A CALL _ShowNumber
(0226)
(0227) CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC ); /* 设置USB存储器的每扇区数据包总数 */
01BB E00B LDI R16,0xB
01BC DF1C RCALL _CH375_WR_CMD_PORT
(0228) CH375_WR_DAT_PORT( 0x39 );
01BD E309 LDI R16,0x39
01BE DF2F RCALL _CH375_WR_DAT_PORT
(0229) CH375_WR_DAT_PORT( BlockPerSector ); /* 设置每扇区数据包总数 */ //512
01BF 910001A0 LDS R16,BlockPerSector
01C1 DF2C RCALL _CH375_WR_DAT_PORT
(0230) return( 0 ); /* U盘已经成功初始化 */
01C2 2700 CLR R16
01C3 9622 ADIW R28,2
01C4 940E06FE CALL pop_gset1
01C6 9508 RET
(0231) }
(0232)
(0233) /* 清除U盘错误以便重试 */
(0234) void mClearError( void )
(0235) {
(0236) mDelaymS( 10 ); /* 延时10mS */
_mClearError:
01C7 E00A LDI R16,0xA
01C8 DEFD RCALL _mDelaymS
(0237) CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 检查USB存储器错误 */
01C9 E50A LDI R16,0x5A
01CA DF0E RCALL _CH375_WR_CMD_PORT
(0238) mDelaymS( 10 ); /* 延时10mS */
01CB E00A LDI R16,0xA
01CC DEF9 RCALL _mDelaymS
(0239) mWaitInterrupt( ); /* 等待中断并获取状态 */
01CD DF47 RCALL _mWaitInterrupt
01CE 9508 RET
_mReadSector:
mBlockCount --> R22
mIntStatus --> R20
mBufferPoint --> R10
col --> R12
j --> Y+2
mLength --> R14
iSectorCount --> Y+18
iLbaStart --> Y+14
01CF 940E0655 CALL push_arg4
01D1 940E06F3 CALL push_gset5
01D3 9724 SBIW R28,4
(0240) }
(0241)
(0242) /* 从U盘读取多个扇区的数据块到缓冲区 */
(0243) unsigned char mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )
(0244) /* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */
(0245) {
(0246) unsigned char mIntStatus;
(0247) unsigned char *mBufferPoint;
(0248) unsigned int mBlockCount,j=0,col=0;
01D4 2400 CLR R0
01D5 2411 CLR R1
01D6 821B STD Y+3,R1
01D7 820A STD Y+2,R0
01D8 24CC CLR R12
01D9 24DD CLR R13
(0249) unsigned char mLength;
(0250) CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从USB存储器读数据块 */
01DA E504 LDI R16,0x54
01DB DEFD RCALL _CH375_WR_CMD_PORT
(0251) CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */
01DC 01FE MOVW R30,R28
01DD 8506 LDD R16,Z+14
01DE DF0F RCALL _CH375_WR_DAT_PORT
(0252) CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
01DF E088 LDI R24,0x8
01E0 E090 LDI R25,0
01E1 01FE MOVW R30,R28
01E2 8426 LDD R2,Z+14
01E3 8437 LDD R3,Z+15
01E4 8840 LDD R4,Z+16
01E5 8851 LDD R5,Z+17
01E6 938A ST R24,-Y
01E7 0181 MOVW R16,R2
01E8 0192 MOVW R18,R4
01E9 940E0712 CALL lsr32
01EB DF02 RCALL _CH375_WR_DAT_PORT
(0253) CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
01EC 01FE MOVW R30,R28
01ED 8426 LDD R2,Z+14
01EE 8437 LDD R3,Z+15
01EF 8840 LDD R4,Z+16
01F0 8851 LDD R5,Z+17
01F1 0112 MOVW R2,R4
01F2 2444 CLR R4
01F3 2455 CLR R5
01F4 2D02 MOV R16,R2
01F5 DEF8 RCALL _CH375_WR_DAT_PORT
(0254) CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */
01F6 E188 LDI R24,0x18
01F7 E090 LDI R25,0
01F8 01FE MOVW R30,R28
01F9 8426 LDD R2,Z+14
01FA 8437 LDD R3,Z+15
01FB 8840 LDD R4,Z+16
01FC 8851 LDD R5,Z+17
01FD 938A ST R24,-Y
01FE 0181 MOVW R16,R2
01FF 0192 MOVW R18,R4
0200 940E0712 CALL lsr32
0202 DEEB RCALL _CH375_WR_DAT_PORT
(0255) CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */
0203 890A LDD R16,Y+18
0204 DEE9 RCALL _CH375_WR_DAT_PORT
(0256) mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */
0205 EA83 LDI R24,0xA3
0206 E091 LDI R25,1
0207 015C MOVW R10,R24
(0257) for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */
0208 902001A0 LDS R2,BlockPerSector
020A 880A LDD R0,Y+18
020B 9C02 MUL R0,R2
020C 01B0 MOVW R22,R0
020D C048 RJMP 0x0256
(0258) mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
020E DF06 RCALL _mWaitInterrupt
020F 2F40 MOV R20,R16
(0259) if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存储器读数据块,请求数据读出 */
0210 310D CPI R16,0x1D
0211 F009 BEQ 0x0213
0212 C047 RJMP 0x025A
(0260) CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */
0213 E208 LDI R16,0x28
0214 DEC4 RCALL _CH375_WR_CMD_PORT
(0261) mLength = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */
0215 DEEC RCALL _CH375_RD_DAT_PORT
0216 2EE0 MOV R14,R16
0217 C037 RJMP 0x024F
(0262) while ( mLength ) { /* 根据长度读取数据 */
(0263) DATA_BUFFER[mLength] = CH375_RD_DAT_PORT(); /* 读出数据并保存 */
0218 DEE9 RCALL _CH375_RD_DAT_PORT
0219 EA83 LDI R24,0xA3
021A E091 LDI R25,1
021B 2DEE MOV R30,R14
021C 27FF CLR R31
021D 0FE8 ADD R30,R24
021E 1FF9 ADC R31,R25
021F 8300 STD Z+0,R16
(0264) if( 160+col < 230 )
0220 01C6 MOVW R24,R12
0221 5680 SUBI R24,0x60
0222 4F9F SBCI R25,0xFF
0223 3E86 CPI R24,0xE6
0224 E0E0 LDI R30,0
0225 079E CPC R25,R30
0226 F520 BCC 0x024B
(0265) {
(0266) ShowNumber(j,160+col, DATA_BUFFER[mLength]); //显示
0227 EA83 LDI R24,0xA3
0228 E091 LDI R25,1
0229 2DEE MOV R30,R14
022A 27FF CLR R31
022B 0FE8 ADD R30,R24
022C 1FF9 ADC R31,R25
022D 8020 LDD R2,Z+0
022E 2433 CLR R3
022F 8239 STD Y+1,R3
0230 8228 STD Y+0,R2
0231 0196 MOVW R18,R12
0232 5620 SUBI R18,0x60
0233 4F3F SBCI R19,0xFF
0234 810A LDD R16,Y+2
0235 811B LDD R17,Y+3
0236 940E059A CALL _ShowNumber
(0267) j+=4;
0238 818A LDD R24,Y+2
0239 819B LDD R25,Y+3
023A 9604 ADIW R24,4
023B 839B STD Y+3,R25
023C 838A STD Y+2,R24
(0268) if(j>37)
023D E285 LDI R24,0x25
023E E090 LDI R25,0
023F 800A LDD R0,Y+2
0240 801B LDD R1,Y+3
0241 1580 CP R24,R0
0242 0591 CPC R25,R1
0243 F438 BCC 0x024B
(0269) {
(0270) j=0;
0244 2400 CLR R0
0245 2411 CLR R1
0246 821B STD Y+3,R1
0247 820A STD Y+2,R0
(0271) col+=16;
0248 01C6 MOVW R24,R12
0249 9640 ADIW R24,0x10
024A 016C MOVW R12,R24
(0272) }
(0273) }
(0274) mLength--;
024B 94EA DEC R14
(0275) mBufferPoint++;
024C 01C5 MOVW R24,R10
024D 9601 ADIW R24,1
024E 015C MOVW R10,R24
024F 20EE TST R14
0250 F009 BEQ 0x0252
0251 CFC6 RJMP 0x0218
(0276) }
(0277) CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */
0252 E505 LDI R16,0x55
0253 DE85 RCALL _CH375_WR_CMD_PORT
0254 5061 SUBI R22,1
0255 4070 SBCI R23,0
0256 3060 CPI R22,0
0257 0767 CPC R22,R23
0258 F009 BEQ 0x025A
0259 CFB4 RJMP 0x020E
(0278) }
(0279) else break; /* 返回错误状态 */
(0280) }
(0281) if ( mBlockCount == 0 ) {
025A 3060 CPI R22,0
025B 0767 CPC R22,R23
025C F431 BNE 0x0263
(0282) mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
025D DEB7 RCALL _mWaitInterrupt
025E 2F40 MOV R20,R16
(0283) if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */
025F 3104 CPI R16,0x14
0260 F411 BNE 0x0263
0261 2700 CLR R16
0262 C002 RJMP 0x0265
(0284) }
(0285) // if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* U盘断开 */
(0286) mClearError( ); /* 清除U盘错误以便重试 */
0263 DF63 RCALL _mClearError
(0287) return( mIntStatus ); /* 操作失败 */
0264 2F04 MOV R16,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -