|
помогите разобратся, с исходником файловой системы |
|
|
|
May 25 2010, 23:26
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 13-03-10
Пользователь №: 55 930

|
вот нашол код в исходнике что он означает ,а точнее код который выделен. исходник используется в прошитом мк к нему подключена флеш карта. Код ;---------------------------------------------------------; ; FAT16 file system ;---------------------------------------------------------;
file_init: clr T14L;0 stsi CurrSect0+2, -1;Read MBR to Buff0 ldiw A, 0 ; ldi BH, 0 ; rcall file_get_sect0; rjne fsi_err ;/ inc T14L;1 ldiw Y, Buff0+0x1C2;Chekc MBR sign (55AA) lddw A, Y+60 ; subiw A, 0xAA55; rjne mmi_err ;/ [i]inc T14L;2 ld AL, Y ;Check if 1st patition is FAT16. cpi AL, 0x06; rjne fsi_err ;/ Модератор. Формулируйте названия своих тем более полно и осмысленно!
Сообщение отредактировал rezident - May 26 2010, 12:55
Причина редактирования: Нарушение п.2.1в Правил форума. Оформление цитаты исходника.
|
|
|
|
|
 |
Ответов
(1 - 6)
|
May 26 2010, 05:37
|

Профессионал
    
Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718

|
1. подготавливаем параметры для ф-ии file_get_sect0 2. вызываем file_get_sect0 3. проверяем не вернула ли file_get_sect0 ошибку. Если ошибка то идем по fsi_err 4. проверяем сигнатуру MBR. Если ошибка то идем по mmi_err 5. проверяем тип ФС. Если не FAT16 то идем по fsi_err http://en.wikipedia.org/wiki/Master_boot_recordсправа табличка. 0x1CA это адрес типа первого раздела собсно формат описателя раздела Цитата Смещение Длина Описание 00h 1 Признак активности раздела 01h 1 Начало раздела - головка 02h 1 Начало раздела - сектор (биты 0-5), дорожка (биты 6,7) 03h 1 Начало раздела - дорожка (старшие биты 8,9 хранятся в байте номера сектора) 04h 1 Код типа раздела 05h 1 Конец раздела - головка 06h 1 Конец раздела - сектор (биты 0-5), дорожка (биты 6,7) 07h 1 Конец раздела - дорожка (старшие биты 8,9 хранятся в байте номера сектора) 08h 4 Смещение первого сектора 0Ch 4 Количество секторов раздела
|
|
|
|
|
May 26 2010, 07:03
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 13-03-10
Пользователь №: 55 930

