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

📄 ata.lis

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

⌨️ 快捷键说明

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