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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [monitor/] [monitor/] [boards/] [xsa-xst-3/] [start.s] - Diff between revs 180 and 182

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 180 Rev 182
;
;
; start.s -- ECO32 ROM monitor startup and support routines
; start.s -- ECO32 ROM monitor startup and support routines
;
;
 
 
        .set    dmapaddr,0xC0000000     ; base of directly mapped addresses
        .set    dmapaddr,0xC0000000     ; base of directly mapped addresses
        .set    stacktop,0xC0010000     ; monitor stack is at top of 64K
        .set    stacktop,0xC0010000     ; monitor stack is at top of 64K
 
 
        .set    PSW,0                    ; reg # of PSW
        .set    PSW,0                    ; reg # of PSW
        .set    V_SHIFT,27              ; interrupt vector ctrl bit
        .set    V_SHIFT,27              ; interrupt vector ctrl bit
        .set    V,1 << V_SHIFT
        .set    V,1 << V_SHIFT
 
 
        .set    TLB_INDEX,1             ; reg # of TLB Index
        .set    TLB_INDEX,1             ; reg # of TLB Index
        .set    TLB_ENTRY_HI,2          ; reg # of TLB EntryHi
        .set    TLB_ENTRY_HI,2          ; reg # of TLB EntryHi
        .set    TLB_ENTRY_LO,3          ; reg # of TLB EntryLo
        .set    TLB_ENTRY_LO,3          ; reg # of TLB EntryLo
        .set    TLB_ENTRIES,32          ; number of TLB entries
        .set    TLB_ENTRIES,32          ; number of TLB entries
        .set    BAD_ADDRESS,4           ; reg # of bad address reg
        .set    BAD_ADDRESS,4           ; reg # of bad address reg
        .set    BAD_ACCESS,5            ; reg # of bad access reg
        .set    BAD_ACCESS,5            ; reg # of bad access reg
 
 
        .set    USER_CONTEXT_SIZE,38*4  ; size of user context
        .set    USER_CONTEXT_SIZE,38*4  ; size of user context
 
 
;***************************************************************
;***************************************************************
 
 
        .import _ecode
        .import _ecode
        .import _edata
        .import _edata
        .import _ebss
        .import _ebss
 
 
        .import kbdinit
 
        .import kbdinchk
 
        .import kbdin
 
 
 
        .import dspinit
        .import dspinit
        .import dspoutchk
        .import dspoutchk
        .import dspout
        .import dspout
 
 
        .import serinit
        .import kbdinit
 
        .import kbdinchk
 
        .import kbdin
 
 
 
        .import ser0init
        .import ser0inchk
        .import ser0inchk
        .import ser0in
        .import ser0in
        .import ser0outchk
        .import ser0outchk
        .import ser0out
        .import ser0out
 
 
        .import sctcapctl
        .import ser1init
        .import sctioctl
        .import ser1inchk
        .import sctcapser
        .import ser1in
        .import sctioser
        .import ser1outchk
 
        .import ser1out
 
 
 
        .import dskinit
 
        .import dskcapctl
 
        .import dskioctl
 
        .import dskcapser
 
        .import dskioser
 
 
        .import main
        .import main
 
 
        .export _bcode
        .export _bcode
        .export _bdata
        .export _bdata
        .export _bbss
        .export _bbss
 
 
        .export cinchk
        .export cinchk
        .export cin
        .export cin
        .export coutchk
        .export coutchk
        .export cout
        .export cout
        .export sinchk
        .export sinchk
        .export sin
        .export sin
        .export soutchk
        .export soutchk
        .export sout
        .export sout
        .export dskcap
        .export dskcap
        .export dskio
        .export dskio
 
 
        .export setISR
 
        .export setUMSR
 
        .export isrPtr
 
        .export umsrPtr
 
 
 
        .export getTLB_HI
        .export getTLB_HI
        .export getTLB_LO
        .export getTLB_LO
        .export setTLB
        .export setTLB
 
 
        .export saveState
        .export saveState
        .export monitorReturn
        .export monitorReturn
 
 
        .import userContext
        .import userContext
        .export resume
        .export resume
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
_bcode:
_bcode:
 
 
        .data
        .data
