📄 ch375ev0.s
字号:
; if ( i == 0x04 )
cpi R20,4
brne L61
.dbline 214
; BlockPerSector = 1024/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是1K字节 */
ldi R24,16
sts _BlockPerSector,R24
xjmp L62
L61:
.dbline 215
; else if ( i == 0x08 )
cpi R20,8
brne L63
.dbline 216
; BlockPerSector = 2048/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是2K字节 */
ldi R24,32
sts _BlockPerSector,R24
xjmp L64
L63:
.dbline 217
; else if ( i == 0x10 )
cpi R20,16
brne L65
.dbline 218
; BlockPerSector = 4096/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是4K字节 */
ldi R24,64
sts _BlockPerSector,R24
xjmp L66
L65:
.dbline 220
; else
; BlockPerSector = 512/CH375_BLOCK_SIZE; /* 默认的磁盘的物理扇区是512字节 */
ldi R24,8
sts _BlockPerSector,R24
L66:
L64:
L62:
.dbline 222
;
; BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盘的扇区大小 */ // 512
lds R2,_BlockPerSector
ldi R24,64
mul R24,R2
sts _BytePerSector+1,R1
sts _BytePerSector,R0
.dbline 225
;
;
; ShowNumber(2, 0,BytePerSector);
movw R2,R0
std y+1,R3
std y+0,R2
clr R18
clr R19
ldi R16,2
ldi R17,0
xcall _ShowNumber
.dbline 227
;
; CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC ); /* 设置USB存储器的每扇区数据包总数 */
ldi R16,11
xcall _CH375_WR_CMD_PORT
.dbline 228
; CH375_WR_DAT_PORT( 0x39 );
ldi R16,57
xcall _CH375_WR_DAT_PORT
.dbline 229
; CH375_WR_DAT_PORT( BlockPerSector ); /* 设置每扇区数据包总数 */ //512
lds R16,_BlockPerSector
xcall _CH375_WR_DAT_PORT
.dbline 230
; return( 0 ); /* U盘已经成功初始化 */
clr R16
.dbline -2
L45:
adiw R28,2
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r mIntStatus 20 c
.dbsym r i 20 c
.dbend
.dbfunc e mClearError _mClearError fV
.even
_mClearError::
.dbline -1
.dbline 235
; }
;
; /* 清除U盘错误以便重试 */
; void mClearError( void )
; {
.dbline 236
; mDelaymS( 10 ); /* 延时10mS */
ldi R16,10
xcall _mDelaymS
.dbline 237
; CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 检查USB存储器错误 */
ldi R16,90
xcall _CH375_WR_CMD_PORT
.dbline 238
; mDelaymS( 10 ); /* 延时10mS */
ldi R16,10
xcall _mDelaymS
.dbline 239
; mWaitInterrupt( ); /* 等待中断并获取状态 */
xcall _mWaitInterrupt
.dbline -2
L67:
.dbline 0 ; func end
ret
.dbend
.dbfunc e mReadSector _mReadSector fc
; mBlockCount -> R22,R23
; mIntStatus -> R20
; mBufferPoint -> R10,R11
; col -> R12,R13
; j -> y+2
; mLength -> R14
; iSectorCount -> y+18
; iLbaStart -> y+14
.even
_mReadSector::
xcall push_arg4
xcall push_gset5
sbiw R28,4
.dbline -1
.dbline 245
; }
;
; /* 从U盘读取多个扇区的数据块到缓冲区 */
; unsigned char mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )
; /* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */
; {
.dbline 248
; unsigned char mIntStatus;
; unsigned char *mBufferPoint;
; unsigned int mBlockCount,j=0,col=0;
clr R0
clr R1
std y+3,R1
std y+2,R0
.dbline 248
clr R12
clr R13
.dbline 250
; unsigned char mLength;
; CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从USB存储器读数据块 */
ldi R16,84
xcall _CH375_WR_CMD_PORT
.dbline 251
; CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */
movw R30,R28
ldd R16,z+14
xcall _CH375_WR_DAT_PORT
.dbline 252
; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
xcall _CH375_WR_DAT_PORT
.dbline 253
; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
movw R30,R28
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
movw R2,R4
clr R4
clr R5
mov R16,R2
xcall _CH375_WR_DAT_PORT
.dbline 254
; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
xcall _CH375_WR_DAT_PORT
.dbline 255
; CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */
ldd R16,y+18
xcall _CH375_WR_DAT_PORT
.dbline 256
; mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */
ldi R24,<_DATA_BUFFER
ldi R25,>_DATA_BUFFER
movw R10,R24
.dbline 257
lds R2,_BlockPerSector
ldd R0,y+18
mul R0,R2
movw R22,R0
xjmp L72
L69:
.dbline 257
; for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */
.dbline 258
; mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
xcall _mWaitInterrupt
mov R20,R16
.dbline 259
; if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存储器读数据块,请求数据读出 */
cpi R16,29
breq X6
xjmp L71
X6:
.dbline 259
.dbline 260
; CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */
ldi R16,40
xcall _CH375_WR_CMD_PORT
.dbline 261
; mLength = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */
xcall _CH375_RD_DAT_PORT
mov R14,R16
xjmp L76
L75:
.dbline 262
; while ( mLength ) { /* 根据长度读取数据 */
.dbline 263
; DATA_BUFFER[mLength] = CH375_RD_DAT_PORT(); /* 读出数据并保存 */
xcall _CH375_RD_DAT_PORT
ldi R24,<_DATA_BUFFER
ldi R25,>_DATA_BUFFER
mov R30,R14
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 264
; if( 160+col < 230 )
movw R24,R12
subi R24,96 ; offset = 160
sbci R25,255
cpi R24,230
ldi R30,0
cpc R25,R30
brsh L78
.dbline 265
; {
.dbline 266
; ShowNumber(j,160+col, DATA_BUFFER[mLength]); //显示
ldi R24,<_DATA_BUFFER
ldi R25,>_DATA_BUFFER
mov R30,R14
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
std y+1,R3
std y+0,R2
movw R18,R12
subi R18,96 ; offset = 160
sbci R19,255
ldd R16,y+2
ldd R17,y+3
xcall _ShowNumber
.dbline 267
; j+=4;
ldd R24,y+2
ldd R25,y+3
adiw R24,4
std y+3,R25
std y+2,R24
.dbline 268
; if(j>37)
ldi R24,37
ldi R25,0
ldd R0,y+2
ldd R1,y+3
cp R24,R0
cpc R25,R1
brsh L80
.dbline 269
; {
.dbline 270
; j=0;
clr R0
clr R1
std y+3,R1
std y+2,R0
.dbline 271
; col+=16;
movw R24,R12
adiw R24,16
movw R12,R24
.dbline 272
; }
L80:
.dbline 273
; }
L78:
.dbline 274
dec R14
.dbline 275
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 276
L76:
.dbline 262
tst R14
breq X7
xjmp L75
X7:
.dbline 277
; mLength--;
; mBufferPoint++;
; }
; CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */
ldi R16,85
xcall _CH375_WR_CMD_PORT
.dbline 278
; }
.dbline 279
; else break; /* 返回错误状态 */
L74:
.dbline 280
L70:
.dbline 257
subi R22,1
sbci R23,0
L72:
.dbline 257
cpi R22,0
cpc R22,R23
breq X8
xjmp L69
X8:
X4:
L71:
.dbline 281
; }
; if ( mBlockCount == 0 ) {
cpi R22,0
cpc R22,R23
brne L82
X5:
.dbline 281
.dbline 282
; mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
xcall _mWaitInterrupt
mov R20,R16
.dbline 283
; if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */
cpi R16,20
brne L84
.dbline 283
clr R16
xjmp L68
L84:
.dbline 284
; }
L82:
.dbline 286
; // if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* U盘断开 */
; mClearError( ); /* 清除U盘错误以便重试 */
xcall _mClearError
.dbline 287
; return( mIntStatus ); /* 操作失败 */
mov R16,R20
.dbline -2
L68:
adiw R28,4
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r mBlockCount 22 i
.dbsym r mIntStatus 20 c
.dbsym r mBufferPoint 10 pc
.dbsym r col 12 i
.dbsym l j 2 i
.dbsym r mLength 14 c
.dbsym l iSectorCount 18 c
.dbsym l iLbaStart 14 l
.dbend
.dbfunc e mWriteSector _mWriteSector fc
; col -> R22,R23
; j -> R22,R23
; mBlockCount -> R22,R23
; mIntStatus -> R20
; mBufferPoint -> R10,R11
; mLength -> R12
; iSectorCount -> y+12
; iLbaStart -> y+8
.even
_mWriteSector::
xcall push_arg4
xcall push_gset4
.dbline -1
.dbline 293
; }
;
; /* 将缓冲区中的多个扇区的数据块写入U盘 */
; unsigned char mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount )
; /* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */
; {
.dbline 296
; unsigned char mIntStatus;
; unsigned char *mBufferPoint;
; unsigned int mBlockCount,j=0,col=0;
clr R22
clr R23
.dbline 296
.dbline 298
; unsigned char mLength;
; CH375_WR_CMD_PORT( CMD_DISK_WRITE ); /* 向USB存储器写数据块 */
ldi R16,86
xcall _CH375_WR_CMD_PORT
.dbline 299
; CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */
movw R30,R28
ldd R16,z+8
xcall _CH375_WR_DAT_PORT
.dbline 300
; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
xcall _CH375_WR_DAT_PORT
.dbline 301
; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
movw R2,R4
clr R4
clr R5
mov R16,R2
xcall _CH375_WR_DAT_PORT
.dbline 302
; CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
xcall _CH375_WR_DAT_PORT
.dbline 303
; CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */
ldd R16,y+12
xcall _CH375_WR_DAT_PORT
.dbline 304
; mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */
ldi R24,<_DATA_BUFFER
ldi R25,>_DATA_BUFFER
movw R10,R24
.dbline 305
lds R2,_BlockPerSector
ldd R0,y+12
mul R0,R2
movw R22,R0
xjmp L90
L87:
.dbline 305
; for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */
.dbline 306
; mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
xcall _mWaitInterrupt
mov R20,R16
.dbline 307
; if ( mIntStatus == USB_INT_DISK_WRITE ) { /* USB存储器写数据块,请求数据写入 */
cpi R16,30
brne L89
.dbline 307
.dbline 308
; CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375缓冲区写入数据块 */
ldi R16,43
xcall _CH375_WR_CMD_PORT
.dbline 309
; mLength = CH375_BLOCK_SIZE;
ldi R24,64
mov R12,R24
.dbline 310
; CH375_WR_DAT_PORT( mLength ); /* 后续数据的长度 */
mov R16,R24
xcall _CH375_WR_DAT_PORT
xjmp L94
L93:
.dbline 311
.dbline 312
ldi R24,<_DATA_BUFFER
ldi R25,>_DATA_BUFFER
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _CH375_WR_DAT_PORT
.dbline 323
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 324
dec R12
.dbline 325
L94:
.dbline 311
; while ( mLength ) { //根据长度写入数据
tst R12
brne L93
.dbline 330
; CH375_WR_DAT_PORT( DATA_BUFFER[mLength]); // 将数据写入
; /* if( 160+col < 240 )
; {
; ShowNumber(j,160+col,*mBufferPoint); //显示 *mBufferPoint
; j+=4;
; if(j>37)
; {
; j=0;
; col+=16;
; }
; }*/
; mBufferPoint++;
; mLength--;
; }
; /* do { //对于C51,这个DO+WHILE结构比上面的WHILE效率高,速度快
; CH375_WR_DAT_PORT( DATA_BUFFER[mLength] );
; mBufferPoint++;
; } while ( --mLength );*/
; CH375_WR_CMD_PORT( CMD_DISK_WR_GO ); /* 继续执行USB存储器的写操作 */
ldi R16,87
xcall _CH375_WR_CMD_PORT
.dbline 331
; }
.dbline 332
; else break; /* 返回错误状态 */
L92:
.dbline 333
L88:
.dbline 305
subi R22,1
sbci R23,0
L90:
.dbline 305
cpi R22,0
cpc R22,R23
brne L87
X9:
L89:
.dbline 334
; }
; if ( mBlockCount == 0 ) {
cpi R22,0
cpc R22,R23
brne L96
X10:
.dbline 334
.dbline 335
; mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
xcall _mWaitInterrupt
mov R20,R16
.dbline 336
; if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */
cpi R16,20
brne L98
.dbline 336
clr R16
xjmp L86
L98:
.dbline 337
; }
L96:
.dbline 339
; // if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* U盘断开 */
; mClearError( ); /* 清除U盘错误以便重试 */
xcall _mClearError
.dbline 340
; return( mIntStatus ); /* 操作失败 */
mov R16,R20
.dbline -2
L86:
xcall pop_gset4
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r col 22 i
.dbsym r j 22 i
.dbsym r mBlockCount 22 i
.dbsym r mIntStatus 20 c
.dbsym r mBufferPoint 10 pc
.dbsym r mLength 12 c
.dbsym l iSectorCount 12 c
.dbsym l iLbaStart 8 l
.dbend
.dbfunc e mInitSTDIO _mInitSTDIO fV
.even
_mInitSTDIO::
.dbline -1
.dbline 356
; }
;
; struct _HD_MBR_DPT {
; unsigned char PartState;
; unsigned char StartHead;
; unsigned int StartSec;
; unsigned char PartType;
; unsigned char EndHead;
; unsigned int EndSec;
; unsigned long StartSector;
; unsigned long TotalSector;
; };
;
; /* 为printf和getkey输入输出初始化串口 */
; void mInitSTDIO( )
; {
.dbline 364
; /* SCON = 0x50;
; PCON = 0x80;
; TMOD = 0x20;
; TH1 = 0xf3; // 24MHz晶振, 9600bps//
; TR1 = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -