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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [monitor/] [monitor/] [boards/] [xsa-xst-3/] [start.s] - Blame information for rev 65

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

powered by: WebSVN 2.1.0

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