_bdata:
_bdata:
 
 
        .bss
        .bss
_bbss:
_bbss:
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
        .align  4
        .align  4
 
 
reset:
reset:
        j       start
        j       start
 
 
interrupt:
interrupt:
        j       isr
        j       isr
 
 
userMiss:
userMiss:
        j       umsr
        j       umsr
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
        .align  4
        .align  4
 
 
cinchk:
cinchk:
;       j       kbdinchk
;       j       kbdinchk
        j       ser0inchk
        j       ser0inchk
 
 
cin:
cin:
;       j       kbdin
;       j       kbdin
        j       ser0in
        j       ser0in
 
 
coutchk:
coutchk:
;       j       dspoutchk
;       j       dspoutchk
        j       ser0outchk
        j       ser0outchk
 
 
cout:
cout:
;       j       dspout
;       j       dspout
        j       ser0out
        j       ser0out
 
 
sinchk:
sinchk:
        j       ser0inchk
        j       ser0inchk
 
 
sin:
sin:
        j       ser0in
        j       ser0in
 
 
soutchk:
soutchk:
        j       ser0outchk
        j       ser0outchk
 
 
sout:
sout:
        j       ser0out
        j       ser0out
 
 
dskcap:
dskcap:
        j       dcap
        j       dcap
 
 
dskio:
dskio:
        j       dio
        j       dio
 
 
reserved1:
reserved1:
        j       reserved1
        j       reserved1
 
 
reserved2:
reserved2:
        j       reserved2
        j       reserved2
 
 
reserved3:
reserved3:
        j       reserved3
        j       reserved3
 
 
setISR:
 
        j       setISR1
 
 
 
setUMSR:
 
        j       setUMSR1
 
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
        .align  4
        .align  4
 
 
start:
start:
        ; let irq/exc vectors point to RAM
        ; let irq/exc vectors point to RAM
        add     $8,$0,V
        add     $8,$0,V
        mvts    $8,PSW
        mvts    $8,PSW
 
 
        ; initialize TLB
        ; initialize TLB
        mvts    $0,TLB_ENTRY_LO          ; invalidate all TLB entries
        mvts    $0,TLB_ENTRY_LO          ; invalidate all TLB entries
        add     $8,$0,dmapaddr           ; by impossible virtual page number
        add     $8,$0,dmapaddr           ; by impossible virtual page number
        add     $9,$0,$0
 
        add     $10,$0,TLB_ENTRIES
 
tlbloop:
 
        mvts    $8,TLB_ENTRY_HI
        mvts    $8,TLB_ENTRY_HI
        mvts    $9,TLB_INDEX
        add     $8,$0,$0
 
        add     $9,$0,TLB_ENTRIES
 
tlbloop:
 
        mvts    $8,TLB_INDEX
        tbwi
        tbwi
        add     $8,$8,0x1000            ; all entries must be different
        add     $8,$8,1
        add     $9,$9,1
        bne     $8,$9,tlbloop
        bne     $9,$10,tlbloop
 
 
 
        ; copy data segment
        ; copy data segment
        add     $10,$0,_bdata            ; lowest dst addr to be written to
        add     $10,$0,_bdata            ; lowest dst addr to be written to
        add     $8,$0,_edata             ; one above the top dst addr
        add     $8,$0,_edata             ; one above the top dst addr
        sub     $9,$8,$10               ; $9 = size of data segment
        sub     $9,$8,$10               ; $9 = size of data segment
        add     $9,$9,_ecode            ; data is waiting right after code
        add     $9,$9,_ecode            ; data is waiting right after code
        j       cpytest
        j       cpytest
cpyloop:
cpyloop:
        ldw     $11,$9,0         ; src addr in $9
        ldw     $11,$9,0         ; src addr in $9
        stw     $11,$8,0         ; dst addr in $8
        stw     $11,$8,0         ; dst addr in $8
