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

Subversion Repositories eco32

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /eco32/trunk/monitor
    from Rev 180 to Rev 182
    Reverse comparison

Rev 180 → Rev 182

/monitor/common/serial.s
7,13 → 7,13
.set ser0base,0xF0300000 ; serial line 0 base address
.set ser1base,0xF0301000 ; serial line 1 base address
 
.export serinit ; initialize serial interface
 
.export ser0init ; line 0 initialization
.export ser0inchk ; line 0 input check
.export ser0in ; line 0 input
.export ser0outchk ; line 0 output check
.export ser0out ; line 0 output
 
.export ser1init ; line 1 initialization
.export ser1inchk ; line 1 input check
.export ser1in ; line 1 input
.export ser1outchk ; line 1 output check
24,14 → 24,9
.code
.align 4
 
serinit:
ser0init:
jr $31
 
;***************************************************************
 
.code
.align 4
 
ser0inchk:
add $8,$0,ser0base
ldw $2,$8,0
67,6 → 62,9
.code
.align 4
 
ser1init:
jr $31
 
ser1inchk:
add $8,$0,ser1base
ldw $2,$8,0
/monitor/common/start.h
44,11 → 44,6
int dskcap(int dskno);
int dskio(int dskno, char cmd, int sct, Word addr, int nscts);
 
void setISR(Word ptr);
void setUMSR(Word ptr);
extern Word isrPtr;
extern Word umsrPtr;
 
Word getTLB_HI(int index);
Word getTLB_LO(int index);
void setTLB(int index, Word entryHi, Word entryLo);
/monitor/common/sctio-ctl.s
1,5 → 1,5
;
; sctio-ctl.s -- disk sector I/O for disk made available by disk controller
; dskctl.s -- disk made available by disk controller
;
 
;***************************************************************
22,8 → 22,9
 
.set retries,1000000 ; retries to get disk ready
 
.export sctcapctl ; determine disk capacity
.export sctioctl ; do disk I/O
.export dskinit ; initialize disk
.export dskcapctl ; determine disk capacity
.export dskioctl ; do disk I/O
 
;***************************************************************
 
30,23 → 31,26
.code
.align 4
 
sctcapctl:
dskinit:
jr $31
 
dskcapctl:
add $8,$0,retries ; set retry count
add $9,$0,dskbase
sctcap1:
dskcap1:
ldw $10,$9,dskctrl
and $10,$10,ctrlrdy ; ready?
bne $10,$0,sctcapok ; yes - jump
bne $10,$0,dskcapok ; yes - jump
sub $8,$8,1
bne $8,$0,sctcap1 ; try again
bne $8,$0,dskcap1 ; try again
add $2,$0,0 ; no disk found
j sctcapx
sctcapok:
j dskcapx
dskcapok:
ldw $2,$9,dskcap ; get disk capacity
sctcapx:
dskcapx:
jr $31
 
sctioctl:
dskioctl:
sub $29,$29,24
stw $31,$29,20
stw $16,$29,16
60,15 → 64,15
add $19,$7,$0 ; number of sectors
 
add $8,$0,'r'
beq $16,$8,sctrd
beq $16,$8,dskrd
add $8,$0,'w'
beq $16,$8,sctwr
beq $16,$8,dskwr
add $2,$0,0xFF ; illegal command
j sctx
j dskx
 
sctrd:
dskrd:
add $2,$0,$0 ; return ok
beq $19,$0,sctx ; if no (more) sectors
beq $19,$0,dskx ; if no (more) sectors
add $8,$0,dskbase
add $9,$0,1
stw $9,$8,dskcnt ; number of sectors
75,37 → 79,37
stw $17,$8,dsksct ; sector number on disk
add $9,$0,ctrlstrt
stw $9,$8,dskctrl ; start command
sctrd1:
dskrd1:
ldw $2,$8,dskctrl
and $9,$2,ctrldone ; done?
beq $9,$0,sctrd1 ; no - wait
beq $9,$0,dskrd1 ; no - wait
and $9,$2,ctrlerr ; error?
bne $9,$0,sctx ; yes - leave
bne $9,$0,dskx ; yes - leave
add $8,$0,dskbase + dskbuf ; transfer data
add $9,$0,sctsize
sctrd2:
dskrd2:
ldw $10,$8,0 ; from disk buffer
stw $10,$18,0 ; to memory
add $8,$8,4
add $18,$18,4
sub $9,$9,4
bne $9,$0,sctrd2
bne $9,$0,dskrd2
add $17,$17,1 ; increment sector number
sub $19,$19,1 ; decrement number of sectors
j sctrd ; next sector
j dskrd ; next sector
 
