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

Subversion Repositories ffr16

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

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

Line No. Rev Author Line
1 2 armando
                            ;Formatted version of cfreader.psm generated by KCPSMBLE.
2
                            ;
3
                            ;--===========================================================================--
4
                            ;--
5
                            ;--  CF SECTOR READER
6
                            ;--
7
                            ;--  - SEPTEMBER 2002
8
                            ;--  - UPV / EHU.
9
                            ;--
10
                            ;-- Design units    : FAT32 FILE LOADER
11
                            ;--
12
                            ;-- File name       : cf_sector_reader.txt
13
                            ;--
14
                            ;-- Purpose         : READ RAW SECTORS FROM CF
15
                            ;--
16
                            ;-- Library         : -
17
                            ;--
18
                            ;-- Languaje        : ASSEMBLER FOR XILINX PICOBLAZE
19
                            ;--
20
                            ;-- Compiler        : KCPSM ASSEMBLER V1.25
21
                            ;--
22
                            ;-- Debugger        : PSM DEBUG V1.00
23
                            ;--===========================================================================--
24
                            ;-------------------------------------------------------------------------------
25
                            ;-- Revision list
26
                            ;-- Version   Author                 Date           Changes
27
                            ;--
28
                            ;-- 260902    Armando Astarloa   27 September 2002  -
29
                            ;-- 241002    Armando Astarloa   27 October   2002  Reset on error
30
                            ;-- 031202    Armando Astarloa   27 December  2002  Load LBA information from data bus
31
                            ;-- 120103    Armando Astarloa   12 January   2003  Quit status check when words reading
32
                            ;-- 290103    Armando Astarloa   29 January   2003  Reset function. Reset after error
33
                            ;-- 050503    Armando Astarloa   02 May         2003  Allow not all bytes of the sector readed.
34
                            ;--                                                             do_reset_and_retry state
35
                            ;-- 160503    Armando Astarloa   02 May         2003  Complete sector reading
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_READED
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 = RESET
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
                            CONSTANT RESET,08
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 RESET
247
                            ;
248
                            LOAD sF,s3
249
                            AND sF,RESET
250
                            ; DO RESET
251
                            JUMP NZ,inicialization
252
                            ;
253
                            ; CHECK STROBE & READ
254
                            ;
255
                            LOAD sF,s3
256
                            SUB sF,WRITE_LBA_15_0
257
                            JUMP Z,store_lba_15_0
258
                            LOAD sF,s3
259
                            SUB sF,WRITE_LBA_27_16
260
                            JUMP Z,store_lba_27_16
261
                            LOAD sF,s3
262
                            SUB sF,STROBE_CF_READER_AND_RD
263
                            JUMP Z,put_data_in_wb_bus
264
                            ;
265
                            ; IF NOT READ REQUEST MAINTAIN SIGNAL
266
                            ;
267
                            LOAD sF,00
268
                            OUTPUT sF,CONTROL_OUT
269
                            OUTPUT sF,CONTROL_WB_OUT
270
                            JUMP main
271
            store_lba_15_0:
272
                            ; DATA_WB_IN_7_0 -> s7 LBA_7_0
273
                            INPUT s7,DATA_WB_IN_7_0
274
                            ; DATA_WB_IN_15_8 -> s8 LBA_15_8
275
                            INPUT s8,DATA_WB_IN_15_8
276
                            ; SECTOR AVAILABLE / COMMAND AVAILABLE -> 0
277
                            LOAD sF,00
278
                            AND s5,sF
279
                            JUMP wishbone_ack
280
           store_lba_27_16:
281
                            ; DATA_WB_IN_7_0 -> s9 LBA_23_16
282
                            INPUT s9,DATA_WB_IN_7_0
283
                            ; DATA_WB_IN_15_8 -> s10 LD_LBA_27_24
284
                            INPUT sA,DATA_WB_IN_15_8
285
                            ; SECTOR AVAILABLE -> 0
286
                            ; antes 020503 LOAD sF,FE
287
                            LOAD sF,00
288
                            AND s5,sF
289
                            JUMP wishbone_ack
290
        do_reset_and_retry:
291
                            CALL soft_reset
292
                            LOAD s5,00
293
        put_data_in_wb_bus:
294
                            CALL read_word_from_cf
295
                            ; check for error
296
                            LOAD sF,s5
297
                            AND sF,ERROR_MY_STATUS
298
                            JUMP NZ,do_reset_and_retry
299
                            OUTPUT sB,DATA_WB_OUT_7_0
300
                            OUTPUT sC,DATA_WB_OUT_15_8
301
                            ;
302
                            ; ENABLE WB ENABLE
303
                            ;
304
                            LOAD sF,WB_BUS_WRITE_ENABLE
305
                            OUTPUT sF,CONTROL_OUT
306
              wishbone_ack:
307
                            ;
308
                            ; WISHBONE ACK
309
                            ;
310
                            LOAD sF,ACK_CF_READER
311
                            OUTPUT sF,CONTROL_WB_OUT
312
                            ; null - wait state
313
                            ;
314
                            AND sF,sF
315
                            AND sF,sF
316
                            AND sF,sF
317
                            AND sF,sF
318
                            ; WISHBONE MASTER MUST CHECK ACK SIGNAL
319
                            ; IN THE RISING EDGE OF THE CLOCK AND DEASSERT
320
                            ; STROBE SIGNAL. SLAVE AUTOMATICALLY DEASSERT ACK
321
                            ;
322
                            LOAD sF,00
323
                            OUTPUT sF,CONTROL_WB_OUT
324
                            ;OUTPUT sF,CONTROL_OUT
325
                            JUMP main
326
                 wait_loop:
327
                            ;
328
                            ; SOFTWARE DELAY LOOP
329
                            ; TAKES SLOW LOOP VALUE FROM sF
330
                            ;
331
                            ; TWO CYCLES PER INSTRUCTION
332
                            ;
333
                            ; SLOW LOOP 3 INSTRUCTIONS * sF
334
                            ; FAST LOOP 2 INSTRUCTIONS * DELAY1
335
                            ; 50 MHZ DELAY1=0A => T=20NS => fl=3*20*2= 120ns sF=1 => delay= 120ns
336
                            LOAD s1,sF
337
                 slow_loop:
338
                            LOAD s0,DELAY1
339
                 fast_loop:
340
                            SUB s0,01
341
                            JUMP NZ,fast_loop
342
                            SUB s1,01
343
                            JUMP NZ,slow_loop
344
                            RETURN
345
        write_ide_register:
346
                            ;
347
                            ; TAKE ADDRESS FROM SF REGISTER AND IT'S PUT INTO THE PORT
348
                            ;
349
                            OUTPUT sF,IDE_ADDRESS_OUT
350
                            ;
351
                            ; DATA OUT IDE
352
                            ;
353
                            OUTPUT sD,DATA_IDE_OUT_7_0
354
                            OUTPUT sE,DATA_IDE_OUT_15_8
355
                            ;
356
                            ; DATA OUT BUS ENABLE
357
                            ;
358
                            LOAD sF,IDE_BUS_WRITE_ENABLE
359
                            OUTPUT sF,CONTROL_OUT
360
                            ;
361
                            ; WAIT FOR 70 NS (MIN)
362
                            ; (120ns/50Mhz)
363
                            LOAD sF,01
364
                            CALL wait_loop
365
                            ;
366
                            ; WRITE STROBE ON
367
                            ;
368
                            LOAD sF,NIOWR
369
                            OUTPUT sF,IDE_CONTROL_OUT
370
                            ;
371
                            ; WAIT FOR 165NS (MIN)
372
                            ; (240ns/50Mhz)
373
                            ; 020503
374
                            LOAD sF,02
375
                            CALL wait_loop
376
                            ;
377
                            ; WRITE STROBE OFF
378
                            ;
379
                            LOAD sF,FF
380
                            OUTPUT sF,IDE_CONTROL_OUT
381
                            ;
382
                            ; WAIT FOR 20NS (MIN)
383
                            ; (410ns/50Mhz)
384
                            ; 020503
385
                            ;LOAD sF,01
386
                            ;CALL wait_loop
387
                            ;
