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

Subversion Repositories ffr16

[/] [ffr16/] [trunk/] [sources/] [hau/] [240603KN/] [compile/] [CFREADER.LOG] - Blame information for rev 3

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

Line No. Rev Author Line
1 2 armando
KCPSM Assembler log file for program 'cfreader.psm'.
2
Generated by KCPSM version 1.10
3
Ken Chapman (Xilinx Ltd) 2002.
4
 
5
Addr Code
6
 
7
 00                                  ;--===========================================================================--
8
 00                                  ;--
9
 00                                  ;--  CF SECTOR READER
10
 00                                  ;--
11
 00                                  ;--  - SEPTEMBER 2002
12
 00                                  ;--  - UPV / EHU.
13
 00                                  ;--
14
 00                                  ;-- Design units   : FAT FILE LOADER
15
 00                                  ;--
16
 00                                  ;-- File name      : cf_sector_reader.txt
17
 00                                  ;--
18
 00                                  ;-- Purpose        : READ RAW SECTORS FROM CF
19
 00                                  ;--
20
 00                                  ;-- Library        : -
21
 00                                  ;--
22
 00                                  ;-- Languaje       : ASSEMBLER FOR XILINX PICOBLAZE
23
 00                                  ;--
24
 00                                  ;-- Compiler       : KCPSM ASSEMBLER V1.25
25
 00                                  ;--
26
 00                                  ;-- Debugger       : PSM DEBUG V1.00
27
 00                                  ;--===========================================================================--
28
 00                                  ;-------------------------------------------------------------------------------
29
 00                                  ;-- Revision list
30
 00                                  ;-- Version   Author                 Date           Changes
31
 00                                  ;--
32
 00                                  ;-- 260902    Armando Astarloa   27 September 2002  -
33
 00                                  ;-- 241002    Armando Astarloa   27 October   2002  Reset on error
34
 00                                  ;-- 031202    Armando Astarloa   27 December  2002  Load LBA information from data bus
35
 00                                  ;-- 120103   Armando Astarloa   12 January   2003  Quit status check when words reading
36
 00                                  ;-- 290103   Armando Astarloa   29 January   2003  Reset function. Reset after error
37
 00                                  ;-- 050503   Armando Astarloa   02 May         2003  Allow not all bytes of the sector read.
38
 00                                  ;--                                                                    do_reset_and_retry state
39
 00                                  ;-- 160503   Armando Astarloa   15 May         2003  Complete sector reading
40
 00                                  ;-- 170603   Armando Astarloa   17 June        2003  Bug in words per sector read
41
 00                                  ;-- 230603   Armando Astarloa   24 June        2003  Quit soft reset (KCPSM v.1002 has reset)
42
 00                                  ;--
43
 00                                  ;-------------------------------------------------------------------------------
44
 00                                  ;-- Description    :  DUMMY CF SECTORS READ
45
 00                                  ;-------------------------------------------------------------------------------
46
 00                                  ;--
47
 00                                  ;-- CONSTANT DEFINITIONS
48
 00                                  ;--
49
 00                                  CONSTANT DELAY1, 03
50
 00                                  ; 50 MHZ DELAY1 => T(clk_i) => fastloop=DELAY1*T*2= 120ns sF=1 => delay= sF*fastloop
51
 00                                  ; 50 MHZ DELAY1=03 => T=20NS => fastloop=3*20*2= 120ns sF=1 => delay= 120ns
52
 00                                  CONSTANT IDENTIFY_COMMAND, EC
53
 00                                  CONSTANT WRITE_SECTOR_COMMAND, 30
54
 00                                  CONSTANT READ_SECTOR_COMMAND, 20
55
 00                                  CONSTANT WRITE_SEC_FEATURE, 00
56
 00                                  CONSTANT SOFT_RESET, 04
57
 00                                  ;--
58
 00                                  ;-- RAM REGISTERS
59
 00                                  ;--
60
 00                                  ;
61
 00                                  ; s0
62
 00                                  ; s1
63
 00                                  ; s2
64
 00                                  ; s3 -> WISHBONE CONTROL
65
 00                                  ; s4 -> REGISTERS STACK
66
 00                                  ; s5 -> MY_STATUS
67
 00                                  ;          D3 = ERROR
68
 00                                  ;          D2 = DATA TRANSFER ALLOWED (0 NOT / 1 YES)
69
 00                                  ;          D1 = COMMAND ALLOWED (NOT BUSY) (0 NOT / 1 YES)
70
 00                                  ;          D0 = SECTOR AVAILABLE (0 NOT / 1 YES)
71
 00                                  CONSTANT SECTOR_AVAILABLE, 01
72
 00                                  CONSTANT COMMAND_ALLOWED, 02
73
 00                                  CONSTANT DATA_TRANSFER_ALLOWED, 04
74
 00                                  CONSTANT ERROR_MY_STATUS, 08
75
 00                                  ; s6 -> WORDS_READ
76
 00                                  ; s7 -> LBA_7_0
77
 00                                  ; s8 -> LBA_15_8
78
 00                                  ; s9 -> LBA_23_16
79
 00                                  ; sA -> LD_LBA_27_24
80
 00                                  ; sB -> data[7:0] in ide
81
 00                                  ; sC -> data[15:8] in ide
82
 00                                  ; sD -> data[7:0] out ide
83
 00                                  ; sE -> data[15:8] out ide
84
 00                                  ; sF -> acummulator
85
 00                                  ;
86
 00                                  ;--
87
 00                                  ;-- OUTPUT PORTS
88
 00                                  ;--
89
 00                                  ;--
90
 00                                  ;-- IDE INTERFACE PORTS - OUTPUTS
91
 00                                  ;--
92
 00                                  CONSTANT DATA_IDE_OUT_7_0, 00
93
 00                                  CONSTANT DATA_IDE_OUT_15_8, 01
94
 00                                  CONSTANT IDE_CONTROL_OUT, 02
95
 00                                  ; D7 =
96
 00                                  ; D6 =
97
 00                                  ; D5 =
98
 00                                  ; D4 =
99
 00                                  ; D3 =
100
 00                                  ; D2 =
101
 00                                  ; D1 = NIOWR
102
 00                                  ; D0 = NIORD
103
 00                                  CONSTANT NIOWR, FD
104
 00                                  CONSTANT NIORD, FE
105
 00                                  CONSTANT IDE_ADDRESS_OUT, 03
106
 00                                  ; D7 =
107
 00                                  ; D6 =
108
 00                                  ; D5 =
109
 00                                  ; D4 = NCE1
110
 00                                  ; D3 = NCE0
111
 00                                  ; D2 = A2
112
 00                                  ; D1 = A1
113
 00                                  ; D0 = A0
114
 00                                  ;
115
 00                                  ; WRITE IDE REGISTERS
116
 00                                  ;
117
 00                                  ;    NCE1/NCE0/ A2/ A1/ A0
118
 00                                  CONSTANT CONTROL, 0E                 ; 000   0    1   1   1   0
119
 00                                  CONSTANT DATA, 10                    ; 000   1    0   0   0   0
120
 00                                  CONSTANT FEATURE, 11                 ; 000   1    0   0   0   1
121
 00                                  CONSTANT SECTOR_COUNT, 12            ; 000   1    0   0   1   0
122
 00                                  CONSTANT LBA_7_0, 13                 ; 000   1    0   0   1   1
123
 00                                  CONSTANT LBA_15_8, 14                ; 000   1    0   1   0   0
124
 00                                  CONSTANT LBA_23_16, 15               ; 000   1    0   1   0   1
125
 00                                  CONSTANT LD_LBA_27_24, 16            ; 000   1    0   1   1   0
126
 00                                  CONSTANT COMMAND, 17                 ; 000   1    0   1   1   1
127
 00                                  CONSTANT CF_OFF, 18                  ; 000 1    1   0   0   0
128
 00                                  ;
129
 00                                  ; READ IDE REGISTERS
130
 00                                  ;    NCE1/NCE0/ A2/ A1/ A0
131
 00                                  CONSTANT A_STATUS, 0E                ; 000   0    1   1   1   0
132
 00                                  CONSTANT STATUS, 17                  ; 000   1    0   1   1   1
133
 00                                  ;--
134
 00                                  ;-- WISHBONE INTERFACE PORTS - OUTPUTS
135
 00                                  ;--
136
 00                                  CONSTANT DATA_WB_OUT_7_0, 04
137
 00                                  CONSTANT DATA_WB_OUT_15_8, 05
138
 00                                  CONSTANT CONTROL_WB_OUT, 06
139
 00                                  ; D7 =
140
 00                                  ; D6 =
141
 00                                  ; D5 =
142
 00                                  ; D4 =
143
 00                                  ; D3 =
144
 00                                  ; D2 =
145
 00                                  ; D1 = TAG0_WORD_AVAILABLE
146
 00                                  ; D0 = ACK_CF_READER
147
 00                                  CONSTANT ACK_CF_READER, 01
148
 00                                  CONSTANT TAG0_WORD_AVAILABLE, 02
149
 00                                  ;--
150
 00                                  ;-- BUS CONTROL SIGNALS
151
 00                                  ;--
152
 00                                  CONSTANT CONTROL_OUT, 07
153
 00                                  ; D7 =
154
 00                                  ; D6 =
155
 00                                  ; D5 =
156
 00                                  ; D4 =
157
 00                                  ; D3 =
158
 00                                  ; D2 = ERROR
159
 00                                  ; D1 = WB_BUS_WRITE_ENABLE
160
 00                                  ; D0 = IDE_BUS_WRITE_ENABLE
161
 00                                  CONSTANT IDE_BUS_WRITE_ENABLE, 01
162
 00                                  CONSTANT WB_BUS_WRITE_ENABLE, 02
