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

Subversion Repositories ffr16

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

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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