388
                            ; CE AND ADRESSES OFF
389
                            ;
390
                            LOAD sF,CF_OFF
391
                            OUTPUT sF,IDE_ADDRESS_OUT
392
                            ;
393
                            ; WAIT FOR 30NS (MIN) (if delay of the two previos inst>30ns this is not necessary)
394
                            ; (put again 020503)
395
                            LOAD sF,01
396
                            CALL wait_loop
397
                            ;
398
                            ; DATA OUT BUS DISABLE
399
                            ;
400
                            LOAD sF,00
401
                            OUTPUT sF,CONTROL_OUT
402
                            ;
403
                            ; (put again 020503)
404
                            LOAD sF,02
405
                            CALL wait_loop
406
                            RETURN
407
         read_ide_register:
408
                            ;
409
                            ; TAKE ADDRESS FROM SF REGISTER AND IT'S PUT INTO THE PORT
410
                            ;
411
                            OUTPUT sF,IDE_ADDRESS_OUT
412
                            ;
413
                            ; WAIT FOR 70 NS (MIN)
414
                            ;
415
                            LOAD sF,01
416
                            CALL wait_loop
417
                            ;
418
                            ; READ STROBE ON
419
                            ; reset control_out (140503)
420
                            LOAD sF,00
421
                            OUTPUT sF,CONTROL_OUT
422
                            LOAD sF,NIORD
423
                            OUTPUT sF,IDE_CONTROL_OUT
424
                            ;
425
                            ; WAIT FOR 165NS (MIN)
426
                            ;
427
                            LOAD sF,02
428
                            CALL wait_loop
429
                            ;
430
                            ; TAKE DE DATA FROM IDE BUS
431
                            ;
432
                            INPUT sB,DATA_IDE_IN_7_0
433
                            INPUT sC,DATA_IDE_IN_15_8
434
                            ;
435
                            ; READ STROBE OFF
436
                            ;
437
                            LOAD sF,FF
438
                            OUTPUT sF,IDE_CONTROL_OUT
439
                            ;
440
                            ; WAIT FOR 20NS (MIN)
441
                            ;
442
                            ;LOAD sF,01
443
                            ;CALL wait_loop
444
                            ;
445
                            ; CE AND ADRESSES OFF
446
                            ;
447
                            LOAD sF,CF_OFF
448
                            OUTPUT sF,IDE_ADDRESS_OUT
449
                            ;
450
                            ; WAIT FOR 20NS (MIN)
451
                            ; (120ns/50mhz)
452
                            ;LOAD sF,01
453
                            ;CALL wait_loop
454
                            RETURN
455
               read_sector:
456
                            ;
457
                            ; WRITE ATA COMMANDS TO THE CF
458
                            ;
459
                            ;
460
                            ; IDE FEATURE REGISTER
461
                            ;
462
                            LOAD sD,WRITE_SEC_FEATURE
463
                            LOAD sF,FEATURE
464
                            CALL write_ide_register
465
                            ;
466
                            ; IDE SECTOR COUNT REGISTER
467
                            ;
468
                            LOAD sD,01
469
                            LOAD sF,SECTOR_COUNT
470
                            CALL write_ide_register
471
                            ;
472
                            ; IDE LBA_7_0
473
                            ;
474
                            LOAD sD,s7
475
                            LOAD sF,LBA_7_0
476
                            CALL write_ide_register
477
                            ;
478
                            ; IDE LBA_15_8
479
                            ;
480
                            LOAD sD,s8
481
                            LOAD sF,LBA_15_8
482
                            CALL write_ide_register
483
                            ;
484
                            ; IDE LBA_23_16
485
                            ;
486
                            LOAD sD,s9
487
                            LOAD sF,LBA_23_16
488
                            CALL write_ide_register
489
                            ;
490
                            ; IDE LD_LBA_27_24
491
                            ;
492
                            ; LBA_27_42 OR WITH 1110
493
                            ;                   BIT7 : 1
494
                            ;                   BIT6 : LBA=1
495
                            ;                   BIT5 : 1
496
                            ;                   BIT4 : DRV=0
497
                            ;
498
                            ;
