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: |