cpytest:
cpytest:
        sub     $8,$8,4                 ; downward
        sub     $8,$8,4                 ; downward
        sub     $9,$9,4
        sub     $9,$9,4
        bgeu    $8,$10,cpyloop
        bgeu    $8,$10,cpyloop
 
 
        ; clear bss segment
        ; clear bss segment
        add     $8,$0,_bbss              ; start with first word of bss
        add     $8,$0,_bbss              ; start with first word of bss
        add     $9,$0,_ebss              ; this is one above the top
        add     $9,$0,_ebss              ; this is one above the top
        j       clrtest
        j       clrtest
clrloop:
clrloop:
        stw     $0,$8,0                   ; dst addr in $8
        stw     $0,$8,0                   ; dst addr in $8
        add     $8,$8,4                 ; upward
        add     $8,$8,4                 ; upward
clrtest:
clrtest:
        bltu    $8,$9,clrloop
        bltu    $8,$9,clrloop
 
 
        ; now do some useful work
        ; now do some useful work
        add     $29,$0,stacktop          ; setup monitor stack
        add     $29,$0,stacktop          ; setup monitor stack
        jal     dspinit                 ; init display
        jal     dspinit                 ; init display
        jal     kbdinit                 ; init keyboard
        jal     kbdinit                 ; init keyboard
        jal     serinit                 ; init serial interface
        jal     ser0init                ; init serial line 0
 
        jal     ser1init                ; init serial line 1
 
        jal     dskinit                 ; init disk
        jal     main                    ; enter command loop
        jal     main                    ; enter command loop
 
 
        ; main should never return
        ; main should never return
        j       start                   ; just to be sure...
        j       start                   ; just to be sure...
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
        .align  4
        .align  4
 
 
        ; Word getTLB_HI(int index)
        ; Word getTLB_HI(int index)
getTLB_HI:
getTLB_HI:
        mvts    $4,TLB_INDEX
        mvts    $4,TLB_INDEX
        tbri
        tbri
        mvfs    $2,TLB_ENTRY_HI
        mvfs    $2,TLB_ENTRY_HI
        jr      $31
        jr      $31
 
 
        ; Word getTLB_LO(int index)
        ; Word getTLB_LO(int index)
getTLB_LO:
getTLB_LO:
        mvts    $4,TLB_INDEX
        mvts    $4,TLB_INDEX
        tbri
        tbri
        mvfs    $2,TLB_ENTRY_LO
        mvfs    $2,TLB_ENTRY_LO
        jr      $31
        jr      $31
 
 
        ; void setTLB(int index, Word entryHi, Word entryLo)
        ; void setTLB(int index, Word entryHi, Word entryLo)
setTLB:
setTLB:
        mvts    $4,TLB_INDEX
        mvts    $4,TLB_INDEX
        mvts    $5,TLB_ENTRY_HI
        mvts    $5,TLB_ENTRY_HI
        mvts    $6,TLB_ENTRY_LO
        mvts    $6,TLB_ENTRY_LO
        tbwi
        tbwi
        jr      $31
        jr      $31
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
        .align  4
        .align  4
 
 
        ; int dskcap(int dskno)
        ; int dskcap(int dskno)
dcap:
dcap:
        bne     $4,$0,dcapser
        bne     $4,$0,dcapser
        j       sctcapctl
        j       dskcapctl
dcapser:
dcapser:
        j       sctcapser
        j       dskcapser
 
 
        ; int dskio(int dskno, char cmd, int sct, Word addr, int nscts)
        ; int dskio(int dskno, char cmd, int sct, Word addr, int nscts)
dio:
dio:
        bne     $4,$0,dioser
        bne     $4,$0,dioser
        add     $4,$5,$0
        add     $4,$5,$0
        add     $5,$6,$0
        add     $5,$6,$0
        add     $6,$7,$0
        add     $6,$7,$0
        ldw     $7,$29,16
        ldw     $7,$29,16
        j       sctioctl
        j       dskioctl