163
 00                                  CONSTANT ERROR, 04
164
 00                                  ;--
165
 00                                  ;-- INPUT PORTS
166
 00                                  ;--
167
 00                                  ;--
168
 00                                  ;-- IDE INTERFACE PORTS - INPUTS
169
 00                                  ;--
170
 00                                  CONSTANT DATA_IDE_IN_7_0, 00
171
 00                                  CONSTANT DATA_IDE_IN_15_8, 01
172
 00                                  ;--
173
 00                                  ;-- WISHBONE INTERFACE PORTS - INPUTS
174
 00                                  ;--
175
 00                                  CONSTANT CONTROL_WB_IN, 02
176
 00                                  ; D7 =
177
 00                                  ; D6 =
178
 00                                  ; D5 =
179
 00                                  ; D4 = WB_A0
180
 00                                  ; D3 = -
181
 00                                  ; D2 = W_WE
182
 00                                  ; D1 = TAG1_WORD_REQUEST
183
 00                                  ; D0 = STROBE_CF_READER
184
 00                                  ;
185
 00                                  ; STROBE_CF_READER = 1 & W_WE=1 & WB_A0 = 0
186
 00                                  CONSTANT WRITE_LBA_15_0, 05
187
 00                                  ; STROBE_CF_READER = 1 & W_WE=1 & WB_A0 = 1
188
 00                                  CONSTANT WRITE_LBA_27_16, 15
189
 00                                  CONSTANT STROBE_CF_READER_AND_RD, 01
190
 00                                  CONSTANT TAG1_WORD_REQUEST, 02
191
 00                                  CONSTANT W_WE, 04
192
 00
193
 00
194
 00                                  ;--
195
 00                                  ;-- WISHBONE INTERFACE PORTS - INPUTS
196
 00                                  ;--
197
 00                                  CONSTANT DATA_WB_IN_7_0, 03
198
 00                                  CONSTANT DATA_WB_IN_15_8, 04
199
 00                                  ;--
200
 00                                  ;-- REGISTERS INITIALIZATION
201
 00                                  ;--
202
 00                  inicialization:
203
 00                                  ;
204
 00                                  ; BUS CONTROL : WRITE NOT ENABLE
205
 00                                  ;
206
 00  0F00                            LOAD sF, 00
207
 01  EF07                            OUTPUT sF, CONTROL_OUT[07]
208
 02                                  ;
209
 02                                  ; WISHBONE BUS INIZIALIZATION
210
 02                                  ;
211
 02  0F00                            LOAD sF, 00
212
 03  EF04                            OUTPUT sF, DATA_WB_OUT_7_0[04]
213
 04  EF05                            OUTPUT sF, DATA_WB_OUT_15_8[05]
214
 05  EF06                            OUTPUT sF, CONTROL_WB_OUT[06]
215
 06                                  ;
216
 06                                  ; IDE BUS INICIALIZATION
217
 06                                  ;
218
 06  0F00                            LOAD sF, 00
219
 07  EF00                            OUTPUT sF, DATA_IDE_OUT_7_0[00]
220
 08  EF01                            OUTPUT sF, DATA_IDE_OUT_15_8[01]
221
 09  0F18                            LOAD sF, 18
222
 0A  EF03                            OUTPUT sF, IDE_ADDRESS_OUT[03]
223
 0B  0FFF                            LOAD sF, FF
224
 0C  EF02                            OUTPUT sF, IDE_CONTROL_OUT[02]
225
 0D                                  ;
226
 0D                                  ; WAIT FOR 210NS*31 (RESET DELAY)
227
 0D                                  ;
228
 0D  0500                            LOAD s5, 00
229
 0E  0600                            LOAD s6, 00
230
 0F  0FFF                            LOAD sF, FF
231
 10  8347                            CALL wait_loop[47]
232
 11  83CB                            CALL soft_reset[CB]
233
 12  0FFF                            LOAD sF, FF
234
 13  8347                            CALL wait_loop[47]
235
 14  0FFF                            LOAD sF, FF
236
 15  8347                            CALL wait_loop[47]
237
 16  0FFF                            LOAD sF, FF
238
 17  8347                            CALL wait_loop[47]
239
 18                            main:
240
 18                                  ;
241
 18                                  ; CHECK WISHBONE BUS
242
 18                                  ;
243
 18                                  ; wait state for stb_i deassertion
244
 18                                  ;LOAD sF,01
245
 18                                  ;CALL wait_loop
246
 18  CFF1                            AND sF, sF
247
 19  CFF1                            AND sF, sF
248
 1A  CFF1                            AND sF, sF
249
 1B  CFF1                            AND sF, sF
250
 1C  A302                            INPUT s3, CONTROL_WB_IN[02]
251
 1D                                  ;
252
 1D                                  ; CHECK STROBE & READ
253
 1D                                  ;
254
 1D  CF30                            LOAD sF, s3
