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

Subversion Repositories ffr16

[/] [ffr16/] [branches/] [APERT/] [sources/] [fpu/] [050803KN/] [compile/] [FAT16RD.LOG] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 armando
KCPSM Assembler log file for program 'fat16rd.psm'.
2
Generated by KCPSM version 1.10
3
Ken Chapman (Xilinx Ltd) 2002.
4
 
5
Addr Code
6
 
7
 00                                              ; FAT16 READER V.050303 - Armando Astarloa - 16 BIT VER.
8
 00                                              ; APERT - UPV/EHU 2003 - DISTRIBUTED UNDER GPL LICENCE
9
 00                                              ;
10
 00                                              ; s0 -> TMP0 s1 -> TMP1 s2 -> TMP2 s3 -> TMP3 s4 -> TMP4 / SECTORS_PER_CLUSTER_READED s5 -> TMP5/SECTOR_WORDS_READED (256 TO 0)
11
 00                                              ; s6 -> TMP s7 -> SECTORS_PER_CLUSTER s8 -> CLUSTER_BEGIN_LBA0 (FAT) s9 -> CLUSTER_BEGIN_LBA1 sA -> CLUSTER_BEGIN_LBA2
12
 00                                              ; sB -> CLUSTER_BEGIN_LBA3 sC -> ROOT_DIRECTORY_FIRST_CLUSTER0 (SUPPOSED LESS THAN 256 - USUALLY 2)
13
 00                                              ; sD -> data[7:0] WB MASTER sE -> data[15:8] WB MASTER sF -> acummulator
14
 00                                              CONSTANT DATA_WB_OUT_7_0_MASTER, 00
15
 00                                              CONSTANT DATA_WB_OUT_15_8_MASTER, 01
16
 00                                              CONSTANT CONTROL_WB_OUT_MASTER, 02
17
 00                                              ; D7 = D6 = D5 = D4 = D3 = D2 = A0_MASTER D1 = W_WE_MASTER D0 = STB_O_MASTER
18
 00                                              ; STROBE_O_MASTER = 1 & W_WE=0 & WB_A0 = 0
19
 00                                              CONSTANT READ_SLAVE, 01
20
 00                                              ; STROBE_O_MASTER = 1 & W_WE=1 & WB_A0 = 0
21
 00                                              CONSTANT WRITE_LBA_15_0, 03
22
 00                                              ; STROBE_CF_READER = 1 & W_WE=1 & WB_A0 = 1
23
 00                                              CONSTANT WRITE_LBA_27_16, 07
24
 00                                              ;--
25
 00                                              ;-- SLAVE INTERFACE
26
 00                                              ;--
27
 00                                              CONSTANT DATA_WB_OUT_7_0_SLAVE, 03
28
 00                                              CONSTANT DATA_WB_OUT_15_8_SLAVE, 04
29
 00                                              CONSTANT CONTROL_WB_OUT_SLAVE, 05
30
 00                                              ; D7 =  D6 =  D5  D4 =  D3 =
31
 00                                              ; D2 = TAG1_ERROR
32
 00                                              ; D1 = TAG0_WORD_AVAILABLE
33
 00                                              ; D0 = ACK_O_SLAVE
34
 00                                              CONSTANT ACK_O_SLAVE, 01
35
 00                                              CONSTANT TAG0_WORD_AVAILABLE, 02
36
 00                                              CONSTANT ERROR, 04
37
 00                                              ;--
38
 00                                              ;-- BUS CONTROL SIGNALS
39
 00                                              ;--
40
 00                                              CONSTANT CONTROL_OUT_MASTER, 06
41
 00                                              ; D7 =  D6 = D5 = D4 = D3 = D2 = D1 =
42
 00                                              ; D0 = WB_BUS_MASTER_WRITE_ENABLE
43
 00                                              CONSTANT WB_BUS_MASTER_WRITE_ENABLE, 01
44
 00                                              CONSTANT CONTROL_OUT_SLAVE, 07
45
 00                                              ; D7 =  D6 = D5 = D4 = D3 = D2 = D1 =
46
 00                                              ; D0 = WB_BUS_SLAVE_WRITE_ENABLE
47
 00                                              CONSTANT WB_BUS_SLAVE_WRITE_ENABLE, 01
48
 00                                              ;--
