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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [monitor/] [monitor/] [boards/] [s3e-500/] [start.s] - Blame information for rev 184

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

Line No. Rev Author Line
1 16 hellwig
;
2
; start.s -- ECO32 ROM monitor startup and support routines
3
;
4
 
5
        .set    dmapaddr,0xC0000000     ; base of directly mapped addresses
6 50 hellwig
        .set    stacktop,0xC0010000     ; monitor stack is at top of 64K
7 16 hellwig
 
8
        .set    PSW,0                    ; reg # of PSW
9 50 hellwig
        .set    V_SHIFT,27              ; interrupt vector ctrl bit
10
        .set    V,1 << V_SHIFT
11
 
12 16 hellwig
        .set    TLB_INDEX,1             ; reg # of TLB Index
13
        .set    TLB_ENTRY_HI,2          ; reg # of TLB EntryHi
14
        .set    TLB_ENTRY_LO,3          ; reg # of TLB EntryLo
15
        .set    TLB_ENTRIES,32          ; number of TLB entries
16 84 hellwig
        .set    BAD_ADDRESS,4           ; reg # of bad address reg
17 180 hellwig
        .set    BAD_ACCESS,5            ; reg # of bad access reg
18 16 hellwig
 
19 180 hellwig
        .set    USER_CONTEXT_SIZE,38*4  ; size of user context
20 16 hellwig
 
21 50 hellwig
        .set    BIO_OUT,0xF1000000      ; board I/O output port
22
        .set    SPI_EN,0x80000000       ; SPI bus enable ctrl bit
23
 
24 16 hellwig
;***************************************************************
25
 
26
        .import _ecode
27
        .import _edata
28
        .import _ebss
29
 
30 182 hellwig
        .import dspinit
31
        .import dspoutchk
32
        .import dspout
33
 
34 16 hellwig
        .import kbdinit
35
        .import kbdinchk
36
        .import kbdin
37
 
38 182 hellwig
        .import ser0init
39 16 hellwig
        .import ser0inchk
40
        .import ser0in
41
        .import ser0outchk
42
        .import ser0out
43
 
44 182 hellwig
        .import ser1init
45
        .import ser1inchk
46
        .import ser1in
47
        .import ser1outchk
48
        .import ser1out
49 16 hellwig
 
50 184 hellwig
        .import dskinitctl
51 182 hellwig
        .import dskcapctl
52
        .import dskioctl
53 184 hellwig
 
54
        .import dskinitser
55 182 hellwig
        .import dskcapser
56
        .import dskioser
57
 
58 16 hellwig
        .import main
59
 
60
        .export _bcode
61
        .export _bdata
62
        .export _bbss
63
 
64
        .export cinchk
65
        .export cin
66
        .export coutchk
67
        .export cout
68
        .export sinchk
69
        .export sin
70
        .export soutchk
71
        .export sout
72
        .export dskcap
73
        .export dskio
74
 
75
        .export getTLB_HI
76
        .export getTLB_LO
77
        .export setTLB
78
 
79
        .export saveState
80
        .export monitorReturn
81
 
82
        .import userContext
83
        .export resume
84
 
85
;***************************************************************
86
 
87
        .code
88
_bcode:
89
 
90
        .data
91
_bdata:
92
 
93
        .bss
94
_bbss:
95
 
96
;***************************************************************
97
 
98
        .code
99
        .align  4
100
 
101
reset:
102
        j       start
103
 
104
interrupt:
105
        j       isr
106
 
107
userMiss:
108
        j       umsr
109
 
110
;***************************************************************
111
 
112
        .code
113
        .align  4
114
 
115
cinchk:
116
        j       kbdinchk
117
;       j       ser0inchk
118
 
119
cin:
120
        j       kbdin
121
;       j       ser0in
122
 
123
coutchk:
124
        j       dspoutchk
125
;       j       ser0outchk
126
 
127
cout:
128
        j       dspout