dioser:
dioser:
        add     $4,$5,$0
        add     $4,$5,$0
        add     $5,$6,$0
        add     $5,$6,$0
        add     $6,$7,$0
        add     $6,$7,$0
        ldw     $7,$29,16
        ldw     $7,$29,16
        j       sctioser
        j       dskioser
 
 
;***************************************************************
 
 
 
        .code
 
        .align  4
 
 
 
        ; void setISR(Word ptr)
 
setISR1:
 
        stw     $4,$0,isrPtr
 
        jr      $31
 
 
 
        ; void setUMSR(Word ptr)
 
setUMSR1:
 
        stw     $4,$0,umsrPtr
 
        jr      $31
 
 
 
        .data
 
        .align  4
 
 
 
isrPtr:
 
        .word   0
 
 
 
umsrPtr:
 
        .word   0
 
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
        .align  4
        .align  4
 
 
        ; Bool saveState(MonitorState *msp)
        ; Bool saveState(MonitorState *msp)
        ; always return 'true' here
        ; always return 'true' here
saveState:
saveState:
        stw     $31,$4,0*4               ; return address
        stw     $31,$4,0*4               ; return address
        stw     $29,$4,1*4              ; stack pointer
        stw     $29,$4,1*4              ; stack pointer
        stw     $16,$4,2*4              ; local variables
        stw     $16,$4,2*4              ; local variables
        stw     $17,$4,3*4
        stw     $17,$4,3*4
        stw     $18,$4,4*4
        stw     $18,$4,4*4
        stw     $19,$4,5*4
        stw     $19,$4,5*4
        stw     $20,$4,6*4
        stw     $20,$4,6*4
        stw     $21,$4,7*4
        stw     $21,$4,7*4
        stw     $22,$4,8*4
        stw     $22,$4,8*4
        stw     $23,$4,9*4
        stw     $23,$4,9*4
        add     $2,$0,1
        add     $2,$0,1
        jr      $31
        jr      $31
 
 
        ; load state when re-entering monitor
        ; load state when re-entering monitor
        ; this appears as if returning from saveState
        ; this appears as if returning from saveState
        ; but the return value is 'false' here
        ; but the return value is 'false' here
loadState:
loadState:
        ldw     $8,$0,monitorReturn
        ldw     $8,$0,monitorReturn
        beq     $8,$0,loadState          ; fatal error: monitor state lost
        beq     $8,$0,loadState          ; fatal error: monitor state lost
        ldw     $31,$8,0*4               ; return address
        ldw     $31,$8,0*4               ; return address
        ldw     $29,$8,1*4              ; stack pointer
        ldw     $29,$8,1*4              ; stack pointer
        ldw     $16,$8,2*4              ; local variables
        ldw     $16,$8,2*4              ; local variables
        ldw     $17,$8,3*4
        ldw     $17,$8,3*4
        ldw     $18,$8,4*4
        ldw     $18,$8,4*4
        ldw     $19,$8,5*4
        ldw     $19,$8,5*4
        ldw     $20,$8,6*4
        ldw     $20,$8,6*4
        ldw     $21,$8,7*4
        ldw     $21,$8,7*4
        ldw     $22,$8,8*4
        ldw     $22,$8,8*4
        ldw     $23,$8,9*4
        ldw     $23,$8,9*4
        add     $2,$0,0
        add     $2,$0,0
        jr      $31
        jr      $31
 
 
        .bss
        .bss
        .align  4
        .align  4
 
 
        ; extern MonitorState *monitorReturn
        ; extern MonitorState *monitorReturn
monitorReturn:
monitorReturn:
        .space  4
        .space  4
 
 
        ; extern UserContext userContext
        ; extern UserContext userContext
userContext:
userContext:
        .space  USER_CONTEXT_SIZE
        .space  USER_CONTEXT_SIZE
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
        .align  4
        .align  4
 
 
        ; void resume(void)
        ; void resume(void)
        ; use userContext to load state
        ; use userContext to load state