49
 00                                              ;-- EXTERNAL REGISTERS FOR MORE DATA ALLOCATION (OTHER OPTION IS THE USE OF
50
 00                                              ;-- ANOTHER BLOCK RAM IF IT IS AVALIABLE
51
 00                                              ;--
52
 00                                              CONSTANT TMP_OUT_0, 08
53
 00                                              CONSTANT TMP_OUT_1, 09
54
 00                                              CONSTANT TMP_OUT_2, 0A
55
 00                                              CONSTANT TMP_OUT_3, 0B
56
 00                                              CONSTANT TMP_OUT_4, 0C
57
 00                                              CONSTANT TMP_OUT_5, 0D
58
 00                                              CONSTANT TMP_OUT_6, 0E
59
 00                                              CONSTANT TMP_OUT_7, 0F
60
 00                                              ;--
61
 00                                              ;-- INPUT PORTS
62
 00                                              ;--
63
 00                                              ;--
64
 00                                              ;-- WISHBONE INTERFACE PORTS - INPUTS
65
 00                                              ;--
66
 00                                              CONSTANT CONTROL_WB_IN_MASTER, 00
67
 00                                              ; D7 = D6 = D5 = D4 = D3 = D2 =
68
 00                                              ; D1 = ERROR_INPUT
69
 00                                              ; D0 = ACK_I_MASTER
70
 00                                              ;
71
 00                                              CONSTANT ACK_I_MASTER, 01
72
 00                                              CONSTANT ERROR_INPUT, 02
73
 00                                              CONSTANT CONTROL_WB_IN_SLAVE, 01
74
 00                                              ; D7 = D6 = D5 = D4 = D3 = D2 =
75
 00                                              ; D1 = -
76
 00                                              ; D0 = STB_I_SLAVE
77
 00                                              ;
78
 00                                              CONSTANT STB_I_SLAVE, 01
79
 00                                              ;CONSTANT TAG0_FORCE_RESET,02
80
 00                                              ;--
81
 00                                              ;-- WISHBONE INTERFACE PORTS - INPUTS
82
 00                                              ;--
83
 00                                              CONSTANT DATA_WB_IN_7_0_MASTER, 02
84
 00                                              CONSTANT DATA_WB_IN_15_8_MASTER, 03
85
 00                                              ;--
86
 00                                              ;-- EXTERNAL REGISTERS FOR MORE DATA ALLOCATION (OTHER OPTION IS THE USE OF
87
 00                                              ;-- ANOTHER BLOCK RAM IF IT IS AVALIABLE
88
 00                                              ;--
89
 00                                              CONSTANT TMP_IN_0, 04
90
 00                                              CONSTANT TMP_IN_1, 05
91
 00                                              CONSTANT TMP_IN_2, 06
92
 00                                              CONSTANT TMP_IN_3, 07
93
 00                                              CONSTANT TMP_IN_4, 08
94
 00                                              CONSTANT TMP_IN_5, 09
95
 00                                              CONSTANT TMP_IN_6, 0A
96
 00                                              CONSTANT TMP_IN_7, 0B
97
 00                                              ;--
98
 00                                              ;-- REGISTERS INITIALIZATION
99
 00                                              ;--
100
 00                              inicialization:
101
 00                                              ;
102
 00                                              ; WISHBONE INTERFACES INIZIALIZATION
103
 00                                              ;
104
 00  0F00                                        LOAD sF, 00
105
 01  EF00                                        OUTPUT sF, DATA_WB_OUT_7_0_MASTER[00]
106
 02  EF01                                        OUTPUT sF, DATA_WB_OUT_15_8_MASTER[01]
107
 03  EF03                                        OUTPUT sF, DATA_WB_OUT_7_0_SLAVE[03]
108
 04  EF04                                        OUTPUT sF, DATA_WB_OUT_15_8_SLAVE[04]
109
 05  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
110
 06  EF05                                        OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
111
 07                                              ;
112
 07                                              ; WAIT FOR 410NS*3 (RESET DELAY)
113
 07
114
 07                                        main:
115
 07                                              ; PROCESS MASTER BOOT RECORD
116
 07  8348                                        CALL process_master_boot_record[48]
117
 08                                              ; PROCESS ROOT DIRECTORY
118
 08  838B                                        CALL process_root_directory[8B]
119
 09                                       start:
120
 09  83AE                                        CALL cluster_2_lba[AE]
121
 0A                                              ;CALL write_lba_to_slave
122
 0A                                              ; sector_per_cluster -> sector_per_cluster_readed
123
 0A  C470                                        LOAD s4, s7
124
 0B                                              ; 256 -> (s6) SECTOR_WORDS_READED
125
 0B  8345                                        CALL read_sector[45]
126
 0C                                        idle:
127
 0C  A601                                        INPUT s6, CONTROL_WB_IN_SLAVE[01]
128
 0D                                              ; CHECK STB INPUT
129
 0D                                              ; CONTROL_WB_IN_SLAVE-> TMP (s6)
130
 0D                                              ; IF STB=1 GO TO THE NEXT STATE
131
 0D                                              ; IF STB=0 GO TO THE IDLE STATE
132
 0D  1601                                        AND s6, STB_I_SLAVE[01]
133
 0E  910C                                        JUMP Z, idle[0C]
134
 0F                     transfer_word_to_master:
135
 0F  83E8                                        CALL read_word_from_slave[E8]
136
 10  83C4                                        CALL write_a_word_to_master[C4]
137
 11                                              ; (SECTOR WORDS READED)-1
138
 11  6501                                        SUB s5, 01
139
 12                  check_sectors_words_readed:
140
 12                                              ; IF sector_words_readed = 0 THEN READ_NEW_SECTOR
141
 12                                              ; IF sector_words_readed > 0 THEN TRANSFER_WORD_TO_MASTER
142
 12  C551                                        AND s5, s5
143
 13  933E                                        CALL Z, check_sector_per_cluster_readed[3E]
144
 14  810C                                        JUMP idle[0C]
145
 15                           track_new_cluster:
146
 15                                              ; save the number of dummy reads that must be done when the fat sector will be readed
147
 15                                              ; an are stored into s5 register
148
 15                                              ; in s0 bits 6-0 of the cluster number (offset in the sector -> 256 words-fat16 entries)
149
 15                                              ; as is each read operation a word is readed no multiplication is needed
150
 15                                              ; RESTORE CLUSTER NUMBER
151
 15  A008                                        INPUT s0, TMP_IN_4[08]
152
 16  A109                                        INPUT s1, TMP_IN_5[09]
153
 17  A20A                                        INPUT s2, TMP_IN_6[0A]
154
 18  A30B                                        INPUT s3, TMP_IN_7[0B]
155
 19                                              ;
156
 19                                              ; compose LBA address of the sector of the fat that must be readed
157
 19                                              ;
158
 19                                              ; SHIFT RIGHT 15-8 TO 7-0
159
 19                                              ;
160
 19  0F07                                        LOAD sF, 07
161
 1A                                    do_shift:
162
 1A  D30E                                        SR0 s3
163
 1B                                              ; uses the carry for the MSB and stores LSB into the carry
164
 1B  D208                                        SRA s2
165
 1C  D108                                        SRA s1
166
 1D  D008                                        SRA s0
167
 1E  6F01                                        SUB sF, 01
168
 1F  951A                                        JUMP NZ, do_shift[1A]
169
 20  8335                                        CALL add_load_fat_begin_lba[35]
170
 21                                              ; adds fat_begin_lba to the sector relative to the fat obteined from the cluster
171
 21                                              ; now there is the lba of the FAT sector that must be readed in s0,s1,s2,s3
172
 21  83D3                                        CALL write_lba_to_slave[D3]
173
 22                                              ; -- DUMMY READ OF THE WORDS OF THE SECTOR TILL THE ONE OF THE CLUSTER INTEGER
174
 22  AF08                                        INPUT sF, TMP_IN_4[08]
175
 23  1F7F                                        AND sF, 7F
176
 24  83E3                                        CALL do_dummy_reads_from_slave[E3]
177
 25                                              ;
178
 25                                              ;  (sD) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER
179
 25                                              ;  (sE) data[7:0] WB MASTER -> (s1) TEMPORAL REGISTER
180
 25                                              ; READ 2 BYTES
181
 25  83E8                                        CALL read_word_from_slave[E8]
182
 26  C0D0                                        LOAD s0, sD
183
 27  C1E0                                        LOAD s1, sE
184
 28                                              ;  (sD) data[7:0] WB MASTER -> (s2) TEMPORAL REGISTER
185
 28                                              ;  (sE) data[7:0] WB MASTER -> (s3) TEMPORAL REGISTER
186
 28                                              ; READ 2 BYTES
187
 28                                              ;
188
 28                                              ; CHECK IF ITS THE LAST ONE
189
 28                                              ; CB3-CL2-CB1-CB0 IN FAT LITTLE ENDIAN ORDER CB0-CB1 CB2-CB3
190
 28  CFE0                                        LOAD sF, sE
191
 29  6FFF                                        SUB sF, FF
192
 2A  952F                                        JUMP NZ, continue_file_processing[2F]
193
 2B  CFD0                                        LOAD sF, sD
194
 2C  6FFF                                        SUB sF, FF
195
 2D  952F                                        JUMP NZ, continue_file_processing[2F]
196
 2E                                    file_end:
197
 2E                                              ; infinite loop (file readed and tranferred)
198
 2E  812E                                        JUMP file_end[2E]
199
 2F                    continue_file_processing:
200
 2F                                              ; in s0,s1 is the cluster name
201
 2F                                              ; --
202
 2F                                              ; (SECTOR WORDS READED)= 256
203
 2F                                              ; sector_per_cluster -> sector_per_cluster_readed
204
 2F  0200                                        LOAD s2, 00
205
 30  0300                                        LOAD s3, 00
206
 31  C470                                        LOAD s4, s7
207
 32  83AE                                        CALL cluster_2_lba[AE]
208
 33  8345                                        CALL read_sector[45]
209
 34  8080                                        RETURN
210
 35                      add_load_fat_begin_lba:
211
 35  AF04                                        INPUT sF, TMP_IN_0[04]
212
 36  C0F4                                        ADD s0, sF
213
 37  AF05                                        INPUT sF, TMP_IN_1[05]
214
 38  C1F5                                        ADDCY s1, sF
215
 39  AF06                                        INPUT sF, TMP_IN_2[06]
216
 3A  C2F5                                        ADDCY s2, sF
217
 3B  AF07                                        INPUT sF, TMP_IN_3[07]
218
 3C  C3F5                                        ADDCY s3, sF
219
 3D  8080                                        RETURN
220
 3E             check_sector_per_cluster_readed:
221
 3E                                              ; IF sector_per_cluster_readed = 0 THEN TRACK_NEW_CLUSTER
222
 3E                                              ; IF sector_per_cluster_readed > 0 THEN CHECK SECTOR WORDS READED
223
 3E                                              ; (sector_per_cluster_readed)-1
224
 3E                                              ; (SECTOR WORDS READED)= 256
225
 3E  6401                                        SUB s4, 01
226
 3F  C441                                        AND s4, s4
227
 40  9115                                        JUMP Z, track_new_cluster[15]
228
 41                             read_new_sector:
229
 41                                              ; (SECTOR WORDS READED)= 256
230
 41                                              ; increment LBA
231
 41                                              ; sector_per_cluster -> sector_per_cluster_readed-1
232
 41  4001                                        ADD s0, 01
233
 42  5100                                        ADDCY s1, 00
234
 43  5200                                        ADDCY s2, 00
235
 44  5300                                        ADDCY s3, 00
236
 45                                 read_sector:
237
 45  0500                                        LOAD s5, 00
238
 46  83D3                                        CALL write_lba_to_slave[D3]
239
 47  8080                                        RETURN
240
 48                                              ;
241
 48                                              ; --
242
 48                                              ; -- PROCESS MASTER BOOT RECORD (READ LBA BEGIN OF THE FIRST PARTITION)
243
 48                                              ; --
244
 48                  process_master_boot_record:
245
 48                                              ;
246
 48                                              ; LOAD LBA FOR MBR READ
247
 48                                              ;
248
 48  0000                                        LOAD s0, 00
249
 49  0100                                        LOAD s1, 00
250
 4A  0200                                        LOAD s2, 00
251
 4B  0300                                        LOAD s3, 00
252
 4C  83D3                                        CALL write_lba_to_slave[D3]
253
 4D                                              ; information of the lba begin for the first partition
254
 4D                                              ; has an offset of 454 bytes -> 227(0xE3) words
255
 4D  0FE3                                        LOAD sF, E3
256
 4E  83E3                                        CALL do_dummy_reads_from_slave[E3]
257
 4F                                              ;
258
 4F                                              ; --
259
 4F                                              ; -- MBR READ - Partition_LBA_Begin EXTRACTION
260
 4F                                              ; --
261
 4F                                              ;
262
 4F                                              ;  (sD) data[7:0] WB MASTER -> (s0) lba
263
 4F                                              ;  (sE) data[15:8] WB MASTER -> (s1) lba
264
 4F                                              ;  (sD) data[7:0] WB MASTER -> (s2) lba
265
 4F                                              ;  (sE) data[15:8] WB MASTER -> (s3) lba
266
 4F  8384                                        CALL store_all_temporal_registers[84]
267
 50  C800                                        LOAD s8, s0
268
 51  C910                                        LOAD s9, s1
269
 52  CA20                                        LOAD sA, s2
270
 53  CB30                                        LOAD sB, s3
271
 54                                              ;
272
 54                                              ; NOW IS THE LBA_BEGIN ON THE TMP REGISTERS
273
 54                                              ; --------------------
274
 54                                              ; READ FIRST SECTOR (FAT32 VOLUMEN ID) OF THE PARTITION
275
 54                                              ; ---------------------
276
 54  83D3                                        CALL write_lba_to_slave[D3]
277
 55                                              ;
278
 55                                              ; READ -> SECTORS_PER_CLUSTER (OFFSET 0x0D)
279
 55                                              ;
280
 55                                              ; offset 0x0D (13) => READ 13 bytes -> 6(0x06) words and drop LSB in the next
281
 55  0F06                                        LOAD sF, 06
282
 56  83E3                                        CALL do_dummy_reads_from_slave[E3]
283
 57                                              ;
284
 57                                              ;  (sE) data[7:0] WB MASTER -> (s7) SECTORS PER CLUSTER
285
 57  83E8                                        CALL read_word_from_slave[E8]
286
 58  C7E0                                        LOAD s7, sE
287
 59                                              ;
288
 59                                              ; READ -> Number_of_Reserved_Sectors (2 bytes) (OFFSET 0x0E)
289
 59                                              ;
290
 59                                              ; offset 0x0E (14) => READ 2 bytes -> 1(0x01) words
291
 59                                              ;  (sD) data[15:8] WB MASTER -> (s6) TEMPORAL REGISTER
292
 59  83E8                                        CALL read_word_from_slave[E8]
293
 5A  C6D0                                        LOAD s6, sD
294
 5B                                              ;  (sE) data[7:0] WB MASTER -> (s4) TEMPORAL REGISTER
295
 5B                                              ;
296
 5B  C4E0                                        LOAD s4, sE
297
 5C                                              ;
298
 5C                                              ;fat_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors
299
 5C                                              ;
300
 5C  C864                                        ADD s8, s6
301
 5D  C945                                        ADDCY s9, s4
302
 5E  5A00                                        ADDCY sA, 00
303
 5F  5B00                                        ADDCY sB, 00
304
 60                                              ; store fat_begin_lba in external registers
305
 60  E808                                        OUTPUT s8, TMP_OUT_0[08]
306
 61  E909                                        OUTPUT s9, TMP_OUT_1[09]
307
 62  EA0A                                        OUTPUT sA, TMP_OUT_2[0A]
308
 63  EB0B                                        OUTPUT sB, TMP_OUT_3[0B]
309
 64                                              ;
310
 64                                              ;cluster_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors +
311
 64                                              ;                              (Number_of_FATs * Sectors_Per_FAT)+ RootDirSectors;
312
 64                                              ;cluster_begin_lba = fat_begin_lba + (Number_of_FATs * Sectors_Per_FAT)+ RootDirSectors;
313
 64                                              ; READ -> Number_of_Fats (OFFSET 0x10) (always 2)
314
 64                                              ;
315
 64                                              ; offset 0x10 (16) => READ 2 bytes -> 1(0x01) words
316
 64                                              ;
317
 64                                              ;  (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
318
 64  83E8                                        CALL read_word_from_slave[E8]
319
 65  C6D0                                        LOAD s6, sD
320
 66                                              ;
321
 66                                              ; FOR FAT16 => NUMBER OF SECTORS OCCUPIED BY THE ROOT DIRECTORY (BYTES_PER_SEC=512)
322
 66                                              ;
323
 66                                              ; READ -> RootEntCnt (OFFSET 0x11) (FAT16 PROCESSING)
324
 66                                              ; RootDirSectors=((BPB_RootEntCnt*32)+(BPB_BytesPerSec-1))/BPB_BytesPerSec
325
 66                                              ; offset 0x11 (17) => READ 1 bytes
326
 66                                              ;
327
 66                                              ;  (sE) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER
328
 66  C0E0                                        LOAD s0, sE
329
 67                                              ;  (sD) data[15:0] WB MASTER -> (sD) TEMPORAL REGISTER - offset 0x12 (18) => READ 1 bytes
330
 67  83E8                                        CALL read_word_from_slave[E8]
331
 68  C1D0                                        LOAD s1, sD
332
 69                                              ; MULTIPLY BY 32 (100000) 5 SHIFTS TO THE LEFT
333
 69  0F05                                        LOAD sF, 05
334
 6A                                              ; LSB '0'
335
 6A                                     mult_32:
336
 6A  D006                                        SL0 s0
337
 6B                                              ; CARRY -> LSB , MSB -> CARRY
338
 6B  D100                                        SLA s1
339
 6C  6F01                                        SUB sF, 01
340
 6D  956A                                        JUMP NZ, mult_32[6A]
341
 6E                                              ;BPB_RootEntCnt*32+(BPB_BytesPerSec-1) 511 (0x1FF)
342
 6E                                              ;ADD s0,FF (if rounds up => not necessary??)
343
 6E                                              ;ADDCY s1,01
344
 6E                                              ;/BPB_BytesPerSec (512) (1000000000)9 SHIFTS TO THE RIGHT
345
 6E  0F09                                        LOAD sF, 09
346
 6F                                     div_512:
347
 6F                                              ; uses the carry for the MSB and stores LSB into the carry
348
 6F  D10E                                        SR0 s1
349
 70  D008                                        SRA s0
350
 71  6F01                                        SUB sF, 01
351
 72  956F                                        JUMP NZ, div_512[6F]
352
 73                                              ; ROUNDs UP
353
 73                                              ;ADD s0,01
354
 73                                              ;ADDCY s1,00
355
 73                                              ;fat_begin_lba + RootDirSectors
356
 73  C804                                        ADD s8, s0
357
 74  C915                                        ADDCY s9, s1
358
 75  CA25                                        ADDCY sA, s2
359
 76  CB35                                        ADDCY sB, s3
360
 77                                              ; READ -> Sectors_per_fat (OFFSET 0x24)
361
 77                                              ;
362
 77                                              ; offset 0x16 (22) => READ 2 bytes -> 01(0x01) words
363
 77                                              ;
364
 77  0F01                                        LOAD sF, 01
365
 78  83E3                                        CALL do_dummy_reads_from_slave[E3]
366
 79  8384                                        CALL store_all_temporal_registers[84]
367
 7A                                              ;  (Number_of_FATs * Sectors_Per_FAT)
368
 7A                                              ; Number_of_FATs = 2 (10) . Do a shift to the left of the Sectors_Per_Fat
369
 7A                                              ; ***  FAT16 = Sectors_per_fat(BPB_FATSz16)
370
 7A                                              ; LSB '0'
371
 7A  D006                                        SL0 s0
372
 7B                                              ; CARRY -> LSB , MSB -> CARRY
373
 7B  D100                                        SLA s1
374
 7C                                              ;SLA s2 for fat16 only 2 bytes
375
 7C                                              ;SLA s3
376
 7C                                              ; fat_begin_lba + RootDirSectors + (Number_of_FATs * Sectors_Per_FAT)
377
 7C  C804                                        ADD s8, s0
378
 7D  C915                                        ADDCY s9, s1
379
 7E  5A00                                        ADDCY sA, 00
380
 7F  5B00                                        ADDCY sB, 00
381
 80                                              ; cluster_begin_lba is stored in s8, s9, sA, SB
382
 80                                              ;
383
 80                                              ; FOR FAT16 ROOT DIRECTORY POSITION IS FIXED
384
 80                                              ; root_first_lba =  fat_begin_lba(in external regs) + (Number_of_FATs * Sectors_Per_FAT) (s0,s1,s2,s3)
385
 80                                              ;
386
 80  0200                                        LOAD s2, 00
387
 81  0300                                        LOAD s3, 00
388
 82  8335                                        CALL add_load_fat_begin_lba[35]
389
 83                                              ; s0,s1,s2,s3 have Root directory begin lba
390
 83  8080                                        RETURN
391
 84                store_all_temporal_registers:
392
 84                                              ; READ 2 BYTES
393
 84  83E8                                        CALL read_word_from_slave[E8]
394
 85                                              ;  (sD) data[7:0] WB MASTER -> (s0) TEMPORAL REGISTER
395
 85                                              ;  (sE) data[7:0] WB MASTER -> (s1) TEMPORAL REGISTER
396
 85  C0D0                                        LOAD s0, sD
397
 86  C1E0                                        LOAD s1, sE
398
 87                                              ;  (sD) data[7:0] WB MASTER -> (s2) TEMPORAL REGISTER
399
 87                                              ;  (sE) data[7:0] WB MASTER -> (s3) TEMPORAL REGISTER
400
 87                                              ; READ 2 BYTES
401
 87  83E8                                        CALL read_word_from_slave[E8]
402
 88  C2D0                                        LOAD s2, sD
403
 89  C3E0                                        LOAD s3, sE
404
 8A  8080                                        RETURN
405
 8B                      process_root_directory:
406
 8B                                              ; INPUT :
407
 8B                                              ; s0,s1,s2,s3 root directory lba (FAT16- FIXED)
408
 8B                                              ; CALL cluster_2_lba
409
 8B                                              ; now s0,s1,s2,s3 contains the lba for the root directory
410
 8B                                              ; the first 32 byte record on the sector must be the root directory information
411
 8B                                              ; check if EOF (first byte of the 32 bytes is 0)
412
 8B  83D3                                        CALL write_lba_to_slave[D3]
413
 8C                            check_for_a_file:
414
 8C  83E8                                        CALL read_word_from_slave[E8]
415
 8D                                              ;  (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
416
 8D  C6D0                                        LOAD s6, sD
417
 8E  CF60                                        LOAD sF, s6
418
 8F  CFF1                                        AND sF, sF
419
 90                                              ; if sF=0 the is not directory => error
420
 90  91F2                                        JUMP Z, put_error_code[F2]
421
 91                                              ;
422
 91                                              ; check that is not a deleted entry
423
 91                                              ;
424
 91                                              ;  (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
425
 91  0FE5                                        LOAD sF, E5
426
 92  CF61                                        AND sF, s6
427
 93                                              ; if s6=E5 is a deteled entry => check for new one (offset => sF)
428
 93  919D                                        JUMP Z, check_next_directory_entry[9D]
429
 94                             check_attribute:
430
 94                                              ; ATTRIBUTE -> OFFSET Bh
431
 94                                              ; check that is not a directory or LONG NAME
432
 94                                              ; 00arshdv - DV for long name - D for directory
433
 94                                              ;  (sD) data[7:0] WB MASTER -> (s6) TEMPORAL REGISTER
434
 94  0F04                                        LOAD sF, 04
435
 95  83E3                                        CALL do_dummy_reads_from_slave[E3]
436
 96  83E8                                        CALL read_word_from_slave[E8]
437
 97  C6E0                                        LOAD s6, sE
438
 98  0F03                                        LOAD sF, 03
439
 99  CF61                                        AND sF, s6
440
 9A  959F                                        JUMP NZ, check_next_directory_entry_attribute[9F]
441
 9B                                              ; if s6=0 that is not a file => error
442
 9B                                              ;JUMP Z,check_next_directory_entry
443
 9B                                              ; check that is not a directory
444
 9B                                              ; check that is a file (short filename entry)
445
 9B                                              ; in other case error
446
 9B                                              ;
447
 9B                                              ;
448
 9B                                              ; READ CLUSTER INFORMATION FOR THE FILE
449
 9B                                              ;
450
 9B  83A2                                        CALL read_dir_cluster_hi_cluster_low[A2]
451
 9C  8080                                        RETURN
452
 9D                  check_next_directory_entry:
453
 9D                                              ; go fwd 11 words
454
 9D  0F05                                        LOAD sF, 05
455
 9E  83E3                                        CALL do_dummy_reads_from_slave[E3]
456
 9F        check_next_directory_entry_attribute:
457
 9F                                              ; go fwd 5 words
458
 9F  0F0A                                        LOAD sF, 0A
459
 A0  83E3                                        CALL do_dummy_reads_from_slave[E3]
460
 A1  818C                                        JUMP check_for_a_file[8C]
461
 A2             read_dir_cluster_hi_cluster_low:
462
 A2                                              ; INPUT :
463
 A2                                              ;         before arrive here first two bytes of the directory
464
 A2                                              ;         structure must be readed
465
 A2                                              ; OUTPUT :
466
 A2                                              ; s0,s1 : CLUS_LOW
467
 A2                                              ; s2,s3 : CLUS_HI
468
 A2                                              ;
469
 A2                                              ; READ -> cluster_HI (OFFSET 0x14)
470
 A2                                              ;
471
 A2                                              ; offset 0x14 (20) => READ 18 bytes -> 9(0x09) words
472
 A2                                              ;
473
 A2  0F04                                        LOAD sF, 04
474
 A3  83E3                                        CALL do_dummy_reads_from_slave[E3]
475
 A4                                              ;  (sD) data[7:0] WB MASTER -> s2
476
 A4                                              ;  (sE) data[7:0] WB MASTER -> s3
477
 A4                                              ; READ 2 BYTES
478
 A4  83E8                                        CALL read_word_from_slave[E8]
479
 A5  C2D0                                        LOAD s2, sD
480
 A6  C3E0                                        LOAD s3, sE
481
 A7  EE0F                                        OUTPUT sE, TMP_OUT_7[0F]
482
 A8                                              ;
483
 A8                                              ; READ -> cluster_low(OFFSET 0x1A)
484
 A8                                              ;
485
 A8                                              ; offset 0x1A (26) => READ 4 bytes -> 2(0x02) words
486
 A8                                              ;
487
 A8  0F02                                        LOAD sF, 02
488
 A9  83E3                                        CALL do_dummy_reads_from_slave[E3]
489
 AA                                              ;  (sD) data[7:0] WB MASTER ->  s0
490
 AA                                              ;  (sE) data[7:0] WB MASTER ->  s1
491
 AA                                              ; READ 2 BYTES
492
 AA  83E8                                        CALL read_word_from_slave[E8]
493
 AB  C0D0                                        LOAD s0, sD
494
 AC  C1E0                                        LOAD s1, sE
495
 AD                                              ; s0,s1 clus_low s3,s4 - clus_high
496
 AD  8080                                        RETURN
497
 AE                                              ; -- MBR READ OPERATION - LBA BEGIN DETERMINATION
498
 AE                                              ; '00' -> LBA_7_0,LBA_15_8,LBA_23_16,LD_LBA_27_24
499
 AE                               cluster_2_lba:
500
 AE                                              ; --
501
 AE                                              ; -- LBA ADDRESS DETERMINATION
502
 AE                                              ; --
503
 AE                                              ; lba_addr = cluster_begin_lba + (cluster_number - 2) * sectors_per_cluster;
504
 AE                                              ;
505
 AE                                              ; INPUT :
506
 AE                                              ; s0 : CLUSTER_NUMBER0, s1 : CLUSTER_NUMBER1, s2: CLUSTER_NUMBER2, s3 : CLUSTER_NUMBER3
507
 AE                                              ; OUTPUT :
508
 AE                                              ; s0 : LBA_ADDR_7_0 TMP1, s1 : LBA_ADDR_15_8, s2 : LBA_ADDR_24_16, s3 : LBA_ADDR_27_24
509
 AE                                              ;
510
 AE                                              ; cluster_number - 2
511
 AE                                              ;
512
 AE  E00C                                        OUTPUT s0, TMP_OUT_4[0C]
513
 AF  E10D                                        OUTPUT s1, TMP_OUT_5[0D]
514
 B0  E20E                                        OUTPUT s2, TMP_OUT_6[0E]
515
 B1  E30F                                        OUTPUT s3, TMP_OUT_7[0F]
516
 B2  6002                                        SUB s0, 02
517
 B3  7100                                        SUBCY s1, 00
518
 B4  7200                                        SUBCY s2, 00
519
 B5  7300                                        SUBCY s3, 00
520
 B6                                              ;
521
 B6                                              ; (cluster_number - 2) * sectors_per_cluster(s7);
522
 B6                                              ;
523
 B6                                              ; to perform the multiplication as sector_per_cluster is 2 multiple must be known
524
 B6                                              ; who many times must be shifted
525
 B6                                              ; (use sD as temporal register)
526
 B6  0F08                                        LOAD sF, 08
527
 B7  CD70                                        LOAD sD, s7
528
 B8                                    multiply:
529
 B8  DD0E                                        SR0 sD
530
 B9                                              ; loop until detection of the 1 (2 multiple) - Add timeout!!!
531
 B9  99BF                                        JUMP C, add_cluster_begin_lba[BF]
532
 BA                                              ; LSB '0'
533
 BA  D006                                        SL0 s0
534
 BB                                              ; CARRY -> LSB , MSB -> CARRY
535
 BB  D100                                        SLA s1
536
 BC  D200                                        SLA s2
537
 BD  D300                                        SLA s3
538
 BE  81B8                                        JUMP multiply[B8]
539
 BF                       add_cluster_begin_lba:
540
 BF                                              ; lba_addr (TMP0,TMP1,TMP2,TMP3)= cluster_begin_lba + (cluster_number - 2) * sectors_per_cluster;
541
 BF  C084                                        ADD s0, s8
542
 C0  C195                                        ADDCY s1, s9
543
 C1  C2A5                                        ADDCY s2, sA
544
 C2  C3B5                                        ADDCY s3, sB
545
 C3  8080                                        RETURN
546
 C4                                              ; --
547
 C4                                              ; -- WRITE A WORD INTO THE WB SLAVE INTERFACE (TO THE MASTER)
548
 C4                                              ; --
549
 C4                                              ; INPUTS :
550
 C4                                              ; TMP0 : LSB TO DATA_WB_OUT_7_0_SLAVE
551
 C4                                              ; TMP1 : MSB TO DATA_WB_OUT_15_8_SLAVE
552
 C4                                              ;
553
 C4                      write_a_word_to_master:
554
 C4                                              ; TMP0 => DATA_WB_OUT_7_0_SLAVE
555
 C4  ED03                                        OUTPUT sD, DATA_WB_OUT_7_0_SLAVE[03]
556
 C5                                              ; 00 => DATA_WB_OUT_15_8_SLAVE
557
 C5                                              ;LOAD sF,00 -- 8 BIT VERSION
558
 C5                                              ;OUTPUT sF,DATA_WB_OUT_15_8_SLAVE -- 8 BIT VERSION
559
 C5  EE04                                        OUTPUT sE, DATA_WB_OUT_15_8_SLAVE[04]
560
 C6  83CB                                        CALL write_a_byte_to_master[CB]
561
 C7                                              ;
562
 C7                                              ; CHECK STB INPUT | CONTROL_WB_IN_SLAVE-> TMP (s6)
563
 C7                                              ;
564
 C7                                 wait_strobe:
565
 C7  A601                                        INPUT s6, CONTROL_WB_IN_SLAVE[01]
566
 C8                                              ;
567
 C8                                              ;
568
 C8  1601                                        AND s6, STB_I_SLAVE[01]
569
 C9  91C7                                        JUMP Z, wait_strobe[C7]
570
 CA                                              ; TMP1 => DATA_WB_OUT_7_0_SLAVE
571
 CA                                              ; OUTPUT sE,DATA_WB_OUT_7_0_SLAVE
572
 CA                                              ; 00 =>DATA_WB_OUT_15_8_SLAVE
573
 CA                                              ;LOAD sF,00 -- 8 BIT VERSION
574
 CA                                              ;OUTPUT sF,DATA_WB_OUT_15_8_SLAVE -- 8 BIT VERSION
575
 CA                                              ;CALL write_a_byte_to_master -- 8 BIT VERSION
576
 CA  8080                                        RETURN
577
 CB                      write_a_byte_to_master:
578
 CB                                              ;
579
 CB                                              ; WB SLAVE WRITE ENABLE ACTIVE
580
 CB                                              ;
581
 CB  0F01                                        LOAD sF, WB_BUS_SLAVE_WRITE_ENABLE[01]
582
 CC  EF07                                        OUTPUT sF, CONTROL_OUT_SLAVE[07]
583
 CD                                              ;
584
 CD                                              ; ACK TO THE MASTER UNTIL STB FINISH
585
 CD                                              ;
586
 CD                           ack_to_the_master:
587
 CD  0F01                                        LOAD sF, ACK_O_SLAVE[01]
588
 CE  EF05                                        OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
589
 CF                                              ;
590
 CF                                              ;
591
 CF  0F00                                        LOAD sF, 00
592
 D0  EF07                                        OUTPUT sF, CONTROL_OUT_SLAVE[07]
593
 D1  EF05                                        OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
594
 D2  8080                                        RETURN
595
 D3                                              ; --
596
 D3                                              ; -- WRITE A LBA INTO THE WB MASTER INTERFACE (TO THE SLAVE)
597
 D3                                              ; --
598
 D3                                              ; INPUTS :
599
 D3                                              ; TMP0 : LBA_ADDR_7_0, TMP1 : LBA_ADDR_15_8, TMP2 : LBA_ADDR_24_16, TMP3 : LBA_ADDR_27_24
600
 D3                                              ;
601
 D3                                              ;
602
 D3                          write_lba_to_slave:
603
 D3                                              ;
604
 D3                                              ; WB MASTER WRITE ENABLE ACTIVE
605
 D3                                              ;
606
 D3  0F01                                        LOAD sF, WB_BUS_MASTER_WRITE_ENABLE[01]
607
 D4  EF06                                        OUTPUT sF, CONTROL_OUT_MASTER[06]
608
 D5
609
 D5                                              ;write_lba_15_0_to_slave:
610
 D5                                              ;
611
 D5                                              ; TMP0 : LBA_ADDR_7_0 (s0)     => DATA_WB_OUT_7_0_MASTER
612
 D5                                              ; TMP1 : LBA_ADDR_15_8 (s1)    => DATA_WB_OUT_15_8_MASTER
613
 D5                                              ;
614
 D5  E000                                        OUTPUT s0, DATA_WB_OUT_7_0_MASTER[00]
615
 D6  E101                                        OUTPUT s1, DATA_WB_OUT_15_8_MASTER[01]
616
 D7                                              ;
617
 D7                                              ; --
618
 D7                                              ; -- WRITE LBA 15-0 TO THE SLAVE
619
 D7                                              ; --
620
 D7                                              ;
621
 D7                                              ; WB_CONTROL_OUT_MASTER
622
 D7                                              ; W_WE_MASTER = 1
623
 D7                                              ; STB_O_MASTER = 1
624
 D7                                              ; A0 = 0
625
 D7                                              ;
626
 D7  0F03                                        LOAD sF, WRITE_LBA_15_0[03]
627
 D8  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
628
 D9                                              ;
629
 D9                                              ; WAIT FOR THE ACK
630
 D9                                              ;
631
 D9  83EA                                        CALL wait_for_the_ack[EA]
632
 DA                                              ;write_lba_27_16_to_slave:
633
 DA                                              ;
634
 DA                                              ; TMP2 : LBA_ADDR_23_16 (s2)   => DATA_WB_OUT_7_0_MASTER
635
 DA                                              ; TMP3 : LBA_ADDR_27_24 (s3)   => DATA_WB_OUT_15_8_MASTER
636
 DA                                              ;
637
 DA  E200                                        OUTPUT s2, DATA_WB_OUT_7_0_MASTER[00]
638
 DB  E301                                        OUTPUT s3, DATA_WB_OUT_15_8_MASTER[01]
639
 DC
640
 DC                                              ; --
641
 DC                                              ; -- WRITE LBA 27-16 TO THE SLAVE
642
 DC                                              ; --
643
 DC                                              ; WB_CONTROL_OUT_MASTER
644
 DC                                              ; W_WE_MASTER = 1
645
 DC                                              ; STB_O_MASTER = 1
646
 DC                                              ; A0 = 0
647
 DC                                              ;
648
 DC  0F07                                        LOAD sF, WRITE_LBA_27_16[07]
649
 DD  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
650
 DE                                              ;
651
 DE                                              ; WAIT FOR THE ACK
652
 DE                                              ;
653
 DE  83EA                                        CALL wait_for_the_ack[EA]
654
 DF                                              ; --
655
 DF                                              ; -- FINISH WRITE OPERATION ON THE MASTER WB INTERFACE
656
 DF                                              ; --
657
 DF                                              ;
658
 DF                                              ; WB_CONTROL_OUT_MASTER
659
 DF                                              ; W_WE_MASTER = 0
660
 DF                                              ; STB_O_MASTER = 0
661
 DF                                              ; A0 = 0
662
 DF                                              ;
663
 DF  0F00                                        LOAD sF, 00
664
 E0  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
665
 E1  EF06                                        OUTPUT sF, CONTROL_OUT_MASTER[06]
666
 E2  8080                                        RETURN
667
 E3                                              ; --
668
 E3                                              ; -- PERFORM DUMMY READS FROM THE WB SLAVE
669
 E3                                              ; --
670
 E3                                              ; -- IN sF ARE THE NUMBER OF WORDS THAT MUST BE READED
671
 E3                                              ; --
672
 E3                   do_dummy_reads_from_slave:
673
 E3  C6F0                                        LOAD s6, sF
674
 E4                      dummy_reads_from_slave:
675
 E4  83E8                                        CALL read_word_from_slave[E8]
676
 E5  6601                                        SUB s6, 01
677
 E6  95E4                                        JUMP NZ, dummy_reads_from_slave[E4]
678
 E7  8080                                        RETURN
679
 E8
680
 E8                                              ; --
681
 E8                                              ; -- PERFORM A WORD READING FROM THE WB SLAVE
682
 E8                                              ; --
683
 E8                        read_word_from_slave:
684
 E8                                              ; WB_CONTROL_OUT_MASTER
685
 E8                                              ; W_WE_MASTER = 0
686
 E8                                              ; STB_O_MASTER = 1
687
 E8                                              ; A0 = 0
688
 E8                                              ; wait state
689
 E8  0F01                                        LOAD sF, READ_SLAVE[01]
690
 E9  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
691
 EA                                              ;
692
 EA                                              ; WAIT FOR THE ACK
693
 EA                                              ;
694
 EA                                              ; CALL wait_for_the_ack
695
 EA                                              ;JUMP Z,data_available_on_wb_master
696
 EA                            wait_for_the_ack:
697
 EA                                              ;
698
 EA                                              ; CONTROL_WB_IN_MASTER -> TMP (s6)
699
 EA                                              ;
700
 EA  AF00                                        INPUT sF, CONTROL_WB_IN_MASTER[00]
701
 EB                                              ;
702
 EB  1F01                                        AND sF, ACK_I_MASTER[01]
703
 EC  91EA                                        JUMP Z, wait_for_the_ack[EA]
704
 ED                 data_available_on_wb_master:
705
 ED                                              ; This part is not necessary in write operations
706
 ED                                              ; DATA_WB_IN_7_0_MASTER -> (sD) data[7:0] WB MASTER
707
 ED                                              ; DATA_WB_IN_15_8_MASTER -> (sE) data[15:8] WB MASTER
708
 ED  AD02                                        INPUT sD, DATA_WB_IN_7_0_MASTER[02]
709
 EE  AE03                                        INPUT sE, DATA_WB_IN_15_8_MASTER[03]
710
 EF                                              ; DISABLE RD/WR OPERATION REQUEST
711
 EF  0F00                                        LOAD sF, 00
712
 F0  EF02                                        OUTPUT sF, CONTROL_WB_OUT_MASTER[02]
713
 F1  8080                                        RETURN
714
 F2                              put_error_code:
715
 F2  0F04                                        LOAD sF, ERROR[04]
716
 F3  EF05                                        OUTPUT sF, CONTROL_WB_OUT_SLAVE[05]
717
 F4  81F2                                        JUMP put_error_code[F2]
718
 F5                                   interrupt:
719
 F5  80F0                                        RETURNI ENABLE

powered by: WebSVN 2.1.0

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