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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [monitor/] [monitor/] [common/] [dskser.s] - Blame information for rev 183

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

Line No. Rev Author Line
1 59 hellwig
;
2 182 hellwig
; dskser.s -- disk made available by serial interface
3 59 hellwig
;
4
 
5
;***************************************************************
6
 
7 182 hellwig
        .export dskcapser               ; determine disk capacity
8
        .export dskioser                ; do disk I/O
9 59 hellwig
 
10
        .import ser1in
11
        .import ser1out
12
        .import ser1inchk
13
        .import puts
14
 
15
        ; constants for communication with disk server
16
        .set    SYN,0x16                ; to initiate the three-way handshake
17
        .set    ACK,0x06                ; acknowledgement for handshake
18
        .set    RESULT_OK,0x00          ; server successfully executed cmd
19
                                        ; everything else means error
20
 
21
        .set    WAIT_DELAY,800000       ; count for delay loop
22
 
23
;***************************************************************
24
 
25
        .code
26
        .align  4
27
 
28 182 hellwig
dskcapser:
29 59 hellwig
        sub     $29,$29,16
30
        stw     $16,$29,0
31
        stw     $17,$29,4
32
        stw     $18,$29,8
33
        stw     $31,$29,12
34
        add     $4,$0,trymsg             ; say what we are doing
35
        jal     puts
36
        add     $18,$0,$0         ; capacity == 0 if disk not present
37
        add     $16,$0,10                ; 10 tries to get a connection
38
handshake1:
39
        sub     $16,$16,1
40
        add     $4,$0,SYN
41
        jal     ser1out                 ; send SYN
42
        add     $17,$0,WAIT_DELAY        ; wait for ACK
43
handshake2:
44
        sub     $17,$17,1
45
        jal     ser1inchk
46
        bne     $2,$0,handshake3
47
        bne     $17,$0,handshake2
48
        add     $4,$0,timeoutmsg
49
        jal     puts
50
        bne     $16,$0,handshake1
51
        add     $4,$0,frustratedmsg
52
        jal     puts
53 182 hellwig
        j       dskcapx
54 59 hellwig
handshake3:
55
        jal     ser1in
56
        add     $8,$0,ACK
57 182 hellwig
        bne     $2,$8,dskcapx
58 59 hellwig
        ; we got an ACK so we return it
59
        add     $4,$0,ACK
60
        jal     ser1out
61
 
62
        ; ask it for its capacity
63
        add     $4,$0,'c'
64
        jal     ser1out                 ; request
65
        jal     ser1in                  ; first byte of response
66 182 hellwig
        bne     $2,$0,dskcapx            ; exit if error
67 59 hellwig
 
68
        ; all is well and the server will give us the capacity
69
        add     $16,$0,4         ; 4 bytes to read
70 182 hellwig
dskcap1:
71 59 hellwig
        sll     $18,$18,8
72
        jal     ser1in
73
        or      $18,$18,$2              ; most significant byte first
74
        sub     $16,$16,1
75 182 hellwig
        bne     $16,$0,dskcap1
76 59 hellwig
 
77
        ; return value is in $18
78 182 hellwig
dskcapx:
79 59 hellwig
        add     $2,$0,$18
80
        ldw     $16,$29,0
81
        ldw     $17,$29,4
82
        ldw     $18,$29,8
83
        ldw     $31,$29,12
84
        add     $29,$29,16
85
        jr      $31
86
 
87
        .data
88
        .align  4
89
 
90
trymsg:
91
        .byte   "Trying to connect to disk server..."
92
        .byte   0x0A, 0
93
 
94
timeoutmsg:
95
        .byte   "Request timed out..."
96
        .byte   0x0A, 0
97
 
98
frustratedmsg:
99
        .byte   "Unable to establish connection to disk server."
100
        .byte   0x0A, 0
101
 
102
        .code
103
        .align  4
104
 
105 182 hellwig
dskioser:
106 59 hellwig
        sub     $29,$29,24