255
 1E  6F05                            SUB sF, WRITE_LBA_15_0[05]
256
 1F  912A                            JUMP Z, store_lba_15_0[2A]
257
 20  CF30                            LOAD sF, s3
258
 21  6F15                            SUB sF, WRITE_LBA_27_16[15]
259
 22  912F                            JUMP Z, store_lba_27_16[2F]
260
 23  CF30                            LOAD sF, s3
261
 24  6F01                            SUB sF, STROBE_CF_READER_AND_RD[01]
262
 25  9136                            JUMP Z, put_data_in_wb_bus[36]
263
 26                                  ;
264
 26                                  ; IF NOT READ REQUEST MAINTAIN SIGNAL
265
 26                                  ;
266
 26  0F00                            LOAD sF, 00
267
 27  EF07                            OUTPUT sF, CONTROL_OUT[07]
268
 28  EF06                            OUTPUT sF, CONTROL_WB_OUT[06]
269
 29  8118                            JUMP main[18]
270
 2A                  store_lba_15_0:
271
 2A                                  ; DATA_WB_IN_7_0 -> s7 LBA_7_0
272
 2A  A703                            INPUT s7, DATA_WB_IN_7_0[03]
273
 2B                                  ; DATA_WB_IN_15_8 -> s8 LBA_15_8
274
 2B  A804                            INPUT s8, DATA_WB_IN_15_8[04]
275
 2C                                  ; SECTOR AVAILABLE / COMMAND AVAILABLE -> 0
276
 2C  0F00                            LOAD sF, 00
277
 2D  C5F1                            AND s5, sF
278
 2E  813E                            JUMP wishbone_ack[3E]
279
 2F                 store_lba_27_16:
280
 2F                                  ; DATA_WB_IN_7_0 -> s9 LBA_23_16
281
 2F  A903                            INPUT s9, DATA_WB_IN_7_0[03]
282
 30                                  ; DATA_WB_IN_15_8 -> s10 LD_LBA_27_24
283
 30  AA04                            INPUT sA, DATA_WB_IN_15_8[04]
284
 31                                  ; SECTOR AVAILABLE -> 0
285
 31                                  ; antes 020503 LOAD sF,FE
286
 31  0F00                            LOAD sF, 00
287
 32  C5F1                            AND s5, sF
288
 33  813E                            JUMP wishbone_ack[3E]
289
 34              do_reset_and_retry:
290
 34  83CB                            CALL soft_reset[CB]
291
 35  0500                            LOAD s5, 00
292
 36              put_data_in_wb_bus:
293
 36  8396                            CALL read_word_from_cf[96]
294
 37                                  ; check for error
295
 37  CF50                            LOAD sF, s5
296
 38  1F08                            AND sF, ERROR_MY_STATUS[08]
297
 39  9534                            JUMP NZ, do_reset_and_retry[34]
298
 3A  EB04                            OUTPUT sB, DATA_WB_OUT_7_0[04]
299
 3B  EC05                            OUTPUT sC, DATA_WB_OUT_15_8[05]
300
 3C                                  ;
301
 3C                                  ; ENABLE WB ENABLE
302
 3C                                  ;
303
 3C  0F02                            LOAD sF, WB_BUS_WRITE_ENABLE[02]
304
 3D  EF07                            OUTPUT sF, CONTROL_OUT[07]
305
 3E                    wishbone_ack:
306
 3E                                  ;
307
 3E                                  ; WISHBONE ACK
308
 3E                                  ;
309
 3E  0F01                            LOAD sF, ACK_CF_READER[01]
310
 3F  EF06                            OUTPUT sF, CONTROL_WB_OUT[06]
311
 40                                  ; null - wait state
312
 40                                  ;
313
 40  CFF1                            AND sF, sF
314
 41  CFF1                            AND sF, sF
315
 42  CFF1                            AND sF, sF
316
 43  CFF1                            AND sF, sF
317
 44                                  ; WISHBONE MASTER MUST CHECK ACK SIGNAL
318
 44                                  ; IN THE RISING EDGE OF THE CLOCK AND DEASSERT
319
 44                                  ; STROBE SIGNAL. SLAVE AUTOMATICALLY DEASSERT ACK
320
 44                                  ;
321
 44  0F00                            LOAD sF, 00
322
 45  EF06                            OUTPUT sF, CONTROL_WB_OUT[06]
323
 46                                  ;OUTPUT sF,CONTROL_OUT
324
 46  8118                            JUMP main[18]
325
 47                       wait_loop:
326
 47                                  ;
327
 47                                  ; SOFTWARE DELAY LOOP
328
 47                                  ; TAKES SLOW LOOP VALUE FROM sF
329
 47                                  ;
330
 47                                  ; TWO CYCLES PER INSTRUCTION
331
 47                                  ;
332
 47                                  ; SLOW LOOP 3 INSTRUCTIONS * sF
333
 47                                  ; FAST LOOP 2 INSTRUCTIONS * DELAY1
