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 331

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

powered by: WebSVN 2.1.0

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