129
;       j       ser0out
130
 
131
sinchk:
132
        j       ser0inchk
133
 
134
sin:
135
        j       ser0in
136
 
137
soutchk:
138
        j       ser0outchk
139
 
140
sout:
141
        j       ser0out
142
 
143
dskcap:
144
        j       dcap
145
 
146
dskio:
147
        j       dio
148
 
149 50 hellwig
reserved1:
150
        j       reserved1
151
 
152
reserved2:
153
        j       reserved2
154
 
155
reserved3:
156
        j       reserved3
157
 
158 16 hellwig
;***************************************************************
159
 
160
        .code
161
        .align  4
162
 
163
start:
164 50 hellwig
        ; let irq/exc vectors point to RAM
165
        add     $8,$0,V
166
        mvts    $8,PSW
167 16 hellwig
 
168 50 hellwig
        ; disable flash ROM, enable SPI bus
169
        add     $8,$0,BIO_OUT
170
        add     $9,$0,SPI_EN
171
        stw     $9,$8,0
172
 
173 16 hellwig
        ; initialize TLB
174
        mvts    $0,TLB_ENTRY_LO          ; invalidate all TLB entries
175
        add     $8,$0,dmapaddr           ; by impossible virtual page number
176 182 hellwig
        mvts    $8,TLB_ENTRY_HI
177
        add     $8,$0,$0
178
        add     $9,$0,TLB_ENTRIES
179 16 hellwig
tlbloop:
180 182 hellwig
        mvts    $8,TLB_INDEX
181 16 hellwig
        tbwi
182 182 hellwig
        add     $8,$8,1
183
        bne     $8,$9,tlbloop
184 16 hellwig
 
185
        ; copy data segment
186
        add     $10,$0,_bdata            ; lowest dst addr to be written to
187
        add     $8,$0,_edata             ; one above the top dst addr
188
        sub     $9,$8,$10               ; $9 = size of data segment
189
        add     $9,$9,_ecode            ; data is waiting right after code
190
        j       cpytest
191
cpyloop:
192
        ldw     $11,$9,0         ; src addr in $9
193
        stw     $11,$8,0         ; dst addr in $8
194
cpytest:
195
        sub     $8,$8,4                 ; downward
196
        sub     $9,$9,4
197
        bgeu    $8,$10,cpyloop
198
 
199
        ; clear bss segment
200
        add     $8,$0,_bbss              ; start with first word of bss
201
        add     $9,$0,_ebss              ; this is one above the top
202
        j       clrtest
203
clrloop:
204
        stw     $0,$8,0                   ; dst addr in $8
205
        add     $8,$8,4                 ; upward
206
clrtest:
207
        bltu    $8,$9,clrloop
208
 
209
        ; now do some useful work
210
        add     $29,$0,stacktop          ; setup monitor stack
211
        jal     dspinit                 ; init display
212
        jal     kbdinit                 ; init keyboard
213 182 hellwig
        jal     ser0init                ; init serial line 0
214
        jal     ser1init                ; init serial line 1
215 184 hellwig
        jal     dskinitctl              ; init disk (controller)
216
        jal     dskinitser              ; init disk (serial line)
217 16 hellwig
        jal     main                    ; enter command loop
218
 
219
        ; main should never return
220
        j       start                   ; just to be sure...
221
 
222
;***************************************************************
223
 
224 50 hellwig
        .code
225
        .align  4
226
 
227 16 hellwig
        ; Word getTLB_HI(int index)
228
getTLB_HI:
229
        mvts    $4,TLB_INDEX
230
        tbri
231
        mvfs    $2,TLB_ENTRY_HI
232
        jr      $31
233
 
234
        ; Word getTLB_LO(int index)
235
getTLB_LO:
236
        mvts    $4,TLB_INDEX
237
        tbri
238
        mvfs    $2,TLB_ENTRY_LO
239
        jr      $31
240
 