334
 47                                  ; 50 MHZ DELAY1=0A => T=20NS => fl=3*20*2= 120ns sF=1 => delay= 120ns
335
 47  C1F0                            LOAD s1, sF
336
 48                       slow_loop:
337
 48  0003                            LOAD s0, DELAY1[03]
338
 49                       fast_loop:
339
 49  6001                            SUB s0, 01
340
 4A  9549                            JUMP NZ, fast_loop[49]
341
 4B  6101                            SUB s1, 01
342
 4C  9548                            JUMP NZ, slow_loop[48]
343
 4D  8080                            RETURN
344
 4E              write_ide_register:
345
 4E                                  ;
346
 4E                                  ; TAKE ADDRESS FROM SF REGISTER AND IT'S PUT INTO THE PORT
347
 4E                                  ;
348
 4E  EF03                            OUTPUT sF, IDE_ADDRESS_OUT[03]
349
 4F                                  ;
350
 4F                                  ; DATA OUT IDE
351
 4F                                  ;
352
 4F  ED00                            OUTPUT sD, DATA_IDE_OUT_7_0[00]
353
 50  EE01                            OUTPUT sE, DATA_IDE_OUT_15_8[01]
354
 51                                  ;
355
 51                                  ; DATA OUT BUS ENABLE
356
 51                                  ;
357
 51  0F01                            LOAD sF, IDE_BUS_WRITE_ENABLE[01]
358
 52  EF07                            OUTPUT sF, CONTROL_OUT[07]
359
 53                                  ;
360
 53                                  ; WAIT FOR 70 NS (MIN)
361
 53                                  ; (120ns/50Mhz)
362
 53  0F01                            LOAD sF, 01
363
 54  8347                            CALL wait_loop[47]
364
 55                                  ;
365
 55                                  ; WRITE STROBE ON
366
 55                                  ;
367
 55  0FFD                            LOAD sF, NIOWR[FD]
368
 56  EF02                            OUTPUT sF, IDE_CONTROL_OUT[02]
369
 57                                  ;
370
 57                                  ; WAIT FOR 165NS (MIN)
371
 57                                  ; (240ns/50Mhz)
372
 57                                  ; 020503
373
 57  0F02                            LOAD sF, 02
374
 58  8347                            CALL wait_loop[47]
375
 59                                  ;
376
 59                                  ; WRITE STROBE OFF
377
 59                                  ;
378
 59  0FFF                            LOAD sF, FF
379
 5A  EF02                            OUTPUT sF, IDE_CONTROL_OUT[02]
380
 5B                                  ;
381
 5B                                  ; WAIT FOR 20NS (MIN)
382
 5B                                  ; (410ns/50Mhz)
383
 5B                                  ; 020503
384
 5B                                  ;LOAD sF,01
385
 5B                                  ;CALL wait_loop
386
 5B                                  ;
387
 5B                                  ; CE AND ADRESSES OFF
388
 5B                                  ;
389
 5B  0F18                            LOAD sF, CF_OFF[18]
390
 5C  EF03                            OUTPUT sF, IDE_ADDRESS_OUT[03]
391
 5D                                  ;
392
 5D                                  ; WAIT FOR 30NS (MIN) (if delay of the two previos inst>30ns this is not necessary)
393
 5D                                  ; (put again 020503)
394
 5D  0F01                            LOAD sF, 01
395
 5E  8347                            CALL wait_loop[47]
396
 5F                                  ;
397
 5F                                  ; DATA OUT BUS DISABLE
398
 5F                                  ;
399
 5F  0F00                            LOAD sF, 00
400
 60  EF07                            OUTPUT sF, CONTROL_OUT[07]
401
 61                                  ;
402
 61                                  ; (put again 020503)
403
 61  0F02                            LOAD sF, 02
404
 62  8347                            CALL wait_loop[47]
405
 63  8080                            RETURN
406
 64               read_ide_register:
407
 64                                  ;
408
 64                                  ; TAKE ADDRESS FROM SF REGISTER AND IT'S PUT INTO THE PORT
409
 64                                  ;
410
 64  EF03                            OUTPUT sF, IDE_ADDRESS_OUT[03]
411
 65                                  ;
412
 65                                  ; WAIT FOR 70 NS (MIN)
413
 65                                  ;
414
 65  0F01                            LOAD sF, 01
415
 66  8347                            CALL wait_loop[47]
416
 67                                  ;
417
 67                                  ; READ STROBE ON
418
 67                                  ; reset control_out (140503)
419
 67  0F00                            LOAD sF, 00
420
 68  EF07                            OUTPUT sF, CONTROL_OUT[07]
421
 69  0FFE                            LOAD sF, NIORD[FE]
422
 6A  EF02                            OUTPUT sF, IDE_CONTROL_OUT[02]
423
 6B                                  ;
424
 6B                                  ; WAIT FOR 165NS (MIN)
425
 6B                                  ;
