📄 ata.lis
字号:
.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 + -