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

📄 ata.lis

📁 使用硬盘制作mp3的源程序
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module ata.c
                        .area text(rom, con, rel)
 0000                   .dbfile G:\IccPro\Mp3Ide\ata.c
 0000                   .dbfunc e init_ata _init_ata fI
 0000           ;              j -> <dead>
 0000           ;              i -> <dead>
 0000           ;      word_read -> <dead>
 0000           ;         device -> R20
                        .even
 0000           _init_ata::
 0000 0E940000          xcall push_gset2
 0004 402F              mov R20,R16
 0006                   .dbline -1
 0006                   .dbline 18
 0006           ; #include <iom128v.h>
 0006           ; #include <string.h>
 0006           ; #include <stdio.h>
 0006           ; #include <macros.h>
 0006           ; #include "ata.h"
 0006           ; #include "generic.h"
 0006           ; #include "remote.h"
 0006           ; 
 0006           ; #define debug
 0006           ; #define debugport 1
 0006           ; 
 0006           ; //******************************************************************
 0006           ; //*   INITIALIZE HARDWARE FOR ATA DRIVER
 0006           ; //*   
 0006           ; //*   
 0006           ; //******************************************************************
 0006           ; int init_ata(unsigned char device)
 0006           ; {
 0006                   .dbline 21
 0006           ; unsigned int word_read,i,j;
 0006           ; 
 0006           ; ata_databus_in;
 0006 2224              clr R2
 0008 2ABA              out 0x1a,R2
 000A                   .dbline 21
 000A 24BA              out 0x14,R2
 000C                   .dbline 21
 000C                   .dbline 22
 000C           ; PORT_ATA_IO_CNTL_DDR = 0xff;
 000C 8FEF              ldi R24,255
 000E 80936100          sts 97,R24
 0012                   .dbline 23
 0012           ; PORT_ATA_IO_CNTL = ATA_IO_HIZ;
 0012 80936200          sts 98,R24
 0016                   .dbline 24
 0016           ; PORT_ATA_RST_CNTL_DDR |= ATA_RESET;
 0016 80916400          lds R24,100
 001A 8260              ori R24,2
 001C 80936400          sts 100,R24
 0020                   .dbline 26
 0020           ; 
 0020           ; ata_hard_reset();
 0020 3DD0              xcall _ata_hard_reset
 0022           L2:
 0022                   .dbline 28
 0022           L3:
 0022                   .dbline 28
 0022           ; 
 0022           ; while (!ready & busy);
 0022 0ED1              xcall _ata_rdy
 0024 0023              tst R16
 0026 19F4              brne L5
 0028 61E0              ldi R22,1
 002A 70E0              ldi R23,0
 002C 02C0              xjmp L6
 002E           L5:
 002E 6627              clr R22
 0030 7727              clr R23
 0032           L6:
 0032 0ED1              xcall _ata_bsy
 0034 202E              mov R2,R16
 0036 3324              clr R3
 0038 2B01              movw R4,R22
 003A 4220              and R4,R2
 003C 5320              and R5,R3
 003E 4420              tst R4
 0040 81F7              brne L2
 0042 5520              tst R5
 0044 71F7              brne L2
 0046           X0:
 0046                   .dbline 29
 0046           ; ata_select_device(device);
 0046 042F              mov R16,R20
 0048 3FD0              xcall _ata_select_device
 004A           L7:
 004A                   .dbline 30
 004A           L8:
 004A                   .dbline 30
 004A           ; while (!ready & busy);
 004A FAD0              xcall _ata_rdy
 004C 0023              tst R16
 004E 19F4              brne L10
 0050 61E0              ldi R22,1
 0052 70E0              ldi R23,0
 0054 02C0              xjmp L11
 0056           L10:
 0056 6627              clr R22
 0058 7727              clr R23
 005A           L11:
 005A FAD0              xcall _ata_bsy
 005C 202E              mov R2,R16
 005E 3324              clr R3
 0060 2B01              movw R4,R22
 0062 4220              and R4,R2
 0064 5320              and R5,R3
 0066 4420              tst R4
 0068 81F7              brne L7
 006A 5520              tst R5
 006C 71F7              brne L7
 006E           X1:
 006E                   .dbline 31
 006E           ; ata_write_byte(ATA_IO_CMD,CMD_RECALIBRATE);
 006E 20E1              ldi R18,16
 0070 0DEF              ldi R16,253
 0072 85D0              xcall _ata_write_byte
 0074           L12:
 0074                   .dbline 32
 0074           L13:
 0074                   .dbline 32
 0074           ; while (busy);
 0074 EDD0              xcall _ata_bsy
 0076 0023              tst R16
 0078 E9F7              brne L12
 007A                   .dbline 33
 007A           ; ata_write_byte(ATA_IO_SECTORCNT,60); // Sleep after 5 min
 007A 2CE3              ldi R18,60
 007C 05EE              ldi R16,229
 007E 7FD0              xcall _ata_write_byte
 0080           L15:
 0080                   .dbline 34
 0080           L16:
 0080                   .dbline 34
 0080           ; while (busy);
 0080 E7D0              xcall _ata_bsy
 0082 0023              tst R16
 0084 E9F7              brne L15
 0086                   .dbline 35
 0086           ; ata_write_byte(ATA_IO_CMD,CMD_STANDBY2);
 0086 26E9              ldi R18,150
 0088 0DEF              ldi R16,253
 008A 79D0              xcall _ata_write_byte
 008C           L18:
 008C                   .dbline 36
 008C           L19:
 008C                   .dbline 36
 008C           ; while (busy);
 008C E1D0              xcall _ata_bsy
 008E 0023              tst R16
 0090 E9F7              brne L18
 0092                   .dbline 38
 0092           ; 
 0092           ; return 1;
 0092 01E0              ldi R16,1
 0094 10E0              ldi R17,0
 0096                   .dbline -2
 0096           L1:
 0096 0E940000          xcall pop_gset2
 009A                   .dbline 0 ; func end
 009A 0895              ret
 009C                   .dbsym l j 1 i
 009C                   .dbsym l i 1 i
 009C                   .dbsym l word_read 1 i
 009C                   .dbsym r device 20 c
 009C                   .dbend
 009C                   .dbfunc e ata_hard_reset _ata_hard_reset fV
                        .even
 009C           _ata_hard_reset::
 009C                   .dbline -1
 009C                   .dbline 47
 009C           ; }
 009C           ; 
 009C           ; //******************************************************************
 009C           ; //*   PERFORM HARDWARE RESET
 009C           ; //*   This routine toggles ATA RESET line low for 10ms.
 009C           ; //*   
 009C           ; //******************************************************************                                                                                                                                                                                                                           
 009C           ; void ata_hard_reset(void)
 009C           ; {
 009C                   .dbline 48
 009C           ; ata_databus_in;
 009C 2224              clr R2
 009E 2ABA              out 0x1a,R2
 00A0                   .dbline 48
 00A0 24BA              out 0x14,R2
 00A2                   .dbline 48
 00A2                   .dbline 49
 00A2           ; PORT_ATA_RST_CNTL &= ~ATA_RESET;
 00A2 80916500          lds R24,101
 00A6 8D7F              andi R24,253
 00A8 80936500          sts 101,R24
 00AC                   .dbline 50
 00AC           ; delay_ms(10);
 00AC 0AE0              ldi R16,10
 00AE 10E0              ldi R17,0
 00B0 0E940000          xcall _delay_ms
 00B4                   .dbline 51
 00B4           ; PORT_ATA_RST_CNTL |= ATA_RESET;
 00B4 80916500          lds R24,101
 00B8 8260              ori R24,2
 00BA 80936500          sts 101,R24
 00BE                   .dbline 52
 00BE           ; delay_ms(10);
 00BE 0AE0              ldi R16,10
 00C0 10E0              ldi R17,0
 00C2 0E940000          xcall _delay_ms
 00C6                   .dbline -2
 00C6           L21:
 00C6                   .dbline 0 ; func end
 00C6 0895              ret
 00C8                   .dbend
 00C8                   .dbfunc e ata_select_device _ata_select_device fV
 00C8           ;         device -> R20
                        .even
 00C8           _ata_select_device::
 00C8 0E940000          xcall push_gset1
 00CC 402F              mov R20,R16
 00CE                   .dbline -1
 00CE                   .dbline 61
 00CE           ; }   
 00CE           ; 
 00CE           ; //******************************************************************
 00CE           ; //*   SELECT ATA DEVICE
 00CE           ; //*   This routine defaults to Drive 0 as the target drive.
 00CE           ; //*   
 00CE           ; //******************************************************************
 00CE           ; void ata_select_device(unsigned char device)
 00CE           ; {
 00CE                   .dbline 62
 00CE           ; switch (device)
 00CE 5527              clr R21
 00D0 4030              cpi R20,0
 00D2 4507              cpc R20,R21
 00D4 29F0              breq L26
 00D6           X2:
 00D6 4130              cpi R20,1
 00D8 E0E0              ldi R30,0
 00DA 5E07              cpc R21,R30
 00DC 29F0              breq L27
 00DE 08C0              xjmp L23
 00E0           X3:
 00E0                   .dbline 63
 00E0           ;       {
 00E0           L26:
 00E0                   .dbline 65
 00E0           ;       case 0x00:
 00E0           ;               ata_write_byte(ATA_IO_DEVICE_HEAD,ATA_DH_DEV0);
 00E0 20EE              ldi R18,224
 00E2 05EF              ldi R16,245
 00E4 4CD0              xcall _ata_write_byte
 00E6                   .dbline 66
 00E6           ;               break;
 00E6 07C0              xjmp L24
 00E8           L27:
 00E8                   .dbline 68
 00E8           ;       case 0x01:
 00E8           ;               ata_write_byte(ATA_IO_DEVICE_HEAD,ATA_DH_DEV1);
 00E8 20EF              ldi R18,240
 00EA 05EF              ldi R16,245
 00EC 48D0              xcall _ata_write_byte
 00EE                   .dbline 69
 00EE           ;               break;
 00EE 03C0              xjmp L24
 00F0           L23:
 00F0                   .dbline 71
 00F0 20EE              ldi R18,224
 00F2 05EF              ldi R16,245
 00F4 44D0              xcall _ata_write_byte
 00F6                   .dbline 72
 00F6           L24:
 00F6                   .dbline -2
 00F6           L22:
 00F6 0E940000          xcall pop_gset1
 00FA                   .dbline 0 ; func end
 00FA 0895              ret
 00FC                   .dbsym r device 20 c
 00FC                   .dbend
 00FC                   .dbfunc e ata_write_word _ata_write_word fV
 00FC           ;        wordout -> R20,R21
 00FC           ;            reg -> R22
                        .even
 00FC           _ata_write_word::
 00FC 0E940000          xcall push_gset2
 0100 A901              movw R20,R18
 0102 602F              mov R22,R16
 0104                   .dbline -1
 0104                   .dbline 83
 0104           ;       default:
 0104           ;               ata_write_byte(ATA_IO_DEVICE_HEAD,ATA_DH_DEV0);
 0104           ;               break;
 0104           ;   }
 0104           ; }
 0104           ; 
 0104           ; //******************************************************************
 0104           ; //*   WRITE WORD TO ATA DEVICE
 0104           ; //*   
 0104           ; //* Mapping : D0-PA0,D1-PA2,D2-PA4,D3-PA6,D4-PC7,D5-PC5,D7-PC3,D7-PC1
 0104           ; //*                     D8-PC0,D9-PC2,D10-PC4,D11-PC6,D12-PA7,D13-PA5,D14-PA3,D15-PA1
 0104           ; //******************************************************************                                                                                                                                                                                                                           
 0104           ; void ata_write_word(unsigned char reg,unsigned int wordout)
 0104           ; {
 0104                   .dbline 84
 0104           ; WDR();
 0104 A895              wdr
 0106                   .dbline 85
 0106           ; PORT_ATA_IO_CNTL = reg;
 0106 60936200          sts 98,R22
 010A                   .dbline 87
 010A           ; 
 010A           ; ata_databus_out;
 010A 8FEF              ldi R24,255
 010C 8ABB              out 0x1a,R24
 010E                   .dbline 87
 010E 84BB              out 0x14,R24
 0110                   .dbline 87
 0110                   .dbline 89
 0110           ; 
 0110           ; PORT_ATA_DATA1_OUT = 0x00;
 0110 2224              clr R2
 0112 2BBA              out 0x1b,R2
 0114                   .dbline 90
 0114           ; PORT_ATA_DATA2_OUT = 0x00;
 0114 25BA              out 0x15,R2
 0116                   .dbline 92
 0116           ; 
 0116           ; if (wordout & 0x0001) PORT_ATA_DATA1_OUT |= 0x01; 
 0116 40FD              sbrc R20,0
 0118                   .dbline 92
 0118 D89A              sbi 0x1b,0
 011A           L29:
 011A                   .dbline 93
 011A           ; if (wordout & 0x0002) PORT_ATA_DATA1_OUT |= 0x04;
 011A 41FD              sbrc R20,1
 011C                   .dbline 93
 011C DA9A              sbi 0x1b,2
 011E           L31:
 011E                   .dbline 94
 011E           ; if (wordout & 0x0004) PORT_ATA_DATA1_OUT |= 0x10;
 011E 42FD              sbrc R20,2
 0120                   .dbline 94
 0120 DC9A              sbi 0x1b,4
 0122           L33:
 0122                   .dbline 95
 0122           ; if (wordout & 0x0008) PORT_ATA_DATA1_OUT |= 0x40;
 0122 43FD              sbrc R20,3
 0124                   .dbline 95
 0124 DE9A              sbi 0x1b,6
 0126           L35:
 0126                   .dbline 96
 0126           ; if (wordout & 0x0010) PORT_ATA_DATA2_OUT |= 0x80;
 0126 44FD              sbrc R20,4
 0128                   .dbline 96
 0128 AF9A              sbi 0x15,7
 012A           L37:
 012A                   .dbline 97
 012A           ; if (wordout & 0x0020) PORT_ATA_DATA2_OUT |= 0x20;
 012A 45FD              sbrc R20,5
 012C                   .dbline 97
 012C AD9A              sbi 0x15,5
 012E           L39:
 012E                   .dbline 98
 012E           ; if (wordout & 0x0040) PORT_ATA_DATA2_OUT |= 0x08;
 012E 46FD              sbrc R20,6
 0130                   .dbline 98
 0130 AB9A              sbi 0x15,3
 0132           L41:
 0132                   .dbline 99
 0132           ; if (wordout & 0x0080) PORT_ATA_DATA2_OUT |= 0x02;
 0132 47FD              sbrc R20,7
 0134                   .dbline 99
 0134 A99A              sbi 0x15,1
 0136           L43:
 0136                   .dbline 100
 0136           ; if (wordout & 0x0100) PORT_ATA_DATA2_OUT |= 0x01;
 0136 50FD              sbrc R21,0
 0138                   .dbline 100
 0138 A89A              sbi 0x15,0
 013A           L45:
 013A                   .dbline 101

⌨️ 快捷键说明

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