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

Subversion Repositories eco32

[/] [eco32/] [tags/] [eco32-0.23/] [monitor/] [monitor/] [common/] [sctio-ctl.s] - Blame information for rev 157

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 59 hellwig
;
2
; sctio-ctl.s -- disk sector I/O for disk made available by disk controller
3
;
4
 
5
;***************************************************************
6
 
7
        .set    dskbase,0xF0400000      ; disk base address
8
        .set    dskctrl,0                ; control register
9
        .set    dskcnt,4                ; count register
10
        .set    dsksct,8                ; sector register
11
        .set    dskcap,12               ; capacity register
12
        .set    dskbuf,0x00080000       ; disk buffer
13
 
14
        .set    ctrlstrt,0x01           ; start bit
15
        .set    ctrlien,0x02            ; interrupt enable bit
16
        .set    ctrlwrt,0x04            ; write bit
17
        .set    ctrlerr,0x08            ; error bit
18
        .set    ctrldone,0x10           ; done bit
19
        .set    ctrlrdy,0x20            ; ready bit
20
 
21
        .set    sctsize,512             ; sector size in bytes
22
 
23
        .set    retries,1000000         ; retries to get disk ready
24
 
25
        .export sctcapctl               ; determine disk capacity
26
        .export sctioctl                ; do disk I/O
27
 
28
;***************************************************************
29
 
30
        .code
31
        .align  4
32
 
33
sctcapctl:
34
        add     $8,$0,retries            ; set retry count
35
        add     $9,$0,dskbase
36
sctcap1:
37
        ldw     $10,$9,dskctrl
38
        and     $10,$10,ctrlrdy         ; ready?
39
        bne     $10,$0,sctcapok          ; yes - jump
40
        sub     $8,$8,1
41
        bne     $8,$0,sctcap1            ; try again
42
        add     $2,$0,0                   ; no disk found
43
        j       sctcapx
44
sctcapok:
45
        ldw     $2,$9,dskcap            ; get disk capacity
46
sctcapx:
47
        jr      $31
48
 
49
sctioctl:
50
        sub     $29,$29,24
51
        stw     $31,$29,20
52
        stw     $16,$29,16
53
        stw     $17,$29,12
54
        stw     $18,$29,8
55
        stw     $19,$29,4
56
        stw     $20,$29,0
57
        add     $16,$4,$0                ; command
58
        add     $17,$5,$0                ; sector number
59
        add     $18,$6,0xC0000000       ; memory address, virtualized
60
        add     $19,$7,$0                ; number of sectors
61
 
62
        add     $8,$0,'r'
63
        beq     $16,$8,sctrd
64
        add     $8,$0,'w'
65
        beq     $16,$8,sctwr
66
        add     $2,$0,0xFF               ; illegal command
67
        j       sctx
68
 
69
sctrd:
70
        add     $2,$0,$0          ; return ok
71
        beq     $19,$0,sctx              ; if no (more) sectors
72
        add     $8,$0,dskbase
73
        add     $9,$0,1
74
        stw     $9,$8,dskcnt            ; number of sectors
75
        stw     $17,$8,dsksct           ; sector number on disk
76
        add     $9,$0,ctrlstrt
77
        stw     $9,$8,dskctrl           ; start command
78
sctrd1:
79
        ldw     $2,$8,dskctrl
80
        and     $9,$2,ctrldone          ; done?
81
        beq     $9,$0,sctrd1             ; no - wait
82
        and     $9,$2,ctrlerr           ; error?
83
        bne     $9,$0,sctx               ; yes - leave
84
        add     $8,$0,dskbase + dskbuf   ; transfer data
85
        add     $9,$0,sctsize
86
sctrd2:
87
        ldw     $10,$8,0         ; from disk buffer
88
        stw     $10,$18,0                ; to memory
89
        add     $8,$8,4
90
        add     $18,$18,4
91
        sub     $9,$9,4
92
        bne     $9,$0,sctrd2
93
        add     $17,$17,1               ; increment sector number
94
        sub     $19,$19,1               ; decrement number of sectors
95
        j       sctrd                   ; next sector
96
 
97
sctwr:
98
        add     $2,$0,$0          ; return ok
99
        beq     $19,$0,sctx              ; if no (more) sectors
100
        add     $8,$0,dskbase + dskbuf   ; transfer data
101
        add     $9,$0,sctsize
102
sctwr1:
103
        ldw     $10,$18,0                ; from memory
104
        stw     $10,$8,0         ; to disk buffer
105
        add     $18,$18,4
106
        add     $8,$8,4
107
        sub     $9,$9,4
108
        bne     $9,$0,sctwr1
109
        add     $8,$0,dskbase
110
        add     $9,$0,1
111
        stw     $9,$8,dskcnt            ; number of sectors
112
        stw     $17,$8,dsksct           ; sector number on disk
113
        add     $9,$0,ctrlwrt | ctrlstrt
114
        stw     $9,$8,dskctrl           ; start command
115
sctwr2:
116
        ldw     $2,$8,dskctrl
117
        and     $9,$2,ctrldone          ; done?
118
        beq     $9,$0,sctwr2             ; no - wait
119
        and     $9,$2,ctrlerr           ; error?
120
        bne     $9,$0,sctx               ; yes - leave
121
        add     $17,$17,1               ; increment sector number
122
        sub     $19,$19,1               ; decrement number of sectors
123
        j       sctwr                   ; next sector
124
 
125
sctx:
126
        ldw     $20,$29,0
127
        ldw     $19,$29,4
128
        ldw     $18,$29,8
129
        ldw     $17,$29,12
130
        ldw     $16,$29,16
131
        ldw     $31,$29,20
132
        add     $29,$29,24
133
        jr      $31

powered by: WebSVN 2.1.0

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