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

📄 ata.lis

📁 用ATmega128做的mp3播放器
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 025E                   .dbline -1
 025E                   .dbline 204
 025E           ; }
 025E           ; 
 025E           ; //******************************************************************
 025E           ; //*   CHECK ATA DRQ BIT 
 025E           ; //*   Checks READY status bit.
 025E           ; //*   Returns 1 if device is requesting service.
 025E           ; //******************************************************************    
 025E           ; unsigned char ata_drq(void)
 025E           ; {
 025E                   .dbline 205
 025E           ; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_DRQ) return 1;
 025E 0DEF              ldi R16,253
 0260 E5DF              xcall _ata_read_byte
 0262 03FF              sbrs R16,3
 0264 02C0              rjmp L103
 0266                   .dbline 205
 0266 01E0              ldi R16,1
 0268 01C0              xjmp L102
 026A           L103:
 026A                   .dbline 206
 026A           ; else return 0;
 026A 0027              clr R16
 026C                   .dbline -2
 026C           L102:
 026C                   .dbline 0 ; func end
 026C 0895              ret
 026E                   .dbend
 026E                   .dbfunc e ata_err _ata_err fc
                        .even
 026E           _ata_err::
 026E                   .dbline -1
 026E                   .dbline 215
 026E           ; }
 026E           ; 
 026E           ; //******************************************************************
 026E           ; //*   CHECK ATA ERROR BIT 
 026E           ; //*   Checks READY status bit.
 026E           ; //*   Returns 1 if device is reporting an error condition.
 026E           ; //****************************************************************** 
 026E           ; unsigned char ata_err(void)
 026E           ; {
 026E                   .dbline 216
 026E           ; if (ata_read_byte(ATA_IO_STATUS) & ATA_STAT_ERR) return 1;
 026E 0DEF              ldi R16,253
 0270 DDDF              xcall _ata_read_byte
 0272 00FF              sbrs R16,0
 0274 02C0              rjmp L106
 0276                   .dbline 216
 0276 01E0              ldi R16,1
 0278 01C0              xjmp L105
 027A           L106:
 027A                   .dbline 217
 027A           ; else return 0;
 027A 0027              clr R16
 027C                   .dbline -2
 027C           L105:
 027C                   .dbline 0 ; func end
 027C 0895              ret
 027E                   .dbend
 027E                   .dbfunc e ata_read_sector_byte _ata_read_sector_byte fV
 027E           ;           word -> R14,R15
 027E           ;              i -> R10,R11
 027E           ;              j -> R12,R13
 027E           ;            ptr -> y+18
 027E           ;            qte -> y+16
 027E           ;           from -> y+14
 027E           ;      lbasector -> y+10
 027E           ;         device -> R10
                        .even
 027E           _ata_read_sector_byte::
 027E 3A93              st -y,r19
 0280 2A93              st -y,r18
 0282 0E940000          xcall push_gset5
 0286 A02E              mov R10,R16
 0288                   .dbline -1
 0288                   .dbline 228
 0288           ; }
 0288           ; 
 0288           ; //******************************************************************
 0288           ; //*   READ A PART of SECTOR 
 0288           ; //*   device = 0x00 or 0x01  
 0288           ; //*   
 0288           ; //******************************************************************          
 0288           ; void ata_read_sector_byte(unsigned char device, unsigned long lbasector,  
 0288           ;                                                 unsigned int from, unsigned int qte, 
 0288           ;                                                 unsigned char *ptr)
 0288           ; {
 0288                   .dbline 231
 0288           ; unsigned int i,j,word;
 0288           ; 
 0288           ; lbasector &= 0x0FFFFFFF;
 0288 4FEF              ldi R20,255
 028A 5FEF              ldi R21,255
 028C 6FEF              ldi R22,255
 028E 7FE0              ldi R23,15
 0290 FE01              movw R30,R28
 0292 2284              ldd R2,z+10
 0294 3384              ldd R3,z+11
 0296 4484              ldd R4,z+12
 0298 5584              ldd R5,z+13
 029A 2422              and R2,R20
 029C 3522              and R3,R21
 029E 4622              and R4,R22
 02A0 5722              and R5,R23
 02A2 2286              std z+10,R2
 02A4 3386              std z+11,R3
 02A6 4486              std z+12,R4
 02A8 5586              std z+13,R5
 02AA                   .dbline 233
 02AA           ; 
 02AA           ; switch (device)
 02AA BB24              clr R11
 02AC AA20              tst R10
 02AE 11F4              brne X4
 02B0 BB20              tst R11
 02B2 31F0              breq L112
 02B4           X4:
 02B4 C501              movw R24,R10
 02B6 8130              cpi R24,1
 02B8 E0E0              ldi R30,0
 02BA 9E07              cpc R25,R30
 02BC D9F0              breq L113
 02BE 34C0              xjmp L109
 02C0           X5:
 02C0                   .dbline 234
 02C0           ;       {
 02C0           L112:
 02C0                   .dbline 236
 02C0           ;       case 0x00:
 02C0           ;          ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
 02C0 88E1              ldi R24,24
 02C2 90E0              ldi R25,0
 02C4 FE01              movw R30,R28
 02C6 2284              ldd R2,z+10
 02C8 3384              ldd R3,z+11
 02CA 4484              ldd R4,z+12
 02CC 5584              ldd R5,z+13
 02CE 8A93              st -y,R24
 02D0 8101              movw R16,R2
 02D2 9201              movw R18,R4
 02D4 0E940000          xcall lsr32
 02D8 1801              movw R2,R16
 02DA 2901              movw R4,R18
 02DC 40EE              ldi R20,224
 02DE 50E0              ldi R21,0
 02E0 60E0              ldi R22,0
 02E2 70E0              ldi R23,0
 02E4 242A              or R2,R20
 02E6 352A              or R3,R21
 02E8 462A              or R4,R22
 02EA 572A              or R5,R23
 02EC 222D              mov R18,R2
 02EE 05EF              ldi R16,245
 02F0 45DF              xcall _ata_write_byte
 02F2                   .dbline 237
 02F2           ;          break;
 02F2 33C0              xjmp L115
 02F4           L113:
 02F4                   .dbline 239
 02F4           ;       case 0x01:
 02F4           ;          ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xF0);
 02F4 88E1              ldi R24,24
 02F6 90E0              ldi R25,0
 02F8 FE01              movw R30,R28
 02FA 2284              ldd R2,z+10
 02FC 3384              ldd R3,z+11
 02FE 4484              ldd R4,z+12
 0300 5584              ldd R5,z+13
 0302 8A93              st -y,R24
 0304 8101              movw R16,R2
 0306 9201              movw R18,R4
 0308 0E940000          xcall lsr32
 030C 1801              movw R2,R16
 030E 2901              movw R4,R18
 0310 40EF              ldi R20,240
 0312 50E0              ldi R21,0
 0314 60E0              ldi R22,0
 0316 70E0              ldi R23,0
 0318 242A              or R2,R20
 031A 352A              or R3,R21
 031C 462A              or R4,R22
 031E 572A              or R5,R23
 0320 222D              mov R18,R2
 0322 05EF              ldi R16,245
 0324 2BDF              xcall _ata_write_byte
 0326                   .dbline 240
 0326           ;          break;
 0326 19C0              xjmp L115
 0328           L109:
 0328                   .dbline 242
 0328           ;       default:
 0328           ;          ata_write_byte(ATA_IO_DEVICE_HEAD,lbasector >> 24 | 0xE0);
 0328 88E1              ldi R24,24
 032A 90E0              ldi R25,0
 032C FE01              movw R30,R28
 032E 2284              ldd R2,z+10
 0330 3384              ldd R3,z+11
 0332 4484              ldd R4,z+12
 0334 5584              ldd R5,z+13
 0336 8A93              st -y,R24
 0338 8101              movw R16,R2
 033A 9201              movw R18,R4
 033C 0E940000          xcall lsr32
 0340 1801              movw R2,R16
 0342 2901              movw R4,R18
 0344 40EE              ldi R20,224
 0346 50E0              ldi R21,0
 0348 60E0              ldi R22,0
 034A 70E0              ldi R23,0
 034C 242A              or R2,R20
 034E 352A              or R3,R21
 0350 462A              or R4,R22
 0352 572A              or R5,R23
 0354 222D              mov R18,R2
 0356 05EF              ldi R16,245
 0358 11DF              xcall _ata_write_byte
 035A                   .dbline 243
 035A           ;          break; 
 035A           L114:
 035A                   .dbline 245
 035A           L115:
 035A                   .dbline 245
 035A           ;       } 
 035A           ; while(busy);
 035A 79DF              xcall _ata_bsy
 035C 0023              tst R16
 035E E9F7              brne L114
 0360                   .dbline 246
 0360           ; ata_write_byte(ATA_IO_CYL_H,lbasector >> 16);
 0360 FE01              movw R30,R28
 0362 2284              ldd R2,z+10
 0364 3384              ldd R3,z+11
 0366 4484              ldd R4,z+12
 0368 5584              ldd R5,z+13
 036A 1201              movw R2,R4
 036C 4424              clr R4
 036E 5524              clr R5
 0370 222D              mov R18,R2
 0372 0DED              ldi R16,221
 0374 03DF              xcall _ata_write_byte
 0376           L117:
 0376                   .dbline 247
 0376           L118:
 0376                   .dbline 247
 0376           ; while(busy);
 0376 6BDF              xcall _ata_bsy
 0378 0023              tst R16
 037A E9F7              brne L117
 037C                   .dbline 248
 037C           ; ata_write_byte(ATA_IO_CYL_L,lbasector >> 8);
 037C 88E0              ldi R24,8
 037E 90E0              ldi R25,0
 0380 FE01              movw R30,R28
 0382 2284              ldd R2,z+10
 0384 3384              ldd R3,z+11
 0386 4484              ldd R4,z+12
 0388 5584              ldd R5,z+13
 038A 8A93              st -y,R24
 038C 8101              movw R16,R2
 038E 9201              movw R18,R4
 0390 0E940000          xcall lsr32
 0394 202F              mov R18,R16
 0396 05ED              ldi R16,213
 0398 F1DE              xcall _ata_write_byte
 039A           L120:
 039A                   .dbline 249
 039A           L121:
 039A                   .dbline 249
 039A           ; while(busy);
 039A 59DF              xcall _ata_bsy
 039C 0023              tst R16
 039E E9F7              brne L120
 03A0                   .dbline 250
 03A0           ; ata_write_byte(ATA_IO_SECTORNUM,lbasector);
 03A0 FE01              movw R30,R28
 03A2 2284              ldd R2,z+10
 03A4 3384              ldd R3,z+11
 03A6 4484              ldd R4,z+12
 03A8 5584              ldd R5,z+13
 03AA 222D              mov R18,R2
 03AC 0DEE              ldi R16,237
 03AE E6DE              xcall _ata_write_byte
 03B0           L123:
 03B0                   .dbline 251
 03B0           L124:
 03B0                   .dbline 251
 03B0           ; while(busy);
 03B0 4EDF              xcall _ata_bsy
 03B2 0023              tst R16
 03B4 E9F7              brne L123
 03B6                   .dbline 252
 03B6           ; ata_write_byte(ATA_IO_SECTORCNT,0x01);
 03B6 21E0              ldi R18,1
 03B8 05EE              ldi R16,229
 03BA E0DE              xcall _ata_write_byte
 03BC           L126:
 03BC                   .dbline 253
 03BC           L127:
 03BC                   .dbline 253
 03BC           ; while(busy);
 03BC 48DF              xcall _ata_bsy
 03BE 0023              tst R16
 03C0 E9F7              brne L126
 03C2                   .dbline 254
 03C2           ; ata_write_byte(ATA_IO_CMD,CMD_READ_SECTORS);
 03C2 20E2              ldi R18,32
 03C4 0DEF              ldi R16,253
 03C6 DADE              xcall _ata_write_byte
 03C8           L129:
 03C8                   .dbline 255
 03C8           L130:
 03C8                   .dbline 255
 03C8           ; while(busy);
 03C8 42DF              xcall _ata_bsy
 03CA 0023              tst R16
 03CC E9F7              brne L129
 03CE           L132:
 03CE                   .dbline 256
 03CE           L133:
 03CE                   .dbline 256
 03CE           ; while(!drq);
 03CE 47DF              xcall _ata_drq
 03D0 0023              tst R16
 03D2 E9F3              breq L132
 03D4                   .dbline 258
 03D4           ; 
 03D4           ; j = 0;
 03D4 CC24              clr R12
 03D6 DD24              clr R13
 03D8                   .dbline 259
 03D8           ; for (i=0;i<256;i++)
 03D8 AA24              clr R10
 03DA BB24              clr R11
 03DC 36C0              xjmp L138
 03DE           L135:
 03DE                   .dbline 260
 03DE           ;     {
 03DE                   .dbline 261
 03DE           ;       word = ata_read_word(ATA_IO_DATA);
 03DE 05EC              ldi R16,197
 03E0 D8DE              xcall _ata_read_word
 03E2 7801              movw R14,R16
 03E4                   .dbline 262
 03E4           ;       if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word);
 03E4 0E84              ldd R0,y+14
 03E6 1F84              ldd R1,y+15
 03E8 C014              cp R12,R0
 03EA D104              cpc R13,R1
 03EC 68F0              brlo L139
 03EE 1001              movw R2,R0
 03F0 0888              ldd R0,y+16
 03F2 1988              ldd R1,y+17
 03F4 200C              add R2,R0
 03F6 311C              adc R3,R1
 03F8 C214              cp R12,R2
 03FA D304              cpc R13,R3
 03FC 28F4              brsh L139
 03FE                   .dbline 262
 03FE EA89              ldd R30,y+18
 0400 FB89              ldd R31,y+19
 0402 E192              st Z+,R14
 0404 FB8B              std y+19,R31
 0406 EA8B              std y+18,R30
 0408           L139:
 0408                   .dbline 263
 0408           ;       j++;
 0408 C601              movw R24,R12
 040A 0196              adiw R24,1
 040C 6C01              movw R12,R24
 040E                   .dbline 264
 040E           ;     if ((j >= from) && (j < (from + qte))) *ptr++ = (unsigned char)(word >> 8);
 040E 0E84              ldd R0,y+14
 0410 1F84              ldd R1,y+15
 0412 8015              cp R24,R0
 0414 9105              cpc R25,R1
 0416 80F0              brlo L141
 0418 1001              movw R2,R0
 041A 0888              ldd R0,y+16
 041C 1988              ldd R1,y+17
 041E 200C              add R2,R0
 0420 311C              adc R3,R1
 0422 8215              cp R24,R2

⌨️ 快捷键说明

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