499
                            LOAD sF,sA
500
                            OR sF,E0
501
                            LOAD sD,sF
502
                            LOAD sF,LD_LBA_27_24
503
                            CALL write_ide_register
504
                            ;
505
                            ; IDE READ SECTOR COMMAND
506
                            ;
507
                            LOAD sD,READ_SECTOR_COMMAND
508
                            LOAD sF,COMMAND
509
                            CALL write_ide_register
510
                            ;
511
                            ; PUT SECTOR ALLOWED FLAG INTO MY_STATUS
512
                            ;
513
                            ; 290103 Added data available check
514
        retry_status_check:
515
                            CALL cf_status_check
516
                            LOAD sF,s5
517
                            AND sF,ERROR_MY_STATUS
518
                            RETURN NZ
519
                            LOAD sF,DATA_TRANSFER_ALLOWED
520
                            AND sF,s5
521
                            ; LOOPS UNTIL SECTOR DATA IS AVAILABLE
522
                            JUMP Z,retry_status_check
523
                            LOAD sF,SECTOR_AVAILABLE
524
                            OR s5,sF
525
                            ;
526
                            ; RESET WORDS READED REGISTER
527
                            ;
528
                            LOAD s6,FF
529
                            RETURN
530
         read_word_from_cf:
531
                            ;
532
                            ; CHECK IF THE SECTOR IS AVAILABLE
533
                            ;
534
                            LOAD sF,SECTOR_AVAILABLE
535
                            AND sF,s5
536
                            ;
537
                            ; IF SECTOR_AVAILABLE=0 JUMP TO READ_NEW_SECTOR
538
                            ;
539
                            CALL Z,read_new_sector
540
                            ; check for error
541
                            LOAD sF,s5
542
                            AND sF,ERROR_MY_STATUS
543
                            RETURN NZ
544
                            ;retry_status_check:
545
                            ;CALL cf_status_check
546
                            ;
547
                            ; CHECK IF DATA IS AVAILABLE
548
                            ;
549
                            ; 120103 - changed . When there is sector
550
                            ; available in the cf ram buffer it is not
551
                            ; necessary to check neither bsy or drq
552
                            ; only read words with the correct timing paramenters
553
                            ;
554
                            ;LOAD sF,DATA_TRANSFER_ALLOWED
555
                            ;AND sF,s5
556
                            ; LOOPS UNTIL SECTOR DATA IS AVAILABLE
557
                            ;JUMP Z,retry_status_check
558
                            ; end 120103
559
                            CALL read_word
560
                            ;
561
                            ; IF 256 WORD READED -> SECTOR AVAILABLE=0
562
                            ;
563
                            AND s6,s6
564
                            JUMP Z,reset_word_readed
565
                            ;
566
                            ; DECREMENT NUMBER OF WORDS READED
567
                            ;
568
                            ;SUB s6,01
569
                            RETURN
570
         reset_word_readed:
571
                            ;
572
                            ; IF 256 WORD READED -> SECTOR AVAILABLE=0
573
                            ;
574
                            ;ADD s7,01
575
                            LOAD s6,FF
576
                            LOAD sF,FE
577
                            AND s5,sF
578
                            RETURN
579
                            ;
580
                 read_word:
581
                            ;
582
                            ; READ WORDS FROM IDE DATA REGISTERS
583
                            ;
584
                            LOAD sF,DATA
585
                            CALL read_ide_register
586
                            ;
587
                            ; DATA ARE IN sB , sC
588
                            ;
589
                            ; DATA AVAILABLE SIGNAL IS STORED
590
                            LOAD sF,TAG0_WORD_AVAILABLE
591
                            OUTPUT sF,CONTROL_WB_OUT
592
                            SUB s6,01
593
                            RETURN
594
           dummy_word_read:
595
                            CALL read_word
596
           read_new_sector:
597
                            CALL cf_status_check
598
                            LOAD sF,s5
599
                            AND sF,DATA_TRANSFER_ALLOWED
600
                            ;loops until previous non readed words are readed
601
                            JUMP NZ,dummy_word_read
602
                            LOAD sF,s5
603
                            AND sF,ERROR_MY_STATUS