426
 6B  0F02                            LOAD sF, 02
427
 6C  8347                            CALL wait_loop[47]
428
 6D                                  ;
429
 6D                                  ; TAKE DE DATA FROM IDE BUS
430
 6D                                  ;
431
 6D  AB00                            INPUT sB, DATA_IDE_IN_7_0[00]
432
 6E  AC01                            INPUT sC, DATA_IDE_IN_15_8[01]
433
 6F                                  ;
434
 6F                                  ; READ STROBE OFF
435
 6F                                  ;
436
 6F  0FFF                            LOAD sF, FF
437
 70  EF02                            OUTPUT sF, IDE_CONTROL_OUT[02]
438
 71                                  ;
439
 71                                  ; WAIT FOR 20NS (MIN)
440
 71                                  ;
441
 71                                  ;LOAD sF,01
442
 71                                  ;CALL wait_loop
443
 71                                  ;
444
 71                                  ; CE AND ADRESSES OFF
445
 71                                  ;
446
 71  0F18                            LOAD sF, CF_OFF[18]
447
 72  EF03                            OUTPUT sF, IDE_ADDRESS_OUT[03]
448
 73                                  ;
449
 73                                  ; WAIT FOR 20NS (MIN)
450
 73                                  ; (120ns/50mhz)
451
 73                                  ;LOAD sF,01
452
 73                                  ;CALL wait_loop
453
 73  8080                            RETURN
454
 74                     read_sector:
455
 74                                  ;
456
 74                                  ; WRITE ATA COMMANDS TO THE CF
457
 74                                  ;
458
 74                                  ;
459
 74                                  ; IDE FEATURE REGISTER
460
 74                                  ;
461
 74  0D00                            LOAD sD, WRITE_SEC_FEATURE[00]
462
 75  0F11                            LOAD sF, FEATURE[11]
463
 76  834E                            CALL write_ide_register[4E]
464
 77                                  ;
465
 77                                  ; IDE SECTOR COUNT REGISTER
466
 77                                  ;
467
 77  0D01                            LOAD sD, 01
468
 78  0F12                            LOAD sF, SECTOR_COUNT[12]
469
 79  834E                            CALL write_ide_register[4E]
470
 7A                                  ;
471
 7A                                  ; IDE LBA_7_0
472
 7A                                  ;
473
 7A  CD70                            LOAD sD, s7
474
 7B  0F13                            LOAD sF, LBA_7_0[13]
475
 7C  834E                            CALL write_ide_register[4E]
476
 7D                                  ;
477
 7D                                  ; IDE LBA_15_8
478
 7D                                  ;
479
 7D  CD80                            LOAD sD, s8
480
 7E  0F14                            LOAD sF, LBA_15_8[14]
481
 7F  834E                            CALL write_ide_register[4E]
482
 80                                  ;
483
 80                                  ; IDE LBA_23_16
484
 80                                  ;
485
 80  CD90                            LOAD sD, s9
486
 81  0F15                            LOAD sF, LBA_23_16[15]
487
 82  834E                            CALL write_ide_register[4E]
488
 83                                  ;
489
 83                                  ; IDE LD_LBA_27_24
490
 83                                  ;
491
 83                                  ; LBA_27_42 OR WITH 1110
492
 83                                  ;                  BIT7 : 1
493
 83                                  ;                  BIT6 : LBA=1
494
 83                                  ;                  BIT5 : 1
495
 83                                  ;                  BIT4 : DRV=0
496
 83                                  ;
497
 83                                  ;
498
 83  CFA0                            LOAD sF, sA
499
 84  2FE0                            OR sF, E0
500
 85  CDF0                            LOAD sD, sF
501
 86  0F16                            LOAD sF, LD_LBA_27_24[16]
502
 87  834E                            CALL write_ide_register[4E]
503
 88                                  ;
504
 88                                  ; IDE READ SECTOR COMMAND
505
 88                                  ;
506
 88  0D20                            LOAD sD, READ_SECTOR_COMMAND[20]
507
 89  0F17                            LOAD sF, COMMAND[17]
508
 8A  834E                            CALL write_ide_register[4E]
509
 8B                                  ;
510
 8B                                  ; PUT SECTOR ALLOWED FLAG INTO MY_STATUS
511
 8B                                  ;
512
 8B                                  ; 290103 Added data available check
513
 8B              retry_status_check:
514
 8B  83B8                            CALL cf_status_check[B8]
515
 8C  CF50                            LOAD sF, s5
516
 8D  1F08                            AND sF, ERROR_MY_STATUS[08]
517
 8E  9480                            RETURN NZ
518
 8F  0F04                            LOAD sF, DATA_TRANSFER_ALLOWED[04]
519
 90  CF51                            AND sF, s5
520
 91                                  ; LOOPS UNTIL SECTOR DATA IS AVAILABLE
521
 91  918B                            JUMP Z, retry_status_check[8B]