sctwr:
dskwr:
add $2,$0,$0 ; return ok
beq $19,$0,sctx ; if no (more) sectors
beq $19,$0,dskx ; if no (more) sectors
add $8,$0,dskbase + dskbuf ; transfer data
add $9,$0,sctsize
sctwr1:
dskwr1:
ldw $10,$18,0 ; from memory
stw $10,$8,0 ; to disk buffer
add $18,$18,4
add $8,$8,4
sub $9,$9,4
bne $9,$0,sctwr1
bne $9,$0,dskwr1
add $8,$0,dskbase
add $9,$0,1
stw $9,$8,dskcnt ; number of sectors
112,17 → 116,17
stw $17,$8,dsksct ; sector number on disk
add $9,$0,ctrlwrt | ctrlstrt
stw $9,$8,dskctrl ; start command
sctwr2:
dskwr2:
ldw $2,$8,dskctrl
and $9,$2,ctrldone ; done?
beq $9,$0,sctwr2 ; no - wait
beq $9,$0,dskwr2 ; no - wait
and $9,$2,ctrlerr ; error?
bne $9,$0,sctx ; yes - leave
bne $9,$0,dskx ; yes - leave
add $17,$17,1 ; increment sector number
sub $19,$19,1 ; decrement number of sectors
j sctwr ; next sector
j dskwr ; next sector
 
sctx:
dskx:
ldw $20,$29,0
ldw $19,$29,4
ldw $18,$29,8
/monitor/common/main.c
12,15 → 12,19
#include "cpu.h"
 
 
#define VERSION "1.04"
#define PROMPT "ECO32 > "
 
 
int main(void) {
char *line;
 
printf("\n\nECO32 Machine Monitor 1.3\n\n");
printf("\n\nECO32 Machine Monitor %s\n\n", VERSION);
initInstrTable();
cpuSetPC(0xC0010000);
cpuSetPSW(0x08000000);
while (1) {
line = getLine("ECO32 > ");
line = getLine(PROMPT);
addHist(line);
execCommand(line);
}
/monitor/common/serial.h
7,11 → 7,13
#define _SERIAL_H_
 
 
void ser0init(void);
int ser0inchk(void);
int ser0in(void);
int ser0outchk(void);
void ser0out(int c);
 
void ser1init(void);
int ser1inchk(void);
int ser1in(void);
int ser1outchk(void);
/monitor/common/cpu.c
292,19 → 292,13
if ((psw & PSW_PRIO_MASK) >> 16 == 21 &&
(mmuGetEntryHi() & 0x80000000) == 0) {
/* TLB user miss */
if (umsrPtr == 0x00000000) {
printf("unexpected TLB user miss exception occurred\n");
return;
}
pc = umsrPtr;
printf("unexpected TLB user miss exception occurred\n");
return;
} else {
/* any other exception */
if (isrPtr == 0x00000000) {
printf("unexpected %s occurred\n",
exceptionToString((psw & PSW_PRIO_MASK) >> 16));
return;
}
pc = isrPtr;
printf("unexpected %s occurred\n",
exceptionToString((psw & PSW_PRIO_MASK) >> 16));
return;
}
}
 
359,19 → 353,13
if ((psw & PSW_PRIO_MASK) >> 16 == 21 &&
(mmuGetEntryHi() & 0x80000000) == 0) {
/* TLB user miss */
if (umsrPtr == 0x00000000) {
printf("unexpected TLB user miss exception occurred\n");
return;
}
pc = umsrPtr;
printf("unexpected TLB user miss exception occurred\n");
return;
} else {
/* any other exception */
if (isrPtr == 0x00000000) {
printf("unexpected %s occurred\n",
exceptionToString((psw & PSW_PRIO_MASK) >> 16));
return;
}
pc = isrPtr;
printf("unexpected %s occurred\n",
exceptionToString((psw & PSW_PRIO_MASK) >> 16));
return;
}
}
}
/monitor/common/sctio-ser.s
1,11 → 1,11
;
; sctio-ser.s -- disk sector I/O for disk made available by serial interface
; dskser.s -- disk made available by serial interface
;
 
;***************************************************************
 
.export sctcapser ; determine disk capacity
.export sctioser ; do disk I/O
.export dskcapser ; determine disk capacity
.export dskioser ; do disk I/O
 
.import ser1in
.import ser1out
25,7 → 25,7
.code
.align 4
 
sctcapser:
dskcapser:
sub $29,$29,16
stw $16,$29,0
stw $17,$29,4
50,11 → 50,11
bne $16,$0,handshake1
add $4,$0,frustratedmsg
jal puts
j sctcapx
j dskcapx
handshake3:
jal ser1in
add $8,$0,ACK
bne $2,$8,sctcapx
bne $2,$8,dskcapx
; we got an ACK so we return it
add $4,$0,ACK
jal ser1out
63,19 → 63,19
add $4,$0,'c'
jal ser1out ; request
jal ser1in ; first byte of response
bne $2,$0,sctcapx ; exit if error
bne $2,$0,dskcapx ; exit if error
 