604
                            RETURN NZ
605
                            LOAD sF,s5
606
                            AND sF,COMMAND_ALLOWED
607
                            ; loops until commands are allowed
608
                            LOAD s6,FF
609
                            JUMP Z,read_new_sector
610
                            JUMP read_sector
611
           cf_status_check:
612
                            ;
613
                            ; CF STATUS REGISTER READ
614
                            ;
615
                            LOAD sF,STATUS
616
                            CALL read_ide_register
617
                            ;
618
                            ; ERROR
619
                            ;
620
                            ;     BSY/DRDY/DWF/DSC/DRQ/CORR/0/ERR
621
                            ; MASK    0    0   0   0   0    0 0   1
622
                            ; ERR-ST  X    X   X   X   X    X X   1
623
                            ; AND     0    0   0   0   0    0 0   1
624
                            LOAD sF,01
625
                            AND sF,sB
626
                            JUMP NZ,put_error_code
627
                            ;
628
                            ; DATA REQUEST MASK (READY=1 : BUSY=0 : DRQ=1)
629
                            ;
630
                            ;     BSY/DRDY/DWF/DSC/DRQ/CORR/0/ERR
631
                            ; MASK    1    1   0   0   1    0 0   1
632
                            ; DRQ-ST  0    1   X   X   1    X X   0
633
                            ; AND     0    1   0   0   1    0 0   0
634
                            LOAD sF,C9
635
                            AND sF,sB
636
                            SUB sF,48
637
                            JUMP Z,put_data_request_allowed
638
                            ;
639
                            ;
640
                            ; COMMAND ALLOWED MASK (READY=1 : BUSY=0)
641
                            ;
642
                            ;     BSY/DRDY/DWF/DSC/DRQ/CORR/0/ERR
643
                            ; MASK    1    1   0   0   0    0 0   1
644
                            ; CMD-ST  0    1   X   X   0    X X   0
645
                            ; AND     0    1   0   0   0    0 0   0
646
                            LOAD sF,C1
647
                            AND sF,sB
648
                            SUB sF,40
649
                            JUMP Z,put_command_allowed
650
                            ;
651
                            ; ELSE DATA_TRANSFER_ALLOWED & COMMAND_ALLOWED => 0
652
                            ;
653
                            ;JUMP put_error_code
654
                            ; REVISAR ???
655
                            ;AND s5,01
656
                            RETURN
657
            put_error_code:
658
                            ;
659
                            ; ERROR SIGNAL
660
                            ;
661
                            ; PUT ERROR CODE
662
                            ;
663
                            LOAD sF,04
664
                            OUTPUT sF,CONTROL_OUT
665
                            CALL soft_reset
666
                            LOAD s5,ERROR_MY_STATUS
667
                            RETURN
668
                            ;JUMP inicialization (STACK OVERFLOW???)
669
                soft_reset:
670
                            LOAD sD,SOFT_RESET
671
                            LOAD sF,CONTROL
672
                            CALL write_ide_register
673
                            LOAD sF,FF
674
                            CALL wait_loop
675
                            LOAD sF,FF
676
                            CALL wait_loop
677
                            LOAD sF,FF
678
                            CALL wait_loop
679
                            LOAD sF,FF
680
                            CALL wait_loop
681
                            LOAD sD,00
682
                            LOAD sF,CONTROL
683
                            CALL write_ide_register
684
                            RETURN
685
  put_data_request_allowed:
686
                            ;
687
                            ; DRQ ALLOW -> MY STATUS REGISTER
688
                            ;
689
                            AND s5,FD
690
                            LOAD sF,DATA_TRANSFER_ALLOWED
691
                            OR s5,sF
692
                            RETURN
693
       put_command_allowed:
694
                            ;
695
                            ; DRQ ALLOW -> MY STATUS REGISTER
696
                            ;
697
                            AND s5,FB
698
                            LOAD sF,COMMAND_ALLOWED
699
                            OR s5,sF
700
                            RETURN
701
                            ADDRESS FF
702
                 interrupt:
703
                            RETURNI ENABLE

powered by: WebSVN 2.1.0

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