241
        ; void setTLB(int index, Word entryHi, Word entryLo)
242
setTLB:
243
        mvts    $4,TLB_INDEX
244
        mvts    $5,TLB_ENTRY_HI
245
        mvts    $6,TLB_ENTRY_LO
246
        tbwi
247
        jr      $31
248
 
249
;***************************************************************
250
 
251 50 hellwig
        .code
252
        .align  4
253
 
254 16 hellwig
        ; int dskcap(int dskno)
255
dcap:
256
        bne     $4,$0,dcapser
257 182 hellwig
        j       dskcapctl
258 16 hellwig
dcapser:
259 182 hellwig
        j       dskcapser
260 16 hellwig
 
261
        ; int dskio(int dskno, char cmd, int sct, Word addr, int nscts)
262
dio:
263
        bne     $4,$0,dioser
264
        add     $4,$5,$0
265
        add     $5,$6,$0
266
        add     $6,$7,$0
267
        ldw     $7,$29,16
268 182 hellwig
        j       dskioctl
269 16 hellwig
dioser:
270
        add     $4,$5,$0
271
        add     $5,$6,$0
272
        add     $6,$7,$0
273
        ldw     $7,$29,16
274 182 hellwig
        j       dskioser
275 16 hellwig
 
276
;***************************************************************
277
 
278
        .code
279
        .align  4
280
 
281
        ; Bool saveState(MonitorState *msp)
282
        ; always return 'true' here
283
saveState:
284
        stw     $31,$4,0*4               ; return address
285
        stw     $29,$4,1*4              ; stack pointer
286
        stw     $16,$4,2*4              ; local variables
287
        stw     $17,$4,3*4
288
        stw     $18,$4,4*4
289
        stw     $19,$4,5*4
290
        stw     $20,$4,6*4
291
        stw     $21,$4,7*4
292
        stw     $22,$4,8*4
293
        stw     $23,$4,9*4
294
        add     $2,$0,1
295
        jr      $31
296
 
297
        ; load state when re-entering monitor
298
        ; this appears as if returning from saveState
299
        ; but the return value is 'false' here
300
loadState:
301
        ldw     $8,$0,monitorReturn
302
        beq     $8,$0,loadState          ; fatal error: monitor state lost
303
        ldw     $31,$8,0*4               ; return address
304
        ldw     $29,$8,1*4              ; stack pointer
305
        ldw     $16,$8,2*4              ; local variables
306
        ldw     $17,$8,3*4
307
        ldw     $18,$8,4*4
308
        ldw     $19,$8,5*4
309
        ldw     $20,$8,6*4
310
        ldw     $21,$8,7*4
311
        ldw     $22,$8,8*4
312
        ldw     $23,$8,9*4
313
        add     $2,$0,0
314
        jr      $31
315
 
316
        .bss
317
        .align  4
318
 
319
        ; extern MonitorState *monitorReturn
320
monitorReturn:
321
        .space  4
322
 
323
        ; extern UserContext userContext
324
userContext:
325
        .space  USER_CONTEXT_SIZE
326
 
327
;***************************************************************
328
 
329
        .code
330
        .align  4
331
 
332
        ; void resume(void)
333
        ; use userContext to load state
334
resume:
335
        mvts    $0,PSW
336
        add     $28,$0,userContext
337
        .nosyn
338
        ldw     $8,$28,33*4             ; tlbIndex
339
        mvts    $8,TLB_INDEX
340 50 hellwig
        ldw     $8,$28,34*4             ; tlbEntryHi
341 16 hellwig
        mvts    $8,TLB_ENTRY_HI
342
        ldw     $8,$28,35*4             ; tlbEntryLo
343
        mvts    $8,TLB_ENTRY_LO
344 84 hellwig
        ldw     $8,$28,36*4             ; badAddress
345
        mvts    $8,BAD_ADDRESS
346 180 hellwig
        ldw     $8,$28,37*4             ; badAccess