107
        stw     $16,$29,0
108
        stw     $17,$29,4
109
        stw     $18,$29,8
110
        stw     $19,$29,12
111
        stw     $20,$29,16
112
        stw     $31,$29,20
113
        add     $16,$0,$4                ; command
114
        add     $17,$0,$5                ; start at sector
115
        add     $8,$0,0xc0000000
116
        or      $18,$8,$6               ; memory address (logicalized)
117
        add     $19,$0,$7                ; number of sectors
118
 
119
        ; switch over command
120
        add     $8,$0,'r'
121 182 hellwig
        beq     $8,$16,dskior           ; read
122 59 hellwig
        add     $8,$0,'w'
123 182 hellwig
        beq     $8,$16,dskiow           ; write
124 59 hellwig
        ; unknown command
125
        add     $2,$0,1                  ; value != 0 signifies error
126 182 hellwig
        j       dskiox
127 59 hellwig
 
128
        ; read from disk
129 182 hellwig
dskior:
130
dskior1:                                ; loop over number of sectors
131
        beq     $19,$0,dskiorsuc ; successful return
132 59 hellwig
        sub     $19,$19,1
133
        ; read a sector
134
        add     $4,$0,'r'
135
        jal     ser1out
136
        ; send sector number
137
        add     $20,$0,32                ; 4 bytes
138 182 hellwig
dskior2:
139 59 hellwig
        sub     $20,$20,8
140
        slr     $4,$17,$20
141
        and     $4,$4,0xff
142
        jal     ser1out
143 182 hellwig
        bne     $20,$0,dskior2
144 59 hellwig
        add     $17,$17,1
145
        ; get answer
146
        jal     ser1in
147 182 hellwig
        bne     $2,$0,dskiox             ; $2 != 0 so we use it as return code
148 59 hellwig
        ; read data
149
        add     $20,$0,512
150 182 hellwig
dskior3:
151 59 hellwig
        sub     $20,$20,1
152
        jal     ser1in
153
        stb     $2,$18,0
154
        add     $18,$18,1
155 182 hellwig
        bne     $20,$0,dskior3
156
        j       dskior1
157
dskiorsuc:
158 59 hellwig
        add     $2,$0,$0
159 182 hellwig
        j       dskiox
160 59 hellwig
 
161
        ; write to disk
162 182 hellwig
dskiow:
163
dskiow1:                                ; loop over number of sectors
164
        beq     $19,$0,dskiowsuc ; successful return
165 59 hellwig
        sub     $19,$19,1
166
        ; write a sector
167
        add     $4,$0,'w'
168
        jal     ser1out
169
        ; send sector number
170
        add     $20,$0,32                ; 4 bytes
171 182 hellwig
dskiow2:
172 59 hellwig
        sub     $20,$20,8
173
        slr     $4,$17,$20
174
        and     $4,$4,0xff
175
        jal     ser1out
176 182 hellwig
        bne     $20,$0,dskiow2
177 59 hellwig
        add     $17,$17,1
178
        ; write data
179
        add     $20,$0,512
180 182 hellwig
dskiow3:
181 59 hellwig
        sub     $20,$20,1
182
        ldbu    $4,$18,0
183
        jal     ser1out
184
        add     $18,$18,1
185 182 hellwig
        bne     $20,$0,dskiow3
186 59 hellwig
        ; get answer
187
        jal     ser1in
188 182 hellwig
        bne     $2,$0,dskiox
189
        j       dskiow1
190
dskiowsuc:
191 59 hellwig
        add     $2,$0,$0
192 182 hellwig
dskiox:
193 59 hellwig
        ldw     $16,$29,0
194
        ldw     $17,$29,4
195
        ldw     $18,$29,8
196
        ldw     $19,$29,12
197
        ldw     $20,$29,16
198
        ldw     $31,$29,20
199
        add     $29,$29,24
200
        jr      $31

powered by: WebSVN 2.1.0

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