resume:
resume:
        mvts    $0,PSW
        mvts    $0,PSW
        add     $28,$0,userContext
        add     $28,$0,userContext
        .nosyn
        .nosyn
        ldw     $8,$28,33*4             ; tlbIndex
        ldw     $8,$28,33*4             ; tlbIndex
        mvts    $8,TLB_INDEX
        mvts    $8,TLB_INDEX
        ldw     $8,$28,34*4             ; tlbEntryHi
        ldw     $8,$28,34*4             ; tlbEntryHi
        mvts    $8,TLB_ENTRY_HI
        mvts    $8,TLB_ENTRY_HI
        ldw     $8,$28,35*4             ; tlbEntryLo
        ldw     $8,$28,35*4             ; tlbEntryLo
        mvts    $8,TLB_ENTRY_LO
        mvts    $8,TLB_ENTRY_LO
        ldw     $8,$28,36*4             ; badAddress
        ldw     $8,$28,36*4             ; badAddress
        mvts    $8,BAD_ADDRESS
        mvts    $8,BAD_ADDRESS
        ldw     $8,$28,37*4             ; badAccess
        ldw     $8,$28,37*4             ; badAccess
        mvts    $8,BAD_ACCESS
        mvts    $8,BAD_ACCESS
        ;ldw    $0,$28,0*4              ; registers
        ;ldw    $0,$28,0*4              ; registers
        ldw     $1,$28,1*4
        ldw     $1,$28,1*4
        ldw     $2,$28,2*4
        ldw     $2,$28,2*4
        ldw     $3,$28,3*4
        ldw     $3,$28,3*4
        ldw     $4,$28,4*4
        ldw     $4,$28,4*4
        ldw     $5,$28,5*4
        ldw     $5,$28,5*4
        ldw     $6,$28,6*4
        ldw     $6,$28,6*4
        ldw     $7,$28,7*4
        ldw     $7,$28,7*4
        ldw     $8,$28,8*4
        ldw     $8,$28,8*4
        ldw     $9,$28,9*4
        ldw     $9,$28,9*4
        ldw     $10,$28,10*4
        ldw     $10,$28,10*4
        ldw     $11,$28,11*4
        ldw     $11,$28,11*4
        ldw     $12,$28,12*4
        ldw     $12,$28,12*4
        ldw     $13,$28,13*4
        ldw     $13,$28,13*4
        ldw     $14,$28,14*4
        ldw     $14,$28,14*4
        ldw     $15,$28,15*4
        ldw     $15,$28,15*4
        ldw     $16,$28,16*4
        ldw     $16,$28,16*4
        ldw     $17,$28,17*4
        ldw     $17,$28,17*4
        ldw     $18,$28,18*4
        ldw     $18,$28,18*4
        ldw     $19,$28,19*4
        ldw     $19,$28,19*4
        ldw     $20,$28,20*4
        ldw     $20,$28,20*4
        ldw     $21,$28,21*4
        ldw     $21,$28,21*4
        ldw     $22,$28,22*4
        ldw     $22,$28,22*4
        ldw     $23,$28,23*4
        ldw     $23,$28,23*4
        ldw     $24,$28,24*4
        ldw     $24,$28,24*4
        ldw     $25,$28,25*4
        ldw     $25,$28,25*4
        ldw     $26,$28,26*4
        ldw     $26,$28,26*4
        ldw     $27,$28,27*4
        ldw     $27,$28,27*4
        ;ldw    $28,$28,28*4
        ;ldw    $28,$28,28*4
        ldw     $29,$28,29*4
        ldw     $29,$28,29*4
        ldw     $30,$28,30*4
        ldw     $30,$28,30*4
        ldw     $31,$28,31*4
        ldw     $31,$28,31*4
        ldw     $28,$28,32*4            ; psw
        ldw     $28,$28,32*4            ; psw
        mvts    $28,PSW
        mvts    $28,PSW
        rfx
        rfx
        .syn
        .syn
 
 
        ; interrupt entry
        ; interrupt entry
        ; use userContext to store state
        ; use userContext to store state