; all is well and the server will give us the capacity
add $16,$0,4 ; 4 bytes to read
sctcap1:
dskcap1:
sll $18,$18,8
jal ser1in
or $18,$18,$2 ; most significant byte first
sub $16,$16,1
bne $16,$0,sctcap1
bne $16,$0,dskcap1
 
; return value is in $18
sctcapx:
dskcapx:
add $2,$0,$18
ldw $16,$29,0
ldw $17,$29,4
102,7 → 102,7
.code
.align 4
 
sctioser:
dskioser:
sub $29,$29,24
stw $16,$29,0
stw $17,$29,4
118,17 → 118,17
 
; switch over command
add $8,$0,'r'
beq $8,$16,sctior ; read
beq $8,$16,dskior ; read
add $8,$0,'w'
beq $8,$16,sctiow ; write
beq $8,$16,dskiow ; write
; unknown command
add $2,$0,1 ; value != 0 signifies error
j sctiox
j dskiox
 
; read from disk
sctior:
sctior1: ; loop over number of sectors
beq $19,$0,sctiorsuc ; successful return
dskior:
dskior1: ; loop over number of sectors
beq $19,$0,dskiorsuc ; successful return
sub $19,$19,1
; read a sector
add $4,$0,'r'
135,33 → 135,33
jal ser1out
; send sector number
add $20,$0,32 ; 4 bytes
sctior2:
dskior2:
sub $20,$20,8
slr $4,$17,$20
and $4,$4,0xff
jal ser1out
bne $20,$0,sctior2
bne $20,$0,dskior2
add $17,$17,1
; get answer
jal ser1in
bne $2,$0,sctiox ; $2 != 0 so we use it as return code
bne $2,$0,dskiox ; $2 != 0 so we use it as return code
; read data
add $20,$0,512
sctior3:
dskior3:
sub $20,$20,1
jal ser1in
stb $2,$18,0
add $18,$18,1
bne $20,$0,sctior3
j sctior1
sctiorsuc:
bne $20,$0,dskior3
j dskior1
dskiorsuc:
add $2,$0,$0
j sctiox
j dskiox
 
; write to disk
sctiow:
sctiow1: ; loop over number of sectors
beq $19,$0,sctiowsuc ; successful return
dskiow:
dskiow1: ; loop over number of sectors
beq $19,$0,dskiowsuc ; successful return
sub $19,$19,1
; write a sector
add $4,$0,'w'
168,28 → 168,28
jal ser1out
; send sector number
add $20,$0,32 ; 4 bytes
sctiow2:
dskiow2:
sub $20,$20,8
slr $4,$17,$20
and $4,$4,0xff
jal ser1out
bne $20,$0,sctiow2
bne $20,$0,dskiow2
add $17,$17,1
; write data
add $20,$0,512
sctiow3:
dskiow3:
sub $20,$20,1
ldbu $4,$18,0
jal ser1out
add $18,$18,1
bne $20,$0,sctiow3
bne $20,$0,dskiow3
; get answer
jal ser1in
bne $2,$0,sctiox
j sctiow1
sctiowsuc:
bne $2,$0,dskiox
j dskiow1
dskiowsuc:
add $2,$0,$0
sctiox:
dskiox:
ldw $16,$29,0
ldw $17,$29,4
ldw $18,$29,8
/monitor/boards/xsa-xst-3/Makefile
20,8 → 20,8
../../kbdtbls/kbdtbls.s \
../../common/display.s \
../../common/serial.s \
../../common/sctio-ctl.s \
../../common/sctio-ser.s \
../../common/dskctl.s \
../../common/dskser.s \
../../common/end.s
 
.PHONY: all install clean
/monitor/boards/xsa-xst-3/start.s
24,25 → 24,32
.import _edata
.import _ebss
 
.import dspinit
.import dspoutchk
.import dspout
 
.import kbdinit
.import kbdinchk
.import kbdin
 
.import dspinit
.import dspoutchk
.import dspout
 
.import serinit
.import ser0init
.import ser0inchk
.import ser0in
.import ser0outchk
.import ser0out
 
.import sctcapctl
.import sctioctl
.import sctcapser
.import sctioser
.import ser1init
.import ser1inchk
.import ser1in
.import ser1outchk
.import ser1out
 
.import dskinit
.import dskcapctl
.import dskioctl
.import dskcapser
.import dskioser
 
.import main
 
.export _bcode
60,11 → 67,6
.export dskcap
.export dskio
 
.export setISR
.export setUMSR
.export isrPtr
.export umsrPtr
 
.export getTLB_HI
.export getTLB_LO
.export setTLB
148,12 → 150,6
reserved3:
j reserved3
 
setISR:
j setISR1
 
setUMSR:
j setUMSR1
 