522
 92  0F01                            LOAD sF, SECTOR_AVAILABLE[01]
523
 93  C5F2                            OR s5, sF
524
 94                                  ;
525
 94                                  ; RESET WORDS READ REGISTER
526
 94                                  ;
527
 94  06FF                            LOAD s6, FF
528
 95  8080                            RETURN
529
 96               read_word_from_cf:
530
 96                                  ;
531
 96                                  ; CHECK IF THE SECTOR IS AVAILABLE
532
 96                                  ;
533
 96  0F01                            LOAD sF, SECTOR_AVAILABLE[01]
534
 97  CF51                            AND sF, s5
535
 98                                  ;
536
 98                                  ; IF SECTOR_AVAILABLE=0 JUMP TO READ_NEW_SECTOR
537
 98                                  ;
538
 98  93AC                            CALL Z, read_new_sector[AC]
539
 99                                  ; check for error
540
 99  CF50                            LOAD sF, s5
541
 9A  1F08                            AND sF, ERROR_MY_STATUS[08]
542
 9B  9480                            RETURN NZ
543
 9C                                  ;retry_status_check:
544
 9C                                  ;CALL cf_status_check
545
 9C                                  ;
546
 9C                                  ; CHECK IF DATA IS AVAILABLE
547
 9C                                  ;
548
 9C                                  ; 120103 - changed . When there is sector
549
 9C                                  ; available in the cf ram buffer it is not
550
 9C                                  ; necessary to check neither bsy or drq
551
 9C                                  ; only read words with the correct timing paramenters
552
 9C                                  ;
553
 9C                                  ;LOAD sF,DATA_TRANSFER_ALLOWED
554
 9C                                  ;AND sF,s5
555
 9C                                  ; LOOPS UNTIL SECTOR DATA IS AVAILABLE
556
 9C                                  ;JUMP Z,retry_status_check
557
 9C                                  ; end 120103
558
 9C                                  ;
559
 9C                                  ; IF 256 WORD READ -> SECTOR AVAILABLE=0
560
 9C                                  ;
561
 9C  83A5                            CALL read_word[A5]
562
 9D  C661                            AND s6, s6
563
 9E  91A1                            JUMP Z, reset_word_READ[A1]
564
 9F                                  ;
565
 9F                                  ; DECREMENT NUMBER OF WORDS READ
566
 9F                                  ;
567
 9F  6601                            SUB s6, 01
568
 A0  8080                            RETURN
569
 A1                 reset_word_READ:
570
 A1                                  ;
571
 A1                                  ; IF 256 WORD READ -> SECTOR AVAILABLE=0
572
 A1                                  ;
573
 A1                                  ;ADD s7,01
574
 A1  06FF                            LOAD s6, FF
575
 A2  0FFE                            LOAD sF, FE
576
 A3  C5F1                            AND s5, sF
577
 A4  8080                            RETURN
578
 A5
579
 A5                       read_word:
580
 A5                                  ;
581
 A5                                  ; READ WORDS FROM IDE DATA REGISTERS
582
 A5                                  ;
583
 A5  0F10                            LOAD sF, DATA[10]
584
 A6  8364                            CALL read_ide_register[64]
585
 A7                                  ;
586
 A7                                  ; DATA ARE IN sB , sC
587
 A7                                  ;
588
 A7                                  ; DATA AVAILABLE SIGNAL IS STORED
589
 A7  0F02                            LOAD sF, TAG0_WORD_AVAILABLE[02]
590
 A8  EF06                            OUTPUT sF, CONTROL_WB_OUT[06]
591
 A9  8080                            RETURN
592
 AA                 dummy_word_read:
593
 AA  83A5                            CALL read_word[A5]
594
 AB  6601                            SUB s6, 01
595
 AC                 read_new_sector:
596
 AC  83B8                            CALL cf_status_check[B8]
597
 AD  CF50                            LOAD sF, s5
598
 AE  1F04                            AND sF, DATA_TRANSFER_ALLOWED[04]
599
 AF                                  ;loops until previous non READ words are READ
600
 AF  95AA                            JUMP NZ, dummy_word_read[AA]
601
 B0  CF50                            LOAD sF, s5
602
 B1  1F08                            AND sF, ERROR_MY_STATUS[08]
603
 B2  9480                            RETURN NZ
604
 B3  CF50                            LOAD sF, s5
605
 B4  1F02                            AND sF, COMMAND_ALLOWED[02]
606
 B5                                  ; loops until commands are allowed
607
 B5  06FF                            LOAD s6, FF
608
 B6  91AC                            JUMP Z, read_new_sector[AC]
609
 B7  8174                            JUMP read_sector[74]
610
 B8                 cf_status_check:
611
 B8                                  ;
612
 B8                                  ; CF STATUS REGISTER READ
613
 B8                                  ;
614
 B8  0F17                            LOAD sF, STATUS[17]
615
 B9  8364                            CALL read_ide_register[64]
616
 BA                                  ;
