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
|