;***************************************************************
 
.code
167,15 → 163,14
; initialize TLB
mvts $0,TLB_ENTRY_LO ; invalidate all TLB entries
add $8,$0,dmapaddr ; by impossible virtual page number
add $9,$0,$0
add $10,$0,TLB_ENTRIES
mvts $8,TLB_ENTRY_HI
add $8,$0,$0
add $9,$0,TLB_ENTRIES
tlbloop:
mvts $8,TLB_ENTRY_HI
mvts $9,TLB_INDEX
mvts $8,TLB_INDEX
tbwi
add $8,$8,0x1000 ; all entries must be different
add $9,$9,1
bne $9,$10,tlbloop
add $8,$8,1
bne $8,$9,tlbloop
 
; copy data segment
add $10,$0,_bdata ; lowest dst addr to be written to
205,7 → 200,9
add $29,$0,stacktop ; setup monitor stack
jal dspinit ; init display
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
 
; main should never return
246,9 → 243,9
; int dskcap(int dskno)
dcap:
bne $4,$0,dcapser
j sctcapctl
j dskcapctl
dcapser:
j sctcapser
j dskcapser
 
; int dskio(int dskno, char cmd, int sct, Word addr, int nscts)
dio:
257,13 → 254,13
add $5,$6,$0
add $6,$7,$0
ldw $7,$29,16
j sctioctl
j dskioctl
dioser:
add $4,$5,$0
add $5,$6,$0
add $6,$7,$0
ldw $7,$29,16
j sctioser
j dskioser
 
;***************************************************************
 
270,30 → 267,6
.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
.align 4
 
; Bool saveState(MonitorState *msp)
; always return 'true' here
saveState:
/monitor/boards/s3e-500/Makefile
20,8 → 20,8
../../kbdtbls/kbdtbls.s \
../../common/display.s \
../../common/serial.s \
../../common/sctio-ctl.s \
../../common/sctio-ser.s \
../../common/dskctl.s \
../../common/dskser.s \
../../common/end.s
 
.PHONY: all install clean
/monitor/boards/s3e-500/start.s
27,25 → 27,32
.import _edata
.import _ebss
 
.import dspinit
.import dspoutchk
.import dspout
 
.import kbdinit
.import kbdinchk
.import kbdin
 
.import dspinit
.import dspoutchk
.import dspout
 
.import serinit
.import ser0init
.import ser0inchk
.import ser0in
.import ser0outchk
.import ser0out
 
.import sctcapctl
.import sctioctl
.import sctcapser
.import sctioser
.import ser1init
.import ser1inchk
.import ser1in
.import ser1outchk
.import ser1out
 
.import dskinit
.import dskcapctl
.import dskioctl
.import dskcapser
.import dskioser
 
.import main
 
.export _bcode
63,11 → 70,6
.export dskcap
.export dskio
 
.export setISR
.export setUMSR
.export isrPtr
.export umsrPtr
 
.export getTLB_HI
.export getTLB_LO
.export setTLB
151,12 → 153,6
reserved3:
j reserved3
 
setISR:
j setISR1
 
setUMSR:
j setUMSR1
 
;***************************************************************
 
.code
175,15 → 171,14
; initialize TLB
mvts $0,TLB_ENTRY_LO ; invalidate all TLB entries
add $8,$0,dmapaddr ; by impossible virtual page number
add $9,$0,$0
add $10,$0,TLB_ENTRIES
mvts $8,TLB_ENTRY_HI
add $8,$0,$0
add $9,$0,TLB_ENTRIES
tlbloop:
mvts $8,TLB_ENTRY_HI
mvts $9,TLB_INDEX
mvts $8,TLB_INDEX
tbwi
add $8,$8,0x1000 ; all entries must be different
add $9,$9,1
bne $9,$10,tlbloop
add $8,$8,1
bne $8,$9,tlbloop
 
; copy data segment
add $10,$0,_bdata ; lowest dst addr to be written to
213,7 → 208,9
add $29,$0,stacktop ; setup monitor stack
jal dspinit ; init display
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
 
; main should never return
254,9 → 251,9
; int dskcap(int dskno)
dcap:
bne $4,$0,dcapser
j sctcapctl
j dskcapctl
dcapser:
j sctcapser
j dskcapser
 
; int dskio(int dskno, char cmd, int sct, Word addr, int nscts)
dio:
265,13 → 262,13
add $5,$6,$0
add $6,$7,$0
ldw $7,$29,16
j sctioctl
j dskioctl
dioser:
add $4,$5,$0
add $5,$6,$0
add $6,$7,$0
ldw $7,$29,16
j sctioser
j dskioser
 
;***************************************************************
 
278,30 → 275,6
.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
.align 4
 
; Bool saveState(MonitorState *msp)
; always return 'true' here
saveState:

powered by: WebSVN 2.1.0

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