OpenCores
URL https://opencores.org/ocsvn/ffr16/ffr16/trunk

Subversion Repositories ffr16

[/] [ffr16/] [trunk/] [sources/] [fpu/] [050803KN/] [compile/] [FAT16RD.LOG] - Rev 3

Go to most recent revision | Compare with Previous | Blame | View Log

KCPSM Assembler log file for program 'fat16rd.psm'.
Generated by KCPSM version 1.10
Ken Chapman (Xilinx Ltd) 2002.

Addr Code

 00                                              ; FAT16 READER V.050303 - Armando Astarloa - 16 BIT VER.
 00                                              ; APERT - UPV/EHU 2003 - DISTRIBUTED UNDER GPL LICENCE
 00                                              ;
 00                                              ; s0 -> TMP0 s1 -> TMP1 s2 -> TMP2 s3 -> TMP3 s4 -> TMP4 / SECTORS_PER_CLUSTER_READED s5 -> TMP5/SECTOR_WORDS_READED (256 TO 0)
 00                                              ; s6 -> TMP s7 -> SECTORS_PER_CLUSTER s8 -> CLUSTER_BEGIN_LBA0 (FAT) s9 -> CLUSTER_BEGIN_LBA1 sA -> CLUSTER_BEGIN_LBA2 
 00                                              ; sB -> CLUSTER_BEGIN_LBA3 sC -> ROOT_DIRECTORY_FIRST_CLUSTER0 (SUPPOSED LESS THAN 256 - USUALLY 2)
 00                                              ; sD -> data[7:0] WB MASTER sE -> data[15:8] WB MASTER sF -> acummulator
 00                                              CONSTANT DATA_WB_OUT_7_0_MASTER, 00
 00                                              CONSTANT DATA_WB_OUT_15_8_MASTER, 01
 00                                              CONSTANT CONTROL_WB_OUT_MASTER, 02
 00                                              ; D7 = D6 = D5 = D4 = D3 = D2 = A0_MASTER D1 = W_WE_MASTER D0 = STB_O_MASTER
 00                                              ; STROBE_O_MASTER = 1 & W_WE=0 & WB_A0 = 0 
 00                                              CONSTANT READ_SLAVE, 01
 00                                              ; STROBE_O_MASTER = 1 & W_WE=1 & WB_A0 = 0 
 00                                              CONSTANT WRITE_LBA_15_0, 03
 00                                              ; STROBE_CF_READER = 1 & W_WE=1 & WB_A0 = 1 
 00                                              CONSTANT WRITE_LBA_27_16, 07
 00                                              ;--
 00                                              ;-- SLAVE INTERFACE
 00                                              ;--
 00                                              CONSTANT DATA_WB_OUT_7_0_SLAVE, 03
 00                                              CONSTANT DATA_WB_OUT_15_8_SLAVE, 04
 00                                              CONSTANT CONTROL_WB_OUT_SLAVE, 05
 00                                              ; D7 =  D6 =  D5  D4 =  D3 = 
 00                                              ; D2 = TAG1_ERROR
 00                                              ; D1 = TAG0_WORD_AVAILABLE
 00                                              ; D0 = ACK_O_SLAVE
 00                                              CONSTANT ACK_O_SLAVE, 01
 00                                              CONSTANT TAG0_WORD_AVAILABLE, 02
 00                                              CONSTANT ERROR, 04
 00                                              ;--
 00                                              ;-- BUS CONTROL SIGNALS
 00                                              ;--
 00                                              CONSTANT CONTROL_OUT_MASTER, 06
 00                                              ; D7 =  D6 = D5 = D4 = D3 = D2 = D1 = 
 00                                              ; D0 = WB_BUS_MASTER_WRITE_ENABLE
 00                                              CONSTANT WB_BUS_MASTER_WRITE_ENABLE, 01
 00                                              CONSTANT CONTROL_OUT_SLAVE, 07
 00                                              ; D7 =  D6 = D5 = D4 = D3 = D2 = D1 = 
 00                                              ; D0 = WB_BUS_SLAVE_WRITE_ENABLE
 00                                              CONSTANT WB_BUS_SLAVE_WRITE_ENABLE, 01
 00                                              ;--
 00                                              ;-- EXTERNAL REGISTERS FOR MORE DATA ALLOCATION (OTHER OPTION IS THE USE OF
 00                                              ;-- ANOTHER BLOCK RAM IF IT IS AVALIABLE
 00                                              ;--
 00                                              CONSTANT TMP_OUT_0, 08
 00                                              CONSTANT TMP_OUT_1, 09
 00                                              CONSTANT TMP_OUT_2, 0A
 00                                              CONSTANT TMP_OUT_3, 0B
 00                                              CONSTANT TMP_OUT_4, 0C
 00                                              CONSTANT TMP_OUT_5, 0D
 00                                              CONSTANT TMP_OUT_6, 0E
 00                                              CONSTANT TMP_OUT_7, 0F
 00                                              ;--
 00                                              ;-- INPUT PORTS
 00                                              ;--
 00                                              ;--
 00                                              ;-- WISHBONE INTERFACE PORTS - INPUTS
 00                                              ;--
 00                                              CONSTANT CONTROL_WB_IN_MASTER, 00
 00                                              ; D7 = D6 = D5 = D4 = D3 = D2 = 
 00                                              ; D1 = ERROR_INPUT
 00                                              ; D0 = ACK_I_MASTER
 00                                              ;
 00                                              CONSTANT ACK_I_MASTER, 01
 00                                              CONSTANT ERROR_INPUT, 02
 00                                              CONSTANT CONTROL_WB_IN_SLAVE, 01
 00                                              ; D7 = D6 = D5 = D4 = D3 = D2 = 
 00                                              ; D1 = -
 00                                              ; D0 = STB_I_SLAVE
 00                                              ;
 00                                              CONSTANT STB_I_SLAVE, 01
 00                                              ;CONSTANT TAG0_FORCE_RESET,02                  
 00                                              ;--
 00                                              ;-- WISHBONE INTERFACE PORTS - INPUTS
 00                                              ;--
 00                                              CONSTANT DATA_WB_IN_7_0_MASTER, 02
 00                                              CONSTANT DATA_WB_IN_15_8_MASTER, 03
 00                                              ;--
 00                                              ;-- EXTERNAL REGISTERS FOR MORE DATA ALLOCATION (OTHER OPTION IS THE USE OF
 00                                              ;-- ANOTHER BLOCK RAM IF IT IS AVALIABLE
 00                                              ;--
 00                                              CONSTANT TMP_IN_0, 04
 00                                              CONSTANT TMP_IN_1, 05
 00                                              CONSTANT TMP_IN_2, 06
 00                                              CONSTANT TMP_IN_3, 07
 00                                              CONSTANT TMP_IN_4, 08
 00                                              CONSTANT TMP_IN_5, 09
 00                                              CONSTANT TMP_IN_6, 0A
 00                                              CONSTANT TMP_IN_7, 0B
 00                                              ;--
 00                                              ;-- REGISTERS INITIALIZATION
 00                                              ;--
 00                              inicialization: 
 00                                              ;
 00                                              ; WISHBONE INTERFACES INIZIALIZATION
 00                                              ;
 00  0F00                                        LOAD sF, 00
 01  EF00                                        OUTPUT sF, DATA_WB_OUT_7_0_MASTER[00]
 02  EF01                                        OUTPUT sF, DATA_WB_OUT_15_8_MASTER[01]
 03  EF03                                        OUTPUT sF, DATA_WB_OUT_7_0_SLAVE[03]
 04  EF04                                        OUTPUT sF, DATA_WB_OUT_15_8_SLAVE[04]
 05  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
 06  EF05                                        OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
 07                                              ;
 07                                              ; WAIT FOR 410NS*3 (RESET DELAY)
 07                                              
 07                                        main: 
 07                                              ; PROCESS MASTER BOOT RECORD
 07  8348                                        CALL process_master_boot_record[48]
 08                                              ; PROCESS ROOT DIRECTORY
 08  838B                                        CALL process_root_directory[8B]
 09                                       start: 
 09  83AE                                        CALL cluster_2_lba[AE]
 0A                                              ;CALL write_lba_to_slave
 0A                                              ; sector_per_cluster -> sector_per_cluster_readed
 0A  C470                                        LOAD s4, s7
 0B                                              ; 256 -> (s6) SECTOR_WORDS_READED 
 0B  8345                                        CALL read_sector[45]
 0C                                        idle: 
 0C  A601                                        INPUT s6, CONTROL_WB_IN_SLAVE[01]
 0D                                              ; CHECK STB INPUT 
 0D                                              ; CONTROL_WB_IN_SLAVE-> TMP (s6)
 0D                                              ; IF STB=1 GO TO THE NEXT STATE 
 0D                                              ; IF STB=0 GO TO THE IDLE STATE
 0D  1601                                        AND s6, STB_I_SLAVE[01]
 0E  910C                                        JUMP Z, idle[0C]
 0F                     transfer_word_to_master: 
 0F  83E8                                        CALL read_word_from_slave[E8]
 10  83C4                                        CALL write_a_word_to_master[C4]
 11                                              ; (SECTOR WORDS READED)-1
 11  6501                                        SUB s5, 01
 12                  check_sectors_words_readed: 
 12                                              ; IF sector_words_readed = 0 THEN READ_NEW_SECTOR
 12                                              ; IF sector_words_readed > 0 THEN TRANSFER_WORD_TO_MASTER
 12  C551                                        AND s5, s5
 13  933E                                        CALL Z, check_sector_per_cluster_readed[3E]
 14  810C                                        JUMP idle[0C]
 15                           track_new_cluster: 
 15                                              ; save the number of dummy reads that must be done when the fat sector will be readed
 15                                              ; an are stored into s5 register
 15                                              ; in s0 bits 6-0 of the cluster number (offset in the sector -> 256 words-fat16 entries)
 15                                              ; as is each read operation a word is readed no multiplication is needed
 15                                              ; RESTORE CLUSTER NUMBER
 15  A008                                        INPUT s0, TMP_IN_4[08]
 16  A109                                        INPUT s1, TMP_IN_5[09]
 17  A20A                                        INPUT s2, TMP_IN_6[0A]
 18  A30B                                        INPUT s3, TMP_IN_7[0B]
 19                                              ;
 19                                              ; compose LBA address of the sector of the fat that must be readed
 19                                              ; 
 19                                              ; SHIFT RIGHT 15-8 TO 7-0 
 19                                              ;
 19  0F07                                        LOAD sF, 07
 1A                                    do_shift: 
 1A  D30E                                        SR0 s3
 1B                                              ; uses the carry for the MSB and stores LSB into the carry
 1B  D208                                        SRA s2
 1C  D108                                        SRA s1
 1D  D008                                        SRA s0
 1E  6F01                                        SUB sF, 01
 1F  951A                                        JUMP NZ, do_shift[1A]
 20  8335                                        CALL add_load_fat_begin_lba[35]
 21                                              ; adds fat_begin_lba to the sector relative to the fat obteined from the cluster
 21                                              ; now there is the lba of the FAT sector that must be readed in s0,s1,s2,s3
 21  83D3                                        CALL write_lba_to_slave[D3]
 22                                              ; -- DUMMY READ OF THE WORDS OF THE SECTOR TILL THE ONE OF THE CLUSTER INTEGER 
 22  AF08                                        INPUT sF, TMP_IN_4[08]
 23  1F7F                                        AND sF, 7F
 24  83E3                                        CALL do_dummy_reads_from_slave[E3]
 25                                              ;
 25                                              ;  (sD) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER
 25                                              ;  (sE) data[7:0] WB MASTER -> (s1) TEMPORAL REGISTER
 25                                              ; READ 2 BYTES
 25  83E8                                        CALL read_word_from_slave[E8]
 26  C0D0                                        LOAD s0, sD
 27  C1E0                                        LOAD s1, sE
 28                                              ;  (sD) data[7:0] WB MASTER -> (s2) TEMPORAL REGISTER
 28                                              ;  (sE) data[7:0] WB MASTER -> (s3) TEMPORAL REGISTER
 28                                              ; READ 2 BYTES
 28                                              ;
 28                                              ; CHECK IF ITS THE LAST ONE
 28                                              ; CB3-CL2-CB1-CB0 IN FAT LITTLE ENDIAN ORDER CB0-CB1 CB2-CB3
 28  CFE0                                        LOAD sF, sE
 29  6FFF                                        SUB sF, FF
 2A  952F                                        JUMP NZ, continue_file_processing[2F]
 2B  CFD0                                        LOAD sF, sD
 2C  6FFF                                        SUB sF, FF
 2D  952F                                        JUMP NZ, continue_file_processing[2F]
 2E                                    file_end: 
 2E                                              ; infinite loop (file readed and tranferred)
 2E  812E                                        JUMP file_end[2E]
 2F                    continue_file_processing: 
 2F                                              ; in s0,s1 is the cluster name
 2F                                              ; --
 2F                                              ; (SECTOR WORDS READED)= 256
 2F                                              ; sector_per_cluster -> sector_per_cluster_readed
 2F  0200                                        LOAD s2, 00
 30  0300                                        LOAD s3, 00
 31  C470                                        LOAD s4, s7
 32  83AE                                        CALL cluster_2_lba[AE]
 33  8345                                        CALL read_sector[45]
 34  8080                                        RETURN
 35                      add_load_fat_begin_lba: 
 35  AF04                                        INPUT sF, TMP_IN_0[04]
 36  C0F4                                        ADD s0, sF
 37  AF05                                        INPUT sF, TMP_IN_1[05]
 38  C1F5                                        ADDCY s1, sF
 39  AF06                                        INPUT sF, TMP_IN_2[06]
 3A  C2F5                                        ADDCY s2, sF
 3B  AF07                                        INPUT sF, TMP_IN_3[07]
 3C  C3F5                                        ADDCY s3, sF
 3D  8080                                        RETURN
 3E             check_sector_per_cluster_readed: 
 3E                                              ; IF sector_per_cluster_readed = 0 THEN TRACK_NEW_CLUSTER
 3E                                              ; IF sector_per_cluster_readed > 0 THEN CHECK SECTOR WORDS READED
 3E                                              ; (sector_per_cluster_readed)-1
 3E                                              ; (SECTOR WORDS READED)= 256
 3E  6401                                        SUB s4, 01
 3F  C441                                        AND s4, s4
 40  9115                                        JUMP Z, track_new_cluster[15]
 41                             read_new_sector: 
 41                                              ; (SECTOR WORDS READED)= 256
 41                                              ; increment LBA
 41                                              ; sector_per_cluster -> sector_per_cluster_readed-1
 41  4001                                        ADD s0, 01
 42  5100                                        ADDCY s1, 00
 43  5200                                        ADDCY s2, 00
 44  5300                                        ADDCY s3, 00
 45                                 read_sector: 
 45  0500                                        LOAD s5, 00
 46  83D3                                        CALL write_lba_to_slave[D3]
 47  8080                                        RETURN
 48                                              ;
 48                                              ; --
 48                                              ; -- PROCESS MASTER BOOT RECORD (READ LBA BEGIN OF THE FIRST PARTITION)
 48                                              ; --
 48                  process_master_boot_record: 
 48                                              ;
 48                                              ; LOAD LBA FOR MBR READ
 48                                              ;
 48  0000                                        LOAD s0, 00
 49  0100                                        LOAD s1, 00
 4A  0200                                        LOAD s2, 00
 4B  0300                                        LOAD s3, 00
 4C  83D3                                        CALL write_lba_to_slave[D3]
 4D                                              ; information of the lba begin for the first partition
 4D                                              ; has an offset of 454 bytes -> 227(0xE3) words
 4D  0FE3                                        LOAD sF, E3
 4E  83E3                                        CALL do_dummy_reads_from_slave[E3]
 4F                                              ;
 4F                                              ; --
 4F                                              ; -- MBR READ - Partition_LBA_Begin EXTRACTION
 4F                                              ; --
 4F                                              ;
 4F                                              ;  (sD) data[7:0] WB MASTER -> (s0) lba
 4F                                              ;  (sE) data[15:8] WB MASTER -> (s1) lba
 4F                                              ;  (sD) data[7:0] WB MASTER -> (s2) lba
 4F                                              ;  (sE) data[15:8] WB MASTER -> (s3) lba
 4F  8384                                        CALL store_all_temporal_registers[84]
 50  C800                                        LOAD s8, s0
 51  C910                                        LOAD s9, s1
 52  CA20                                        LOAD sA, s2
 53  CB30                                        LOAD sB, s3
 54                                              ;
 54                                              ; NOW IS THE LBA_BEGIN ON THE TMP REGISTERS
 54                                              ; --------------------
 54                                              ; READ FIRST SECTOR (FAT32 VOLUMEN ID) OF THE PARTITION
 54                                              ; ---------------------
 54  83D3                                        CALL write_lba_to_slave[D3]
 55                                              ;
 55                                              ; READ -> SECTORS_PER_CLUSTER (OFFSET 0x0D)
 55                                              ;
 55                                              ; offset 0x0D (13) => READ 13 bytes -> 6(0x06) words and drop LSB in the next
 55  0F06                                        LOAD sF, 06
 56  83E3                                        CALL do_dummy_reads_from_slave[E3]
 57                                              ;
 57                                              ;  (sE) data[7:0] WB MASTER -> (s7) SECTORS PER CLUSTER
 57  83E8                                        CALL read_word_from_slave[E8]
 58  C7E0                                        LOAD s7, sE
 59                                              ;
 59                                              ; READ -> Number_of_Reserved_Sectors (2 bytes) (OFFSET 0x0E)
 59                                              ;
 59                                              ; offset 0x0E (14) => READ 2 bytes -> 1(0x01) words
 59                                              ;  (sD) data[15:8] WB MASTER -> (s6) TEMPORAL REGISTER
 59  83E8                                        CALL read_word_from_slave[E8]
 5A  C6D0                                        LOAD s6, sD
 5B                                              ;  (sE) data[7:0] WB MASTER -> (s4) TEMPORAL REGISTER
 5B                                              ;
 5B  C4E0                                        LOAD s4, sE
 5C                                              ;
 5C                                              ;fat_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors
 5C                                              ;
 5C  C864                                        ADD s8, s6
 5D  C945                                        ADDCY s9, s4
 5E  5A00                                        ADDCY sA, 00
 5F  5B00                                        ADDCY sB, 00
 60                                              ; store fat_begin_lba in external registers
 60  E808                                        OUTPUT s8, TMP_OUT_0[08]
 61  E909                                        OUTPUT s9, TMP_OUT_1[09]
 62  EA0A                                        OUTPUT sA, TMP_OUT_2[0A]
 63  EB0B                                        OUTPUT sB, TMP_OUT_3[0B]
 64                                              ;
 64                                              ;cluster_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors + 
 64                                              ;                              (Number_of_FATs * Sectors_Per_FAT)+ RootDirSectors;
 64                                              ;cluster_begin_lba = fat_begin_lba + (Number_of_FATs * Sectors_Per_FAT)+ RootDirSectors;
 64                                              ; READ -> Number_of_Fats (OFFSET 0x10) (always 2)
 64                                              ;
 64                                              ; offset 0x10 (16) => READ 2 bytes -> 1(0x01) words
 64                                              ;
 64                                              ;  (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
 64  83E8                                        CALL read_word_from_slave[E8]
 65  C6D0                                        LOAD s6, sD
 66                                              ;              
 66                                              ; FOR FAT16 => NUMBER OF SECTORS OCCUPIED BY THE ROOT DIRECTORY (BYTES_PER_SEC=512) 
 66                                              ;
 66                                              ; READ -> RootEntCnt (OFFSET 0x11) (FAT16 PROCESSING)
 66                                              ; RootDirSectors=((BPB_RootEntCnt*32)+(BPB_BytesPerSec-1))/BPB_BytesPerSec
 66                                              ; offset 0x11 (17) => READ 1 bytes 
 66                                              ;
 66                                              ;  (sE) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER          
 66  C0E0                                        LOAD s0, sE
 67                                              ;  (sD) data[15:0] WB MASTER -> (sD) TEMPORAL REGISTER - offset 0x12 (18) => READ 1 bytes      
 67  83E8                                        CALL read_word_from_slave[E8]
 68  C1D0                                        LOAD s1, sD
 69                                              ; MULTIPLY BY 32 (100000) 5 SHIFTS TO THE LEFT
 69  0F05                                        LOAD sF, 05
 6A                                              ; LSB '0'
 6A                                     mult_32: 
 6A  D006                                        SL0 s0
 6B                                              ; CARRY -> LSB , MSB -> CARRY
 6B  D100                                        SLA s1
 6C  6F01                                        SUB sF, 01
 6D  956A                                        JUMP NZ, mult_32[6A]
 6E                                              ;BPB_RootEntCnt*32+(BPB_BytesPerSec-1) 511 (0x1FF)
 6E                                              ;ADD s0,FF (if rounds up => not necessary??)
 6E                                              ;ADDCY s1,01
 6E                                              ;/BPB_BytesPerSec (512) (1000000000)9 SHIFTS TO THE RIGHT
 6E  0F09                                        LOAD sF, 09
 6F                                     div_512: 
 6F                                              ; uses the carry for the MSB and stores LSB into the carry
 6F  D10E                                        SR0 s1
 70  D008                                        SRA s0
 71  6F01                                        SUB sF, 01
 72  956F                                        JUMP NZ, div_512[6F]
 73                                              ; ROUNDs UP
 73                                              ;ADD s0,01
 73                                              ;ADDCY s1,00
 73                                              ;fat_begin_lba + RootDirSectors
 73  C804                                        ADD s8, s0
 74  C915                                        ADDCY s9, s1
 75  CA25                                        ADDCY sA, s2
 76  CB35                                        ADDCY sB, s3
 77                                              ; READ -> Sectors_per_fat (OFFSET 0x24)
 77                                              ;
 77                                              ; offset 0x16 (22) => READ 2 bytes -> 01(0x01) words
 77                                              ;
 77  0F01                                        LOAD sF, 01
 78  83E3                                        CALL do_dummy_reads_from_slave[E3]
 79  8384                                        CALL store_all_temporal_registers[84]
 7A                                              ;  (Number_of_FATs * Sectors_Per_FAT)
 7A                                              ; Number_of_FATs = 2 (10) . Do a shift to the left of the Sectors_Per_Fat
 7A                                              ; ***  FAT16 = Sectors_per_fat(BPB_FATSz16)
 7A                                              ; LSB '0'
 7A  D006                                        SL0 s0
 7B                                              ; CARRY -> LSB , MSB -> CARRY
 7B  D100                                        SLA s1
 7C                                              ;SLA s2 for fat16 only 2 bytes
 7C                                              ;SLA s3
 7C                                              ; fat_begin_lba + RootDirSectors + (Number_of_FATs * Sectors_Per_FAT)
 7C  C804                                        ADD s8, s0
 7D  C915                                        ADDCY s9, s1
 7E  5A00                                        ADDCY sA, 00
 7F  5B00                                        ADDCY sB, 00
 80                                              ; cluster_begin_lba is stored in s8, s9, sA, SB
 80                                              ;
 80                                              ; FOR FAT16 ROOT DIRECTORY POSITION IS FIXED 
 80                                              ; root_first_lba =  fat_begin_lba(in external regs) + (Number_of_FATs * Sectors_Per_FAT) (s0,s1,s2,s3)
 80                                              ;
 80  0200                                        LOAD s2, 00
 81  0300                                        LOAD s3, 00
 82  8335                                        CALL add_load_fat_begin_lba[35]
 83                                              ; s0,s1,s2,s3 have Root directory begin lba
 83  8080                                        RETURN
 84                store_all_temporal_registers: 
 84                                              ; READ 2 BYTES
 84  83E8                                        CALL read_word_from_slave[E8]
 85                                              ;  (sD) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER
 85                                              ;  (sE) data[7:0] WB MASTER -> (s1) TEMPORAL REGISTER
 85  C0D0                                        LOAD s0, sD
 86  C1E0                                        LOAD s1, sE
 87                                              ;  (sD) data[7:0] WB MASTER -> (s2) TEMPORAL REGISTER
 87                                              ;  (sE) data[7:0] WB MASTER -> (s3) TEMPORAL REGISTER
 87                                              ; READ 2 BYTES
 87  83E8                                        CALL read_word_from_slave[E8]
 88  C2D0                                        LOAD s2, sD
 89  C3E0                                        LOAD s3, sE
 8A  8080                                        RETURN
 8B                      process_root_directory: 
 8B                                              ; INPUT :
 8B                                              ; s0,s1,s2,s3 root directory lba (FAT16- FIXED)
 8B                                              ; CALL cluster_2_lba
 8B                                              ; now s0,s1,s2,s3 contains the lba for the root directory
 8B                                              ; the first 32 byte record on the sector must be the root directory information
 8B                                              ; check if EOF (first byte of the 32 bytes is 0)
 8B  83D3                                        CALL write_lba_to_slave[D3]
 8C                            check_for_a_file: 
 8C  83E8                                        CALL read_word_from_slave[E8]
 8D                                              ;  (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
 8D  C6D0                                        LOAD s6, sD
 8E  CF60                                        LOAD sF, s6
 8F  CFF1                                        AND sF, sF
 90                                              ; if sF=0 the is not directory => error
 90  91F2                                        JUMP Z, put_error_code[F2]
 91                                              ;
 91                                              ; check that is not a deleted entry
 91                                              ;
 91                                              ;  (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
 91  0FE5                                        LOAD sF, E5
 92  CF61                                        AND sF, s6
 93                                              ; if s6=E5 is a deteled entry => check for new one (offset => sF)
 93  919D                                        JUMP Z, check_next_directory_entry[9D]
 94                             check_attribute: 
 94                                              ; ATTRIBUTE -> OFFSET Bh
 94                                              ; check that is not a directory or LONG NAME
 94                                              ; 00arshdv - DV for long name - D for directory
 94                                              ;  (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
 94  0F04                                        LOAD sF, 04
 95  83E3                                        CALL do_dummy_reads_from_slave[E3]
 96  83E8                                        CALL read_word_from_slave[E8]
 97  C6E0                                        LOAD s6, sE
 98  0F03                                        LOAD sF, 03
 99  CF61                                        AND sF, s6
 9A  959F                                        JUMP NZ, check_next_directory_entry_attribute[9F]
 9B                                              ; if s6=0 that is not a file => error
 9B                                              ;JUMP Z,check_next_directory_entry             
 9B                                              ; check that is not a directory
 9B                                              ; check that is a file (short filename entry)
 9B                                              ; in other case error
 9B                                              ; 
 9B                                              ;
 9B                                              ; READ CLUSTER INFORMATION FOR THE FILE
 9B                                              ;
 9B  83A2                                        CALL read_dir_cluster_hi_cluster_low[A2]
 9C  8080                                        RETURN
 9D                  check_next_directory_entry: 
 9D                                              ; go fwd 11 words
 9D  0F05                                        LOAD sF, 05
 9E  83E3                                        CALL do_dummy_reads_from_slave[E3]
 9F        check_next_directory_entry_attribute: 
 9F                                              ; go fwd 5 words
 9F  0F0A                                        LOAD sF, 0A
 A0  83E3                                        CALL do_dummy_reads_from_slave[E3]
 A1  818C                                        JUMP check_for_a_file[8C]
 A2             read_dir_cluster_hi_cluster_low: 
 A2                                              ; INPUT :
 A2                                              ;         before arrive here first two bytes of the directory 
 A2                                              ;         structure must be readed 
 A2                                              ; OUTPUT :
 A2                                              ; s0,s1 : CLUS_LOW 
 A2                                              ; s2,s3 : CLUS_HI
 A2                                              ;
 A2                                              ; READ -> cluster_HI (OFFSET 0x14) 
 A2                                              ;
 A2                                              ; offset 0x14 (20) => READ 18 bytes -> 9(0x09) words
 A2                                              ;
 A2  0F04                                        LOAD sF, 04
 A3  83E3                                        CALL do_dummy_reads_from_slave[E3]
 A4                                              ;  (sD) data[7:0] WB MASTER -> s2
 A4                                              ;  (sE) data[7:0] WB MASTER -> s3
 A4                                              ; READ 2 BYTES
 A4  83E8                                        CALL read_word_from_slave[E8]
 A5  C2D0                                        LOAD s2, sD
 A6  C3E0                                        LOAD s3, sE
 A7  EE0F                                        OUTPUT sE, TMP_OUT_7[0F]
 A8                                              ;
 A8                                              ; READ -> cluster_low(OFFSET 0x1A) 
 A8                                              ;
 A8                                              ; offset 0x1A (26) => READ 4 bytes -> 2(0x02) words
 A8                                              ;
 A8  0F02                                        LOAD sF, 02
 A9  83E3                                        CALL do_dummy_reads_from_slave[E3]
 AA                                              ;  (sD) data[7:0] WB MASTER ->  s0
 AA                                              ;  (sE) data[7:0] WB MASTER ->  s1
 AA                                              ; READ 2 BYTES
 AA  83E8                                        CALL read_word_from_slave[E8]
 AB  C0D0                                        LOAD s0, sD
 AC  C1E0                                        LOAD s1, sE
 AD                                              ; s0,s1 clus_low s3,s4 - clus_high
 AD  8080                                        RETURN
 AE                                              ; -- MBR READ OPERATION - LBA BEGIN DETERMINATION
 AE                                              ; '00' -> LBA_7_0,LBA_15_8,LBA_23_16,LD_LBA_27_24
 AE                               cluster_2_lba: 
 AE                                              ; --
 AE                                              ; -- LBA ADDRESS DETERMINATION
 AE                                              ; --
 AE                                              ; lba_addr = cluster_begin_lba + (cluster_number - 2) * sectors_per_cluster;  
 AE                                              ;
 AE                                              ; INPUT :
 AE                                              ; s0 : CLUSTER_NUMBER0, s1 : CLUSTER_NUMBER1, s2: CLUSTER_NUMBER2, s3 : CLUSTER_NUMBER3
 AE                                              ; OUTPUT :
 AE                                              ; s0 : LBA_ADDR_7_0 TMP1, s1 : LBA_ADDR_15_8, s2 : LBA_ADDR_24_16, s3 : LBA_ADDR_27_24
 AE                                              ;
 AE                                              ; cluster_number - 2
 AE                                              ;
 AE  E00C                                        OUTPUT s0, TMP_OUT_4[0C]
 AF  E10D                                        OUTPUT s1, TMP_OUT_5[0D]
 B0  E20E                                        OUTPUT s2, TMP_OUT_6[0E]
 B1  E30F                                        OUTPUT s3, TMP_OUT_7[0F]
 B2  6002                                        SUB s0, 02
 B3  7100                                        SUBCY s1, 00
 B4  7200                                        SUBCY s2, 00
 B5  7300                                        SUBCY s3, 00
 B6                                              ;
 B6                                              ; (cluster_number - 2) * sectors_per_cluster(s7);
 B6                                              ;
 B6                                              ; to perform the multiplication as sector_per_cluster is 2 multiple must be known
 B6                                              ; who many times must be shifted
 B6                                              ; (use sD as temporal register)
 B6  0F08                                        LOAD sF, 08
 B7  CD70                                        LOAD sD, s7
 B8                                    multiply: 
 B8  DD0E                                        SR0 sD
 B9                                              ; loop until detection of the 1 (2 multiple) - Add timeout!!!
 B9  99BF                                        JUMP C, add_cluster_begin_lba[BF]
 BA                                              ; LSB '0'
 BA  D006                                        SL0 s0
 BB                                              ; CARRY -> LSB , MSB -> CARRY
 BB  D100                                        SLA s1
 BC  D200                                        SLA s2
 BD  D300                                        SLA s3
 BE  81B8                                        JUMP multiply[B8]
 BF                       add_cluster_begin_lba: 
 BF                                              ; lba_addr (TMP0,TMP1,TMP2,TMP3)= cluster_begin_lba + (cluster_number - 2) * sectors_per_cluster;  
 BF  C084                                        ADD s0, s8
 C0  C195                                        ADDCY s1, s9
 C1  C2A5                                        ADDCY s2, sA
 C2  C3B5                                        ADDCY s3, sB
 C3  8080                                        RETURN
 C4                                              ; --
 C4                                              ; -- WRITE A WORD INTO THE WB SLAVE INTERFACE (TO THE MASTER)
 C4                                              ; --
 C4                                              ; INPUTS :
 C4                                              ; TMP0 : LSB TO DATA_WB_OUT_7_0_SLAVE
 C4                                              ; TMP1 : MSB TO DATA_WB_OUT_15_8_SLAVE
 C4                                              ;
 C4                      write_a_word_to_master: 
 C4                                              ; TMP0 => DATA_WB_OUT_7_0_SLAVE
 C4  ED03                                        OUTPUT sD, DATA_WB_OUT_7_0_SLAVE[03]
 C5                                              ; 00 => DATA_WB_OUT_15_8_SLAVE
 C5                                              ;LOAD sF,00 -- 8 BIT VERSION
 C5                                              ;OUTPUT sF,DATA_WB_OUT_15_8_SLAVE -- 8 BIT VERSION
 C5  EE04                                        OUTPUT sE, DATA_WB_OUT_15_8_SLAVE[04]
 C6  83CB                                        CALL write_a_byte_to_master[CB]
 C7                                              ; 
 C7                                              ; CHECK STB INPUT | CONTROL_WB_IN_SLAVE-> TMP (s6)
 C7                                              ;
 C7                                 wait_strobe: 
 C7  A601                                        INPUT s6, CONTROL_WB_IN_SLAVE[01]
 C8                                              ;
 C8                                              ;
 C8  1601                                        AND s6, STB_I_SLAVE[01]
 C9  91C7                                        JUMP Z, wait_strobe[C7]
 CA                                              ; TMP1 => DATA_WB_OUT_7_0_SLAVE
 CA                                              ; OUTPUT sE,DATA_WB_OUT_7_0_SLAVE
 CA                                              ; 00 =>DATA_WB_OUT_15_8_SLAVE
 CA                                              ;LOAD sF,00 -- 8 BIT VERSION
 CA                                              ;OUTPUT sF,DATA_WB_OUT_15_8_SLAVE -- 8 BIT VERSION
 CA                                              ;CALL write_a_byte_to_master -- 8 BIT VERSION
 CA  8080                                        RETURN
 CB                      write_a_byte_to_master: 
 CB                                              ;
 CB                                              ; WB SLAVE WRITE ENABLE ACTIVE
 CB                                              ;
 CB  0F01                                        LOAD sF, WB_BUS_SLAVE_WRITE_ENABLE[01]
 CC  EF07                                        OUTPUT sF, CONTROL_OUT_SLAVE[07]
 CD                                              ;
 CD                                              ; ACK TO THE MASTER UNTIL STB FINISH
 CD                                              ;
 CD                           ack_to_the_master: 
 CD  0F01                                        LOAD sF, ACK_O_SLAVE[01]
 CE  EF05                                        OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
 CF                                              ;
 CF                                              ;
 CF  0F00                                        LOAD sF, 00
 D0  EF07                                        OUTPUT sF, CONTROL_OUT_SLAVE[07]
 D1  EF05                                        OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
 D2  8080                                        RETURN
 D3                                              ; --
 D3                                              ; -- WRITE A LBA INTO THE WB MASTER INTERFACE (TO THE SLAVE)
 D3                                              ; --
 D3                                              ; INPUTS :
 D3                                              ; TMP0 : LBA_ADDR_7_0, TMP1 : LBA_ADDR_15_8, TMP2 : LBA_ADDR_24_16, TMP3 : LBA_ADDR_27_24
 D3                                              ;
 D3                                              ;
 D3                          write_lba_to_slave: 
 D3                                              ;
 D3                                              ; WB MASTER WRITE ENABLE ACTIVE
 D3                                              ;
 D3  0F01                                        LOAD sF, WB_BUS_MASTER_WRITE_ENABLE[01]
 D4  EF06                                        OUTPUT sF, CONTROL_OUT_MASTER[06]
 D5                                              
 D5                                              ;write_lba_15_0_to_slave:
 D5                                              ;
 D5                                              ; TMP0 : LBA_ADDR_7_0 (s0)     => DATA_WB_OUT_7_0_MASTER
 D5                                              ; TMP1 : LBA_ADDR_15_8 (s1)    => DATA_WB_OUT_15_8_MASTER
 D5                                              ;
 D5  E000                                        OUTPUT s0, DATA_WB_OUT_7_0_MASTER[00]
 D6  E101                                        OUTPUT s1, DATA_WB_OUT_15_8_MASTER[01]
 D7                                              ;
 D7                                              ; --
 D7                                              ; -- WRITE LBA 15-0 TO THE SLAVE
 D7                                              ; -- 
 D7                                              ;
 D7                                              ; WB_CONTROL_OUT_MASTER
 D7                                              ; W_WE_MASTER = 1
 D7                                              ; STB_O_MASTER = 1
 D7                                              ; A0 = 0
 D7                                              ;
 D7  0F03                                        LOAD sF, WRITE_LBA_15_0[03]
 D8  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
 D9                                              ;
 D9                                              ; WAIT FOR THE ACK
 D9                                              ;
 D9  83EA                                        CALL wait_for_the_ack[EA]
 DA                                              ;write_lba_27_16_to_slave:     
 DA                                              ;
 DA                                              ; TMP2 : LBA_ADDR_23_16 (s2)   => DATA_WB_OUT_7_0_MASTER
 DA                                              ; TMP3 : LBA_ADDR_27_24 (s3)   => DATA_WB_OUT_15_8_MASTER
 DA                                              ;
 DA  E200                                        OUTPUT s2, DATA_WB_OUT_7_0_MASTER[00]
 DB  E301                                        OUTPUT s3, DATA_WB_OUT_15_8_MASTER[01]
 DC                                              
 DC                                              ; -- 
 DC                                              ; -- WRITE LBA 27-16 TO THE SLAVE
 DC                                              ; -- 
 DC                                              ; WB_CONTROL_OUT_MASTER
 DC                                              ; W_WE_MASTER = 1
 DC                                              ; STB_O_MASTER = 1
 DC                                              ; A0 = 0
 DC                                              ;
 DC  0F07                                        LOAD sF, WRITE_LBA_27_16[07]
 DD  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
 DE                                              ;
 DE                                              ; WAIT FOR THE ACK     
 DE                                              ;
 DE  83EA                                        CALL wait_for_the_ack[EA]
 DF                                              ; --
 DF                                              ; -- FINISH WRITE OPERATION ON THE MASTER WB INTERFACE
 DF                                              ; --
 DF                                              ;
 DF                                              ; WB_CONTROL_OUT_MASTER
 DF                                              ; W_WE_MASTER = 0
 DF                                              ; STB_O_MASTER = 0
 DF                                              ; A0 = 0
 DF                                              ;
 DF  0F00                                        LOAD sF, 00
 E0  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
 E1  EF06                                        OUTPUT sF, CONTROL_OUT_MASTER[06]
 E2  8080                                        RETURN
 E3                                              ; --
 E3                                              ; -- PERFORM DUMMY READS FROM THE WB SLAVE
 E3                                              ; --
 E3                                              ; -- IN sF ARE THE NUMBER OF WORDS THAT MUST BE READED
 E3                                              ; --
 E3                   do_dummy_reads_from_slave: 
 E3  C6F0                                        LOAD s6, sF
 E4                      dummy_reads_from_slave: 
 E4  83E8                                        CALL read_word_from_slave[E8]
 E5  6601                                        SUB s6, 01
 E6  95E4                                        JUMP NZ, dummy_reads_from_slave[E4]
 E7  8080                                        RETURN
 E8                                              
 E8                                              ; --
 E8                                              ; -- PERFORM A WORD READING FROM THE WB SLAVE
 E8                                              ; --
 E8                        read_word_from_slave: 
 E8                                              ; WB_CONTROL_OUT_MASTER
 E8                                              ; W_WE_MASTER = 0
 E8                                              ; STB_O_MASTER = 1
 E8                                              ; A0 = 0
 E8                                              ; wait state
 E8  0F01                                        LOAD sF, READ_SLAVE[01]
 E9  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
 EA                                              ;
 EA                                              ; WAIT FOR THE ACK     
 EA                                              ;
 EA                                              ; CALL wait_for_the_ack
 EA                                              ;JUMP Z,data_available_on_wb_master
 EA                            wait_for_the_ack: 
 EA                                              ;
 EA                                              ; CONTROL_WB_IN_MASTER -> TMP (s6)
 EA                                              ;
 EA  AF00                                        INPUT sF, CONTROL_WB_IN_MASTER[00]
 EB                                              ;
 EB  1F01                                        AND sF, ACK_I_MASTER[01]
 EC  91EA                                        JUMP Z, wait_for_the_ack[EA]
 ED                 data_available_on_wb_master: 
 ED                                              ; This part is not necessary in write operations
 ED                                              ; DATA_WB_IN_7_0_MASTER -> (sD) data[7:0] WB MASTER
 ED                                              ; DATA_WB_IN_15_8_MASTER -> (sE) data[15:8] WB MASTER
 ED  AD02                                        INPUT sD, DATA_WB_IN_7_0_MASTER[02]
 EE  AE03                                        INPUT sE, DATA_WB_IN_15_8_MASTER[03]
 EF                                              ; DISABLE RD/WR OPERATION REQUEST
 EF  0F00                                        LOAD sF, 00
 F0  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
 F1  8080                                        RETURN
 F2                              put_error_code: 
 F2  0F04                                        LOAD sF, ERROR[04]
 F3  EF05                                        OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
 F4  81F2                                        JUMP put_error_code[F2]
 F5                                   interrupt: 
 F5  80F0                                        RETURNI ENABLE

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.