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 63

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

powered by: WebSVN 2.1.0

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