|
вот такая проблемма 5. проверяем тип ФС. Если не FAT16 то идем по fsi_err флеш формтнул в fat16 ,а ошбка вылетает тоесть
inc T14L ;2 ld AL, Y ;Check if 1st patition is FAT16. 5. проверяем тип ФС. Если не FAT16 то идем по fsi_err cpi AL, 0x06 ; rjne fsi_err ;/ что может быть=(
Сообщение отредактировал extreme - May 26 2010, 07:03
|
|
|
|
|
May 26 2010, 16:09
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 13-03-10
Пользователь №: 55 930

|
вот это находится на флэшке!!
Прикрепленные файлы
111.rar ( 191.64 килобайт )
Кол-во скачиваний: 21
|
|
|
|
|
May 26 2010, 18:42
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 13-03-10
Пользователь №: 55 930

|
Возможна ли проблема из за размера кластера??? Вот весь код,посмотрите пожалуста я в програмировании неочень понимаю CODE ;---------------------------------------------------------; ; FAT16 file system ;---------------------------------------------------------; file_init: clr T14L;0 stsi CurrSect0+2, -1 ;Read MBR to Buff0 ldiw A, 0 ; ldi BH, 0 ; rcall file_get_sect0 ; rjne fsi_err ;/ inc T14L;1 ldiw Y, Buff0+0x1C2 ;Chekc MBR sign (55AA) lddw A, Y+60 ; subiw A, 0xAA55 ; rjne mmi_err ;/ inc T14L;2 ld AL, Y ;Check if 1st patition is FAT16. cpi AL, 0x06 ; rjne fsi_err ;/ inc T14L;3 lddw A, Y+4 ;Read PBR to Buff0 ldd BL, Y+6 ; movw CL, AL ; mov BH, BL ; subiw C, -1 ; sbci BH, -1 ; stsw FatBase+0, C ; sts FatBase+2, BH ; rcall file_get_sect0 ; rjne fsi_err ;/ inc T14L;4 ldsw A, Buff0+0x1FE ;Check PBR sign (55AA) subiw A, 0xAA55 ; brne fsi_err ;/ inc T14L;5 ldiw Z, fsi_fat16*2 ;Check FAT16 sign ldiw X, Buff0+0x36 ; lpm AL, Z+ ; ld AH, X+ ; cp AL, AH ; brne fsi_err ; cpi AH, ' ' ; brne PC-5 ;/ inc T14L;6 ldiw Y, Buff0 ;Get FAT16 information ldd AL, Y+0x0D ; sts ClstSize, AL ; ldsw A, FatBase+0 ; lds BL, FatBase+2 ; lddw X, Y+0x16 ; lslw X ; addw A, X ; adc BL, _0 ; stsw DirBase+0, A ; sts DirBase+2, BL ; lddw X, Y+0x11 ; stsw DirNum, X ; adiw XL, 15 ; ldi CL, 4 ; lsrw X ; dec CL ; brne PC-3 ; addw A, X ; adc BL, _0 ; stsw DataBase+0, A ; sts DataBase+2, BL ;/ sez fsi_err: ret fsi_fat16: .db "FAT16 " ;---------------------------------------------------------; ; Open File ; ; Call: Y = Pointer to new file structure (18 bytes) ; A = Pointer to file access buffer (512 bytes) ; Z = Pointer to file name (ASCIZ) ; Ret: eq: Y == NULL : no file ; Y != NULL : successful ; ne: error file_open: movw T2L, ZL ;File name stdw Y+16, A ;File buffer ldiw D, 0 ;Reset file search fo_ml: rcall file_dir_init movw ZL, T2L ;Pick a segment rcall file_getseg; movw T2L, ZL ;/ cpi CL, 1 ;Is file? brcs fo_fl ;/ brne fo_nf ;Is invalid name? fo_dl: rcall file_dir_next;Get next directory entry brne fo_ret ;/ cpw Z, _0 ;No more file? breq fo_ret ;/ rcall fo_comp ;Name matched? brne fo_dl ;/ ldd AL, Z+11;Is not a sub-dir? sbrs AL, 4 ; rjmp fo_nf ;/ lddw D, Z+26 ;Follow sub-dir rjmp fo_ml ;/ fo_fl: rcall file_dir_next;Get next directory entry brne fo_ret ;/ cpw Z, _0 ;No more file? breq fo_nf ;/ rcall fo_comp ;Name matched brne fo_fl ;/ ldd AL, Z+11;Is not a file? andi AL, 0b00011000; brne fo_nf ;/ stdw Y+0, _0 ; File ptr stdw Y+2, _0 ; / lddw A, Z+28 ; File size lddw B, Z+30 ; stdw Y+4, A ; stdw Y+6, B ; / lddw D, Z+26 ; Cluster stdw Y+14, D ; stdw Y+12, D ; / rcall file_clst2sect; Sector stdw Y+8, A ; stdw Y+10, B ;// sez ret fo_nf: sez fo_ret: ldiw Y, 0 ret fo_comp: pushw Z ldiw X, FileName;Compare file name ldi CL, 11 ; ld AL, Z+ ; ld AH, X+ ; cp AL, AH ; brne PC+3 ; dec CL ; brne PC-5 ;/ popw Z ret ;---------------------------------------------------------; ; Read a line ; ; Call: Y = Pointer to the file srtucture ; Z = Pointer to read buffer ; Ret: eq:successful ; ne:error or no more data file_gets: ldiw C, 1 rcall file_read brne fg_end cpi CL, 1 brne fg_end ld AL, Z cpi AL, 10 breq fg_end cpi AL, ' ' brcs file_gets adiw ZL, 1 rjmp file_gets fg_end: st Z, _0 ret ;---------------------------------------------------------; ; Read File (Byte Oriented) ; ; Call: Y = Pointer to the file srtucture ; Z = Pointer to read buffer ; C = Number of bytes to read ; Ret: eq:successful, C = Number of bytes read ; ne:error, C = Number of bytes read file_read: pushw Z lddw T0, Y+0 ;T2:T0 = File ptr lddw T2, Y+2 ;/ lddw A, Y+4 ;B:A = File size lddw B, Y+6 ;/ subw A, T0 ;B:A -= T2:T0 sbcw B, T2 ;/ cpw A, C ;if(B:A < C) C = B:A cpcw B, _0 ; brcc PC+2 ; movw CL, AL ;/ movw T4L, CL ;T4 = C clrw C ;C = 0 lddw B, Y+16 ;B = File buffer movw XL, T0L ;X = File ptr & 511 + B andi XH, high(511); addw X, B ;/ cpw X, B breq PC+2 addi BH, high(512);B += 512 fsr_lp1: cpw C, T4 ;if(T4 >= C) return brcc fsr_ret ;/ cpw X, B ;if(X >=  brcs fsr_s1 ;/ lddw A, Y+8 ;Fill buffer ldd BL, Y+10; lddw X, Y+16 ; rcall mmc_read_sect; brne fsr_ret ;/ rcall file_next_sect;Get next sector number lddw X, Y+16 ;X = File buffer movw BL, XL ;B = X + 512 addi BH, high(512);/ fsr_s1: ld AL, X+ ;*Z++ = *X++ st Z+, AL ;/ addiw C, 1 ;C++ adcw T0, _0 ;T2:T0++ adcw T2, _0 ;/ rjmp fsr_lp1 fsr_err: clz fsr_ret: stdw Y+0, T0 stdw Y+2, T2 popw Z ret ;---------------------------------------------------------; ; Read File (Non-Bufferd, Block Oriented) ; ; Call: Y = Pointer to the file srtucture ; Z = Pointer to read buffer ; C = Number of bytes to read (must be multiple of 512) ; Ret: eq:successful, C = Number of bytes read ; ne:error, C = Number of bytes read file_read_block: pushw Z lddw T0, Y+0 ;T2:T0 = File ptr lddw T2, Y+2 ;/ movw AL, CL ;Check count varidity andi AH, high(511); or AL, AH ; brne fsb_err ;/ lddw A, Y+4 ;B:A = File size lddw B, Y+6 ;/ subw A, T0 ;B:A -= T2:T0 sbcw B, T2 ;/ brcs fsb_nd ;No more data? breq fsb_nd ;/ cpw A, C ;if(B:A < C) C = B:A cpcw B, _0 ; brcc PC+2 ; movw CL, AL ;/ movw T4L, CL ;T4 = C clrw C ;C = 0 fsb_lp1: cpw C, T4 ;if(T4 >= C) return brcc fsb_ret ;/ lddw A, Y+8 ;Load block ldd BL, Y+10; movw XL, ZL ; rcall mmc_read_sect; brne fsb_err ;/ rcall file_next_sect;Get next sector number ldi AH, high(512); add CH, AH ;C += 512 add ZH, AH ;Z += 512 add T0H, AH ;T2:T0 += 512 adcw T2, _0 ;/ rjmp fsb_lp1 fsb_ret: movw CL, T4L sez fsb_err: stdw Y+0, T0 stdw Y+2, T2 popw Z ret fsb_nd: subw C, C popw Z ret ;---------------------------------------------------------; ; Seek File Pointer ; ; Call: Y = Pointer to file structure ; B:A = File Pointer ; Ret: eq: successful ; ne: error file_seek_block: clr AL andi AH, ~high(511) file_seek: lddw T0, Y+4 ;Check if size <= fp lddw T2, Y+6 ; cpw A, T0 ; cpcw B, T2 ; brcc fs_ret ;/ movw T0L, AL ;T2:T0 = File pointer movw T2L, BL ;/ stdw Y+0, T0 ;File Pointer stdw Y+2, T2 ;/ lddw D, Y+14 ;Cluseter stdw Y+12, D ;/ rcall file_clst2sect;Sector stdw Y+8, A ; stdw Y+10, B ;/ ldiw C, 512 ;Seek sector unit fs_lp1: cpw T0, C ; cpcw T2, _0 ; brcs fs_s1 ; rcall file_next_sect; subw T0, C ; sbcw T2, _0 ; rjmp fs_lp1 ;/ fs_s1: cpw T0, _0 ;Fill buffer if needed breq fs_ret ; lddw A, Y+8 ; ldd BL, Y+10; lddw X, Y+16 ; rcall mmc_read_sect; brne PC+3 ; rcall file_next_sect;/ sez fs_ret: ret ;---------------------------------------------------------; ; Create file name in directory entry ; ;Call: Z = Pointer to file name ;Ret: CL = 0:File, 1:Dir, 2:Invalid ; Z = Next segment ; X = Broken file_getseg: ldiw X, FileName;Fill output buffer ldi CH, 11 ; ldi CL, ' ' ; st X+, CL ; dec CH ; brne PC-2 ; sbiw XL, 11 ;/ fcv_lp: rcall fcv_getc cpi CL, 3 brcc PC+2 ret cpi CH, 11 ;Buffer full? brcc fcv_lp ;/ cpi CL, '.' ;Is a dot? breq PC+4 ;/ st X+, CL ;Store a char inc CH ; rjmp fcv_lp ;/ cpi CH, 0 ;Move to extension brne PC+3 ; ldi CL, 2 ; ret ; cpi CH, 8 ; brcc fcv_lp ; adiw XL, 1 ; inc CH ; rjmp PC-4 ;/ fcv_getc: ld CL, Z+ ;Get a char rcall caps ;/ cpi CL, 0x7F brcc fcv_err cpi CL, '|' breq fcv_err brcc fcv_ret cpi CL, '\' breq fcv_err cpi CL, '@' brcc fcv_ret cpi CL, ':' brcc fcv_err cpi CL, '0' brcc fcv_ret cpi CL, '/' breq fcv_dir cpi CL, '-' brcc fcv_ret cpi CL, '*' brcc fcv_err cpi CL, '!' brcc fcv_ret cpi CL, ' ' brcs fcv_file fcv_err:ldi CL, 2 fcv_ret:ret fcv_dir:ldi CL, 1 ret fcv_file:ldi CL, 0 ret ;---------------------------------------------------------; ; Initialize Directory Search ; ; Call: D: <2:Root, >=2:Sub(cluster#) file_dir_init: ldiw A, -1 stsw DirIndex, A stsw DirClst, D ldsw A, DirBase+0 lds BL, DirBase+2 ldi BH, 0 cpw D, _0 breq PC+2 rcall file_clst2sect stsw DirSect+0, A stsw DirSect+2, B ret ;---------------------------------------------------------; ; Get Next Directory Entry ; ; Ret: Z != NULL: successrul, Z=Pointer to the directory entry ; Z == NULL: no more entry file_dir_next: pushw T2 ldsw T2, DirIndex fnd_next: sec ;T2++ adcw T2, _0 ;/ cpw T2, _0 ;First search? breq fnd_cmp ;/ mov AL, T2L ;Sector changed? andi AL, 15 ; brne fnd_cmp ;/ ldsw A, DirSect+0;Next sector ldsw B, DirSect+2; sec ; adcw A, _0 ; adc BL, _0 ;/ ldsw D, DirClst;Is root dir? subiw D, 2 ; brcs fnd_st ;/ inc BH ;Cluster not changed? lds DL, ClstSize; cp BH, DL ; brcs fnd_st ;/ ldsw D, DirClst;Goto next cluster (sub-dir) rcall file_next_clust; brne fnd_ret ; stsw DirClst, D; rcall file_clst2sect;/ fnd_st: stsw DirSect+0, A stsw DirSect+2, B fnd_cmp: ldsw A, DirClst;Is end of sub-dir? movw BL, AL ; subiw A, 0xFFF0; brcc fnd_nofile;/ subiw B, 2 ;Is sub-dir? brcc PC+8 ;/ ldsw A, DirNum;End of root-dir? cpw T2, A ; brcc fnd_nofile;/ ldsw A, DirSect+0;Get directory sector lds BL, DirSect+2; rcall file_get_sect0; brne fnd_ret ;/ ldi AL, 32 ;Z = ((T2 & 15) << 5) + Buff0 mov AH, T2L ; andi AH, 15 ; mul AL, AH ; movw ZL, T0L ; addiw Z, Buff0;/ ldd AL, Z+0 ;Is empty entry? cpi AL, 0xE5; rjeq fnd_next;/ cpi AL, 0 ;Is end of dir? breq fnd_nofile;/ sez rjmp fnd_ret fnd_nofile: subw Z, Z fnd_ret: stsw DirIndex, T2 popw T2 ret ;---------------------------------------------------------; ; Get Next Sector ; ; Call: Y = File structure ; Ret: BL:A(!=-1) = next sector ; BL:A = -1: error file_next_sect: lddw A, Y+8 ;BL:A = CurrSect lddw B, Y+10 ;BH = CurrSectInClust subiw A, -1 ;BL:A++ sbci BL, -1 ;/ inc BH ;BH++ lds DL, ClstSize;if(BH < ClstSize) goto fsr_s1 cp BH, DL ; brcs fsn_ret ;/ lddw D, Y+12 ;Get next cluster rcall file_next_clust;/ brne fsn_err ;/ stdw Y+12, D ;Current cluster = D rcall file_clst2sect;BL:A = sector# fsn_ret: stdw Y+8, A stdw Y+10, B ret fsn_err: ldiw A, 0xFFFF ldiw B, 0x00FF rjmp fsn_ret ;---------------------------------------------------------; ; Cluster --> Next cluster ; ; Call: D = Cluster ; Ret: EQ: D = Next cluster ; NE: error file_next_clust: ldsw A, FatBase+0;BL:A = (Current cluster / 256) + FatBase lds BL, FatBase+2; add AL, DH ; adc AH, _0 ; adc BL, _0 ;/ push DL ;Read FAT rcall file_get_sect0; pop XL ; brne fnc_err ; clr XH ;D = Buff0[(Current cluster & 255) << 1] lslw X ; addiw X, Buff0; ldw D, X+ ;/ sez fnc_err: ret ;---------------------------------------------------------; ; Cluster --> Sector ; ; Call: D = Cluster# ; Ret: EQ: valid, BL:A=Sector#, BH=0 ; NE: invalid, BL:A=-1, BH=0 ; Broken: X, D, T0 file_clst2sect: ldiw A, 0xFFF0;Check if the cluster number is valid cpw D, A ; brcc flc_ivd ; subiw D, 2 ; brcs flc_ivd ;/ movw XL, T0L ;BL:A = (D - 2) * ClstSize lds BH, ClstSize; mul DL, BH ; movw AL, T0L ; mul DH, BH ; add AH, T0L ; ldi BL, 0 ; adc BL, T0H ; movw T0L, XL ;/ ldsw X, DataBase+0;BL:A += DataBase lds BH, DataBase+2; addw A, X ; adc BL, BH ;/ clr BH ;BH = 0 ret flc_ivd: ldiw A, 0xFFFF ldiw B, 0x00FF clz ret ;---------------------------------------------------------; ; Read a sector into Buff0 file_get_sect0: lds DL, CurrSect0+0 cp DL, AL lds DL, CurrSect0+1 cpc DL, AH lds DL, CurrSect0+2 cpc DL, BL breq PC+14 stsw CurrSect0+0, A sts CurrSect0+2, BL ldiw X, Buff0 rcall mmc_read_sect breq PC+4 stsi CurrSect0+2, -1 ret ;-----------------------------------------------------------; ; MMC Control ;-----------------------------------------------------------; mmc_init: ldi CL, 20 ;Dummy clock ldi DL, 0xFF ; rcall mmc_xmitbyte ; dec CL ; brne PC-3 ;/ clr T14L;0 ldi CL, CMD0 ;Send CMD0 ldiw B, 0 ; ldiw A, 0 ; rcall mmc_xmit_cmd ; andi AL, 0b01111110 ;Check error brne mmi_err ;/ inc T14L;1 ldi CL, CMD1 ;Send CMD1 rcall mmc_xmit_cmd ; breq PC+3 ;Check if card is ready andi AL, 0b01111110 ;Check error breq PC-4 ;/ inc T14L;2 ldiw Y, Buff0 ;Read CSD, CID and OCR movw XL, YL ; rcall mmc_read_info ; brne mmi_err ;/ inc T14L;3 ldd AL, Y+5 ;Check block size (512) andi AL, 0x0F ; cpi AL, 9 ;/ mmi_err: sbi PORTA, MCCS ;CS=H ret mmc_read_sect: pushw C mov BH, BL ;B:A *= 512; mov BL, AH ; mov AH, AL ; clr AL ; lsl AH ; rolw B ;/ ldi CL, CMD17 ;Send CMD17 rcall mmc_xmit_cmd ; brne PC+6 ;/ rcall mmc_wait_data ;Wait for data token brne PC+4 ;/ ldi CL, 0 ;Read sector rcall mmc_rcvblock ;/ sez popw C sbi PORTA, MCCS ;CS=H ret mmc_read_info: ldi CL, CMD9 ;Send CMD9 (Read CSD) rcall mmc_xmit_cmd ; brne mri_err ;/ rcall mmc_wait_data ;Wait for data token brne mri_err ;/ ldi CL, 16/2 ;Read CSD and show rcall mmc_rcvblock ;/ ldi CL, CMD10 ;Send CMD10 (Read CID) rcall mmc_xmit_cmd ; brne mri_err ;/ rcall mmc_wait_data ;Wait for data token brne mri_err ;/ ldi CL, 16/2 ;Read CID and show rcall mmc_rcvblock ;/ ldi CL, CMD58 ;Send CMD58 (Read OCR) rcall mmc_xmit_cmd ; brne mri_err ;/ ldi CL, 4 ;Read OCR rcall mmc_rcvbyte ; st X+, AL ; dec CL ; brne PC-3 ;/ mri_err: sbi PORTA, MCCS ;CS=H ret mmc_xmit_cmd: ldi DL, 0xFF ;Dummy clock rcall mmc_xmitbyte ;/ cbi PORTA, MCCS ;CS=L mov DL, CL ;Cmd rcall mmc_xmitbyte ;/ mov DL, BH ;Arg rcall mmc_xmitbyte ; mov DL, BL ; rcall mmc_xmitbyte ; mov DL, AH ; rcall mmc_xmitbyte ; mov DL, AL ; rcall mmc_xmitbyte ;/ ldi DL, 0x95 ;Crc rcall mmc_xmitbyte ;/ ldi AH, 200 rcall mmc_rcvbyte ;Receive a byte subi AH, 1 ;Timeout (375us) occured? brcs PC+4 ;/ sbrc AL, 7 ;Is valid response? rjmp PC-4 ;/ tst AL ;Check error status ret mmc_xmitbyte:; 5.5us in DH, PORTA ldi EL, 8 cbr DH, (1<<MCDI)+(1<<MCCK) lsl DL brcc PC+2 sbr DH, (1<<MCDI) out PORTA, DH;DI=data, CK=L sbr DH, (1<<MCCK) out PORTA, DH;CK=H dec EL brne PC-8 ret mmc_wait_data: pushw X ldiw X, 5333 rcall mmc_rcvbyte ;Receive a byte sbiw XL, 1 ;Timeout (10ms) occured? brcs PC+4 ;/ cpi AL, 0xFF ;Any token is detected? breq PC-4 ;/ cpi AL, 0xFE ;Valid data taken ? popw X ret mmc_rcvbyte:; 1.875us in DH, PORTA sbr DH, (1<<MCDI);DI=H mov DL, DH cbr DH, (1<<MCCK);CK=L mmc_rcvbyte2:; 1.625us out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL rjmp PC+1 in AL, PINC ret mmc_rcvblock:; words * 2.69us + 4.1us in DH, PORTA sbr DH, (1<<MCDI);DI=H mov DL, DH cbr DH, (1<<MCCK);CK=L mr_lp1: out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL rjmp PC+1 in AL, PINC out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL out PORTA, DH out PORTA, DL st X+, AL in AL, PINC st X+, AL dec CL brne mr_lp1 ;mmc_rcvcrc2: rcall mmc_rcvbyte2 ;Purge CRC rcall mmc_rcvbyte2 ;/ sbi PORTA, MCCS ;CS=H ret Модератор. Вам пора уже научиться цитированию исходников в соответствии с Правилами форума (см. п.3.4).
Сообщение отредактировал rezident - May 26 2010, 19:10
Причина редактирования: Нарушение п.3.4 Правил форума.
|
|
|
|
|
May 31 2010, 23:04
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 13-03-10
Пользователь №: 55 930

|
люди помогите пожалуста.выбивает noitem CODE ;----------------------------------------------------------------------------; ; Laser Display Controller ©ChaN, 2006 ;----------------------------------------------------------------------------;
.include "m64def.inc" .include "avr.inc" .include "ldp.inc"
;----------------------------------------------------------; ; SRAM Area
.dseg .org RAMTOP100 Buff0: .byte 512 ;File system working buffer Buff1: .byte 512 ;File buffer1 .byte 512 ;File buffer2
FatBase: .byte 3 ; FAT start sector DirBase: .byte 3 ; Directory start sector DataBase: .byte 3 ; Data start sector DirNum: .byte 2 ; Number of root directory entry ClstSize: .byte 1 ; Cluster size (sectors)
CurrSect0: .byte 3 ; Current sector in Buff0 DirIndex: .byte 2 ; Directory index (file_dir_) DirClst: .byte 2 ; Directory cluster number (0:Null, 1:Root, >1:clst#) DirSect: .byte 3 ; Current sector DirInClst: .byte 1 ; Current sector in currrent cluster
FileName: .byte 11 ; File name buffer for file_open
; File control structure 1 File1: .byte 18 ; 0[4]: File ptr File2: .byte 18 ; 4[4]: File size ; 8[3]: Current sector ; 11[1]: Current sector in currrent cluster ; 12[2]: Current cluster ; 14[2]: Start cluster ; 16[2]: Ptr to file buffer
LineBuf: .byte 40 ;Command Input buffer DumpAdr: .byte 3 RxBuff: .byte 2+32 ;Serial Receiving Buffer
KeyCmd: .byte 3 ;Key input buffer Lcdp: .byte 1 ;LCD cursor position
VectFifo: .byte 2+1 ;Vector FIFO buffer {RPtr, Count}
Index: .byte 2 ;Current, Items ListPtr: .byte 2 ; List: .byte 2000 ;File List
;----------------------------------------------------------; ; Program Code
.cseg ; Interrupt Vectors (ATmega64) jmp reset ; Reset jmp 0 ; Extrenal INT0 jmp 0 ; External INT1 jmp 0 ; External INT2 jmp 0 ; External INT3 jmp 0 ; External INT4 jmp 0 ; External INT5 jmp 0 ; External INT6 jmp 0 ; External INT7 jmp 0 ; TC2 COMP jmp 0 ; TC2 OVF jmp 0 ; TC1 CAPT jmp isr_tc1_coma ; TC1 COMPA jmp 0 ; TC1 COMPB jmp 0 ; TC1 OVF jmp isr_tc0_com ; TC0 COMP jmp 0 ; TC0 OVF jmp 0 ; SPI,STC jmp isr_usart0_rx ; USART0 RX jmp 0 ; USART0 UDRE jmp 0 ; USART0 TX jmp 0 ; ADC jmp 0 ; EE READY jmp 0 ; ANALOG COMP jmp 0 ; TC1 COMPC jmp 0 ; TC3 CAPT jmp 0 ; TC3 COMPA jmp 0 ; TC3 COMPB jmp 0 ; TC3 COMPC jmp 0 ; TC3 OVF jmp 0 ; USART1 RX jmp 0 ; USART1 UDRE jmp 0 ; USART1 TX jmp 0 ; TWI jmp 0 ; SPM READY
.include "LDP_MMC.ASM" ; MMC control and FAT16 file system .include "LDP_MON.ASM" ; Monitor .include "LDP_UI.ASM" ; Key, Serial, LCD
;----------------------------------------------------------; ; Initailize peripherals and work area
reset: clr _0 ;Zero reg. ldiw Z, RAMEND ;SP outw SP, Z ;/ ldiw X, 4096-1 ;Clear RAM st -Z, _0 ; sbiw XL, 1 ; brne PC-2 ;/
outi PORTA, 0b01111111 ;Port A outi DDRA, 0b01110000 ;
outi PORTB, 0b11111001 ;Port B outi DDRB, 0b00000111 ;
outi PORTD, 0b11000000 ;Port D outi DDRD, 0b00111111 ;
outi PORTE, 0b11111111 ;Port E outi DDRE, 0b00110010 ;
stsi PORTF, 0b11111111 ;Port F stsi PORTG, 0b11111 ;Port G
ldi AL, SYSCLK/16/BPS-1 ;Start USART0 out UBRR0L, AL ; outi UCSR0B, 0b10011000 ;/
outi SPCR, 0b01011000 ;Enable SPI outi SPSR, 0b00000001 ;/
outi OCR0, 156-1 ;Timer0: 100Hz interval outi TCCR0, 0b00001111 ;/
outi TIMSK, 0b00010010 ;Enable timer interrupts
sei
rcall lcd_init ;Initialize LCD
ldi AL, 13 ;200ms ldiw X, 0 ; sbiw XL, 1 ; brne PC-1 ; dec AL ; brne PC-5 ;/
rcall pps_stop ;Initialize DAC
rcall mmc_init ;Initialize MMC breq PC+4 ; ldiw Z, die_mmcerr*2 ; "MMC Err #" rjmp die ;/
rcall file_init ;Initialize file system breq PC+4 ; ldiw Z, die_fserr*2 ; "FS Errr #" rjmp die ;/
;----------------------------------------------------------; ; Main
main_index: ldiw D, 0 rcall file_dir_init ;Initialize directory index rcall clr_index mi_l1: rcall file_dir_next ;Get next file rjne mi_err ;/ cpw Z, _0 ;No more? breq mi_l2 ;/ rcall chk_index ;Check if *.txt brne mi_l1 ;/ rcall add_index ;Add it to index list brne mi_l1 ;/ mi_l2: rcall disp_item mi_l3: rcall chk_online rcall get_key_nw breq mi_l3 sbrc AL, K_NEXT rcall idx_next sbrc AL, K_PREV rcall idx_prev sbrc AL, K_SET rjmp main_list sbrc AL, K_CLR rjmp main_index rjmp mi_l2
main_list: rcall get_item ldiw Y, File1 ldiw A, Buff1 rcall file_open cpw Y, _0 rjeq mi_err rcall clr_index ml_l1: ldiw Z, LineBuf ;Get next line rcall file_gets ; brne ml_l2 ;/ lds AL, LineBuf ;Check if valid line cpi AL, '0' ; brcs ml_l1 ;/ rcall add_index ;Add it to index list brne ml_l1 ;/ ml_l2: rcall disp_item_file ml_l3: rcall get_key_nw breq ml_l3 sbrc AL, K_NEXT rcall idx_next sbrc AL, K_PREV rcall idx_prev sbrc AL, K_CLR rjmp main_index sbrs AL, K_SET rjmp ml_l2 ml_l4: rcall get_item ldiw Y, File1 ldiw A, Buff1 rcall file_open cpw Y, _0 breq ml_l3 rcall play sbrc AL, K_NEXT rjmp pi_next sbrc AL, K_PREV rjmp pi_prev rjmp ml_l3 pi_next: rcall idx_next rcall disp_item_file rjmp ml_l4 pi_prev: rcall idx_prev rcall disp_item_file rjmp ml_l4
disp_item_file: rcall lcd_clear ldsw A, Index cp AL, AH brcc di_noitem inc AL rcall lcd_prin_val ldi AL, ':' rcall lcd_wr_chr rcall get_item ldiw Y, File1 ldiw A, Buff1 rcall file_open brne dif_nofile cpw Y, _0 breq dif_nofile ldiw Z, LineBuf ldiw C, 32 rcall file_read brne dif_ivd cpi CL, 32 brne dif_ivd ldiw Z, LineBuf lddw A, Z+0 cpi AL, 'V' brne dif_ivd cpi AH, 'D' brne dif_ivd adiw ZL, 16 std Z+14, _0 rcall lcd_mprin ret dif_nofile: ldiw Z, id_nofile*2 rjmp lcd_fprin dif_ivd: ldiw Z, id_invalid*2 rjmp lcd_fprin
disp_item: rcall lcd_clear ldsw A, Index cp AL, AH brcc di_noitem inc AL rcall lcd_prin_val ldi AL, ':' rcall lcd_wr_chr rcall get_item rcall lcd_mprin ret di_noitem: ldiw Z, id_noitem*2 rjmp lcd_fprin
idx_next: ldsw B, Index inc BL cp BL, BH brcc PC+3 sts Index, BL ret
idx_prev: lds BL, Index subi BL, 1 brcs PC+3 sts Index, BL ret
get_item: lds DL, Index ldiw Z, List subi DL, 1 brcc PC+2 ret ld AL, Z+ cpi AL, 0 brne PC-2 rjmp PC-6
add_index: ldiw Z, LineBuf ldsw X, ListPtr ldiw C, ListPtr+2000 cpw X, C breq PC+10 ld AL, Z+ st X+, AL cpi AL, 0 brne PC-6 lds AL, Index+1 inc AL sts Index+1, AL stsw ListPtr, X ret
clr_index: stsw Index, _0 ldiw A, List stsw ListPtr, A ret
chk_index: ldd AL, Z+8 ;*.TXT cpi AL, 'T' ; brne ci_ret ; ldd AL, Z+9 ; cpi AL, 'X' ; brne ci_ret ; ldd AL, Z+10 ; cpi AL, 'T' ; brne ci_ret ;/ ldiw X, LineBuf ldi CL, 0 ld AL, Z+ inc CL cpi AL, ' '+1 brcs PC+2 st X+, AL cpi CL, 8 brne PC+3 ldi AL, '.' st X+, AL cpi CL, 11 brne PC-10 st X+, _0 ci_ret: ret
mi_err: clr T14L ldiw Z, die_ioerr*2 rjmp die
id_noitem: .db "<no item>",0 id_nofile: .db "<no file>",0 id_invalid: .db "<invalid>",0
;----------------------------------------------------------; ; Play a vector file
play: ldiw Z, Buff1 ;Get file header ldiw C, 512 ; rcall file_read_block ; rjne play_break ;/ ldiw A, 32 ;Check if the file is a valid frame data cpw C, A ; rjcs play_break ; lddw A, Z+0 ; cpi AL, 'V' ; ldi AL, 'D' ; cpc AH, AL ; rjne play_break ;/ sts VectFifo+2, _0 ;Start vector interruput lddw A, Z+4 ; rcall pps_start ;/ play_l1: ldiw A, 0 ;Seek to top of vector data ldiw B, 0 ; rcall file_seek ; brne play_break ;/ lds AL, VectFifo+2 ;Wait for FIFO empty cpi AL, 0 ; brne PC-3 ;/ ldiw Z, Buff1 ;Load first data block (with 32 byte header) ldiw C, 512 ; rcall file_read_block ; brne play_break ;/ lsrw C ;Initialize FIFO lsrw C ; subi CL, 32/4 ; ldiw A, Buff1+32 ; stsw VectFifo+0, A ; sts VectFifo+2, CL ;/ play_l2: rcall chk_rcvr ;Check if any data or key is received brne play_break ; rcall get_key_nw ; brne play_exit ;/ lds AL, VectFifo+2 ;Wait for data size in FIFO < 128 pts cpi AL, 512/4 ; brcc play_l2 ;/ addi ZH, high(512) ;WritePtr++ cpi ZH, high(Buff1+512*2) ; brcs PC+2 ; subi ZH, high(512*2) ;/ ldiw C, 512 ;Load next data block rcall file_read_block ; brne play_break ;/ lsrw C ;Number of sample ++ lsrw C ; cli ; lds AL, VectFifo+2 ; add AL, CL ; sts VectFifo+2, AL ; sei ;/ cpi CL, 512/4 ;End of block? breq play_l2 ;/ rjmp play_l1 ;Is end of block
play_break: rcall receive clr AL play_exit: push AL rcall pps_stop pop AL ret
;----------------------------------------------------------; ; Point output driver
pps_start: cpi AL, 250 ;Clip A between 250-30000 cpc AH, _0 ; brcs PC+2 ; ldi AL, 250 ; ldiw B, 30000 ; cpw A, B ; brcs PC+2 ; movw AL, BL ;/ ldi BL, byte1(SYSCLK) ;CL:B = SYSCLK ldi BH, byte2(SYSCLK) ; ldi CL, byte3(SYSCLK) ;/ clrw T0 ;CL:B /= A ldi CH, 24 ; lslw B ; rol CL ; rolw T0 ; cpw T0, A ; brcs PC+4 ; subw T0, A ; inc BL ; dec CH ; brne PC-12 ;/ outw TCNT1, _0 outw OCR1A, B outi TCCR1B, 0b00001001 cbi PORTE, OUTEN ret
pps_stop: out TCCR1B, _0 ;Stop PPS ldiw A, 2048 ldiw B, 2048 rcall set_vector ret
; Vector output interrupt
isr_tc1_coma: push AL in AL, SREG pushw A pushw B pushw X
lds AL, VectFifo+2 ;Check if vector data is available subi AL, 1 ; brcc PC+3 ; sbi PORTE, LDMOD ; Stop laser if under-flow occured rjmp vo_ret ; / sts VectFifo+2, AL ;/
ldsw X, VectFifo+0 ;X = Read ptr ldw B, X+ ;Get vector ldw A, X+ ; rcall set_vector ;/ ldiw A, Buff1+512*2 ;Next read ptr cpw X, A ; brcs PC+2 ; subi XH, high(512*2) ;/ stsw VectFifo+0, X ;Restore read ptr
vo_ret: popw X popw B popw A out SREG, AL pop AL reti
;----------------------------------------------------------; ; Vector output functions ; ; Call: A = vector Y (0..4095) ; B = vector X (0..4095), BH.7 = Mod
set_vector: andi AH, 0b00001111 ; Send Y value into buffer ori AH, 0b00010000 cbi PORTB, DACS rcall send_spi mov AH, AL rcall send_spi sbi PORTB, DACS
mov AH, BH ; Send X value and latch both channels andi AH, 0b00001111 ori AH, 0b10000000 cbi PORTB, DACS rcall send_spi mov AH, BL rcall send_spi sbi PORTB, DACS
sbrc BH, 7 ;Set modulation cbi PORTE, LDMOD ; sbrs BH, 7 ; sbi PORTE, LDMOD ;/
ret
send_spi: out SPDR, AH ldi AH, 12/3 dec AH brne PC-1 ret
после нажатия set выбивает IO Err CODE ;---------------------------------------------------------------; ; Space, CRLF
crlf: ldi AL, 13 rcall xmit ldi AL, 10 rjmp xmit
space: ldi AL,' '
;---------------------------------------------------------------; ; UART control driver
xmit: ; Transmit AL sbis UCSR0A, UDRE0 rjmp PC-1 out UDR0, AL ret
chk_rcvr: ldsw A, RxBuff cp AL, AH ret
receive:; Receive a char into AL. (ZR=no data) ldiw Y, RxBuff cli ldd AH, Y+0 ldd AL, Y+1 cp AH, AL breq PC+9 mov AL, AH inc AL andi AL, 31 std Y+0, AL add YL, AH adc YH, _0 ldd AL, Y+2 clz sei ret
isr_usart0_rx: push AL in AL, SREG push BL pushw A pushw Y in BL, UDR0 ldiw Y, RxBuff ldd AL, Y+0 ldd AH, Y+1 inc AH andi AH, 31 cp AH, AL breq PC+7 std Y+1, AH dec AH andi AH, 31 add YL, AH adc YH, _0 std Y+2, BL popw Y popw A pop BL out SREG, AL pop AL reti
;----------------------------------------------------------; ; Key driver
get_key: lds AL, KeyCmd andi AL, K_MASK breq get_key get_key_nw: lds AL, KeyCmd andi AL, K_MASK breq PC+8 sts KeyCmd, _0 lds AH, KeyCmd+1 andi AH, K_MASK swap AH or AL, AH ret
isr_tc0_com: push T0L in T0L, SREG sei pushw A
in AL, PINF com AL andi AL, K_MASK lds AH, KeyCmd+2 sts KeyCmd+2, AL cp AL, AH brne isc_0e lds AH, KeyCmd+1 sts KeyCmd+1, AL eor AH, AL and AH, AL breq isc_0e sts KeyCmd+0, AH
isc_0e: popw A out SREG, T0L pop T0L reti
;-------------------------------------------------------; ; Die with dieing message ; ;Call: Z = Pointer to the message ; T14L = Error code (0..9)
die: rcall lcd_fprin_clr mov AL, T14L rcall lcd_prin_val rjmp PC
die_mmcerr: .db "MMC Err ", 0 die_fserr: .db "FS Err ", 0 die_ioerr: .db "IO Err ", 0
;----------------------------------------------------------; ; LCD control ; ; Data:PD[3..0], RS:PD4, E:PD5 ;
.equ LCDRS = PD4 .equ LCDEN = PD5
lcd_init: rcall delay_5ms rcall delay_5ms rcall delay_5ms cbi PORTD, LCDRS ; RS=0 ldi AL, 0b00110000 rcall lcd_wr_n rcall delay_5ms ldi AL, 0b00110000 rcall lcd_wr_n rcall delay_5ms ldi AL, 0b00110000 rcall lcd_wr_n rcall delay_5ms ldi AL, 0b00100000 rcall lcd_wr_n ldi AL, 0b00101000 ;DL=0, N=1, F=0 rcall lcd_wr_cmd ldi AL, 0b00001100 ;D=1, C=0, B=0 rcall lcd_wr_cmd ldi AL, 0b00000110 ;I/D=1, S=0 rcall lcd_wr_cmd rjmp lcd_clear
lcd_prin_val: clr CH inc CH ldi CL, 8 clr AH lslw A cpi AH, 10 brcs PC+3 subi AH, 10 inc AL dec CL brne PC-7 addi AH, '0' push AH cpi AL, 0 brne PC-14 pop AL rcall lcd_wr_chr dec CH brne PC-3 ret
lcd_mprin_clr: rcall lcd_clear lcd_mprin: ld AL, Z+ tst AL brne PC+2 ret rcall lcd_wr_chr rjmp lcd_mprin
lcd_fprin_clr: rcall lcd_clear lcd_fprin: lpm AL, Z+ ;Get a char tst AL ;Zero? brne PC+2 ;/ ret rcall lcd_wr_chr ; rjmp lcd_fprin ;/
lcd_clear: stsi Lcdp, 8 ldi AL, 0x01 rcall lcd_wr_cmd rjmp delay_5ms
lcd_wr_chr: sbi PORTD, LCDRS rcall lcd_delay rcall lcd_wr_n rcall lcd_wr_n lds AL, Lcdp dec AL sts Lcdp, AL breq PC+2 ret ldi AL, 0xC0 lcd_wr_cmd: cbi PORTD, LCDRS rcall lcd_delay rcall lcd_wr_n lcd_wr_n: swap AL push AL andi AL, 0b00001111 in AH, PORTD andi AH, 0b11110000 or AH, AL out PORTD, AH pop AL sbi PORTD, LCDEN rjmp PC+1 cbi PORTD, LCDEN ret
lcd_delay: ldi AH, 848/4 ;Delay 53us dec AH ; nop ; brne PC-2 ;/ ret
delay_5ms: ;Delay 5ms ldiw X, 80000/4 sbiw XL, 1 brne PC-1 ret
в архиве лежит вся прошивка к проэкту и файлы для флэш карты
Сообщение отредактировал extreme - May 31 2010, 23:08
Прикрепленные файлы
ldp2.zip ( 503.35 килобайт )
Кол-во скачиваний: 11
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|