347
        mvts    $8,BAD_ACCESS
348 16 hellwig
        ;ldw    $0,$28,0*4              ; registers
349
        ldw     $1,$28,1*4
350
        ldw     $2,$28,2*4
351
        ldw     $3,$28,3*4
352
        ldw     $4,$28,4*4
353
        ldw     $5,$28,5*4
354
        ldw     $6,$28,6*4
355
        ldw     $7,$28,7*4
356
        ldw     $8,$28,8*4
357
        ldw     $9,$28,9*4
358
        ldw     $10,$28,10*4
359
        ldw     $11,$28,11*4
360
        ldw     $12,$28,12*4
361
        ldw     $13,$28,13*4
362
        ldw     $14,$28,14*4
363
        ldw     $15,$28,15*4
364
        ldw     $16,$28,16*4
365
        ldw     $17,$28,17*4
366
        ldw     $18,$28,18*4
367
        ldw     $19,$28,19*4
368
        ldw     $20,$28,20*4
369
        ldw     $21,$28,21*4
370
        ldw     $22,$28,22*4
371
        ldw     $23,$28,23*4
372
        ldw     $24,$28,24*4
373
        ldw     $25,$28,25*4
374
        ldw     $26,$28,26*4
375
        ldw     $27,$28,27*4
376
        ;ldw    $28,$28,28*4
377
        ldw     $29,$28,29*4
378
        ldw     $30,$28,30*4
379
        ldw     $31,$28,31*4
380
        ldw     $28,$28,32*4            ; psw
381
        mvts    $28,PSW
382
        rfx
383
        .syn
384
 
385
        ; interrupt entry
386
        ; use userContext to store state
387
isr:
388
umsr:
389
        .nosyn
390
        ldhi    $28,userContext
391
        or      $28,$28,userContext
392
        stw     $0,$28,0*4                ; registers
393
        stw     $1,$28,1*4
394
        stw     $2,$28,2*4
395
        stw     $3,$28,3*4
396
        stw     $4,$28,4*4
397
        stw     $5,$28,5*4
398
        stw     $6,$28,6*4
399
        stw     $7,$28,7*4
400
        stw     $8,$28,8*4
401
        stw     $9,$28,9*4
402
        stw     $10,$28,10*4
403
        stw     $11,$28,11*4
404
        stw     $12,$28,12*4
405
        stw     $13,$28,13*4
406
        stw     $14,$28,14*4
407
        stw     $15,$28,15*4
408
        stw     $16,$28,16*4
409
        stw     $17,$28,17*4
410
        stw     $18,$28,18*4
411
        stw     $19,$28,19*4
412
        stw     $20,$28,20*4
413
        stw     $21,$28,21*4
414
        stw     $22,$28,22*4
415
        stw     $23,$28,23*4
416
        stw     $24,$28,24*4
417
        stw     $25,$28,25*4
418
        stw     $26,$28,26*4
419
        stw     $27,$28,27*4
420
        stw     $28,$28,28*4
421
        stw     $29,$28,29*4
422
        stw     $30,$28,30*4
423
        stw     $31,$28,31*4
424
        mvfs    $8,PSW
425
        stw     $8,$28,32*4             ; psw
426
        mvfs    $8,TLB_INDEX
427
        stw     $8,$28,33*4             ; tlbIndex
428
        mvfs    $8,TLB_ENTRY_HI
429
        stw     $8,$28,34*4             ; tlbEntryHi
430
        mvfs    $8,TLB_ENTRY_LO
431
        stw     $8,$28,35*4             ; tlbEntryLo
432 84 hellwig
        mvfs    $8,BAD_ADDRESS
433
        stw     $8,$28,36*4             ; badAddress
434 180 hellwig
        mvfs    $8,BAD_ACCESS
435
        stw     $8,$28,37*4             ; badAccess
436 16 hellwig
        .syn
437
        j       loadState

powered by: WebSVN 2.1.0

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