617
 BA                                  ; ERROR
618
 BA                                  ;
619
 BA                                  ;    BSY/DRDY/DWF/DSC/DRQ/CORR/0/ERR
620
 BA                                  ; MASK    0    0   0   0   0    0 0   1
621
 BA                                  ; ERR-ST  X    X   X   X   X    X X   1
622
 BA                                  ; AND     0    0   0   0   0    0 0   1
623
 BA  0F01                            LOAD sF, 01
624
 BB  CFB1                            AND sF, sB
625
 BC  95C6                            JUMP NZ, put_error_code[C6]
626
 BD                                  ;
627
 BD                                  ; DATA REQUEST MASK (READY=1 : BUSY=0 : DRQ=1)
628
 BD                                  ;
629
 BD                                  ;    BSY/DRDY/DWF/DSC/DRQ/CORR/0/ERR
630
 BD                                  ; MASK    1    1   0   0   1    0 0   1
631
 BD                                  ; DRQ-ST  0    1   X   X   1    X X   0
632
 BD                                  ; AND     0    1   0   0   1    0 0   0
633
 BD  0FC9                            LOAD sF, C9
634
 BE  CFB1                            AND sF, sB
635
 BF  6F48                            SUB sF, 48
636
 C0  91DA                            JUMP Z, put_data_request_allowed[DA]
637
 C1
638
 C1                                  ;
639
 C1                                  ; COMMAND ALLOWED MASK (READY=1 : BUSY=0)
640
 C1                                  ;
641
 C1                                  ;    BSY/DRDY/DWF/DSC/DRQ/CORR/0/ERR
642
 C1                                  ; MASK    1    1   0   0   0    0 0   1
643
 C1                                  ; CMD-ST  0    1   X   X   0    X X   0
644
 C1                                  ; AND     0    1   0   0   0    0 0   0
645
 C1  0FC1                            LOAD sF, C1
646
 C2  CFB1                            AND sF, sB
647
 C3  6F40                            SUB sF, 40
648
 C4  91DE                            JUMP Z, put_command_allowed[DE]
649
 C5                                  ;
650
 C5                                  ; ELSE DATA_TRANSFER_ALLOWED & COMMAND_ALLOWED => 0
651
 C5                                  ;
652
 C5                                  ;JUMP put_error_code
653
 C5                                  ; REVISAR ???
654
 C5                                  ;AND s5,01
655
 C5  8080                            RETURN
656
 C6                  put_error_code:
657
 C6                                  ;
658
 C6                                  ; ERROR SIGNAL
659
 C6                                  ;
660
 C6                                  ; PUT ERROR CODE
661
 C6                                  ;
662
 C6  0F04                            LOAD sF, 04
663
 C7  EF07                            OUTPUT sF, CONTROL_OUT[07]
664
 C8  83CB                            CALL soft_reset[CB]
665
 C9  0508                            LOAD s5, ERROR_MY_STATUS[08]
666
 CA  8080                            RETURN
667
 CB                                  ;JUMP inicialization (STACK OVERFLOW???)
668
 CB                      soft_reset:
669
 CB  0D04                            LOAD sD, SOFT_RESET[04]
670
 CC  0F0E                            LOAD sF, CONTROL[0E]
671
 CD  834E                            CALL write_ide_register[4E]
672
 CE  0FFF                            LOAD sF, FF
673
 CF  8347                            CALL wait_loop[47]
674
 D0  0FFF                            LOAD sF, FF
675
 D1  8347                            CALL wait_loop[47]
676
 D2  0FFF                            LOAD sF, FF
677
 D3  8347                            CALL wait_loop[47]
678
 D4  0FFF                            LOAD sF, FF
679
 D5  8347                            CALL wait_loop[47]
680
 D6  0D00                            LOAD sD, 00
681
 D7  0F0E                            LOAD sF, CONTROL[0E]
682
 D8  834E                            CALL write_ide_register[4E]
683
 D9  8080                            RETURN
684
 DA        put_data_request_allowed:
685
 DA                                  ;
686
 DA                                  ; DRQ ALLOW -> MY STATUS REGISTER
687
 DA                                  ;
688
 DA  15FD                            AND s5, FD
689
 DB  0F04                            LOAD sF, DATA_TRANSFER_ALLOWED[04]
690
 DC  C5F2                            OR s5, sF
691
 DD  8080                            RETURN
692
 DE             put_command_allowed:
693
 DE                                  ;
694
 DE                                  ; DRQ ALLOW -> MY STATUS REGISTER
695
 DE                                  ;
696
 DE  15FB                            AND s5, FB
697
 DF  0F02                            LOAD sF, COMMAND_ALLOWED[02]
698
 E0  C5F2                            OR s5, sF
699
 E1  8080                            RETURN
700
 FF                                  ADDRESS FF
701
 FF                       interrupt:
702
 FF  80F0                            RETURNI ENABLE

powered by: WebSVN 2.1.0

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