isr:
isr:
umsr:
umsr:
        .nosyn
        .nosyn
        ldhi    $28,userContext
        ldhi    $28,userContext
        or      $28,$28,userContext
        or      $28,$28,userContext
        stw     $0,$28,0*4                ; registers
        stw     $0,$28,0*4                ; registers
        stw     $1,$28,1*4
        stw     $1,$28,1*4
        stw     $2,$28,2*4
        stw     $2,$28,2*4
        stw     $3,$28,3*4
        stw     $3,$28,3*4
        stw     $4,$28,4*4
        stw     $4,$28,4*4
        stw     $5,$28,5*4
        stw     $5,$28,5*4
        stw     $6,$28,6*4
        stw     $6,$28,6*4
        stw     $7,$28,7*4
        stw     $7,$28,7*4
        stw     $8,$28,8*4
        stw     $8,$28,8*4
        stw     $9,$28,9*4
        stw     $9,$28,9*4
        stw     $10,$28,10*4
        stw     $10,$28,10*4
        stw     $11,$28,11*4
        stw     $11,$28,11*4
        stw     $12,$28,12*4
        stw     $12,$28,12*4
        stw     $13,$28,13*4
        stw     $13,$28,13*4
        stw     $14,$28,14*4
        stw     $14,$28,14*4
        stw     $15,$28,15*4
        stw     $15,$28,15*4
        stw     $16,$28,16*4
        stw     $16,$28,16*4
        stw     $17,$28,17*4
        stw     $17,$28,17*4
        stw     $18,$28,18*4
        stw     $18,$28,18*4
        stw     $19,$28,19*4
        stw     $19,$28,19*4
        stw     $20,$28,20*4
        stw     $20,$28,20*4
        stw     $21,$28,21*4
        stw     $21,$28,21*4
        stw     $22,$28,22*4
        stw     $22,$28,22*4
        stw     $23,$28,23*4
        stw     $23,$28,23*4
        stw     $24,$28,24*4
        stw     $24,$28,24*4
        stw     $25,$28,25*4
        stw     $25,$28,25*4
        stw     $26,$28,26*4
        stw     $26,$28,26*4
        stw     $27,$28,27*4
        stw     $27,$28,27*4
        stw     $28,$28,28*4
        stw     $28,$28,28*4
        stw     $29,$28,29*4
        stw     $29,$28,29*4
        stw     $30,$28,30*4
        stw     $30,$28,30*4
        stw     $31,$28,31*4
        stw     $31,$28,31*4
        mvfs    $8,PSW
        mvfs    $8,PSW
        stw     $8,$28,32*4             ; psw
        stw     $8,$28,32*4             ; psw
        mvfs    $8,TLB_INDEX
        mvfs    $8,TLB_INDEX
        stw     $8,$28,33*4             ; tlbIndex
        stw     $8,$28,33*4             ; tlbIndex
        mvfs    $8,TLB_ENTRY_HI
        mvfs    $8,TLB_ENTRY_HI
        stw     $8,$28,34*4             ; tlbEntryHi
        stw     $8,$28,34*4             ; tlbEntryHi
        mvfs    $8,TLB_ENTRY_LO
        mvfs    $8,TLB_ENTRY_LO
        stw     $8,$28,35*4             ; tlbEntryLo
        stw     $8,$28,35*4             ; tlbEntryLo
        mvfs    $8,BAD_ADDRESS
        mvfs    $8,BAD_ADDRESS
        stw     $8,$28,36*4             ; badAddress
        stw     $8,$28,36*4             ; badAddress
        mvfs    $8,BAD_ACCESS
        mvfs    $8,BAD_ACCESS
        stw     $8,$28,37*4             ; badAccess
        stw     $8,$28,37*4             ; badAccess
        .syn
        .syn
        j       loadState
        j       loadState
 
 

powered by: WebSVN 2.1.0

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