code: 9ferno

Download patch

ref: 186de178d5ddf4ed91d9f9410de238fe1d3ec4b9
parent: 4b789895db7cc077cd28fa71db93155f7410fbbd
author: 9ferno <gophone2015@gmail.com>
date: Sun Nov 21 01:40:08 EST 2021

working devforth skeleton

--- a/os/pc64/forth.s
+++ b/os/pc64/forth.s
@@ -505,7 +505,7 @@
 	JMP CX
 
 TEXT	unloop(SB), 1, $-4
-	SUBQ $16, RSP
+	ADDQ $16, RSP
 	NEXT
 
 TEXT	cmove(SB), 1, $-4	/* ( a1 a2 n -- ) */
@@ -544,6 +544,7 @@
 	NEXT
 
 TEXT	s0(SB), 1, $-4	/* S0 needs a calculation to come up with the value */
+	PUSH(TOP)
 	MOVQ H0, TOP
 	ADDQ $PSTACK_END, TOP
 	NEXT
@@ -550,6 +551,7 @@
 
 /* store the forth sp here when going to C */
 TEXT	forthsp(SB), 1, $-4
+	PUSH(TOP)
 	MOVQ H0, TOP
 	ADDQ $FORTHSP, TOP
 	NEXT
@@ -557,6 +559,7 @@
 /* variables used by the core words */
 
 #define	VARIABLE(name, location)	TEXT	name(SB), 1, $-4 ;\
+	PUSH(TOP); \
 	MOVQ H0, TOP ;\
 	ADDQ location, TOP ;\
 	NEXT;
--- a/os/pc64/words-nasm.s
+++ b/os/pc64/words-nasm.s
@@ -936,16 +936,14 @@
  dd m_exitcolon
 
  CENTRY `query`, c_query, 5
- dd mc_EOF	; variable eof
- dd c_off	; off sets variable eof = 0
+ dd mc_EOF	; constant eof = 0
  dd m_Tib	; constant puts address of tibuffer on the top
  dd m_literal
- dd 1024	; ( tibuffer -- tibuffer 1024 )
- dd c_accept	; ( tibuffer 1024 -- n )
+ dd 4096	; ( EOF tibuffer -- EOF tibuffer 4096 )
+ dd c_accept	; ( EOF tibuffer 4096 -- n )
  dd m_dup
  dd c_0eq
  dd mc_EOF
- dd m_fetch
  dd m_binand
  dd m_cjump
  dd L152
@@ -1771,11 +1769,11 @@
 
  dd m_literal
  dd c_parenabort ; ( (abort) -- )
- dd m_Abortvec	; constant that puts (abort) code address on the stack
+ dd m_Abortvec	; variable that puts (abort) code address on the stack
  dd m_store	; variable abortvec = (abort) code address
 
- dd m_Wordb	; constant puts address of wordbuffer on the top of stack
- dd m_Wordbuf	; variable wordbuf
+ dd m_Wordb	; variable puts address of wordbuffer on the top of stack
+ dd m_Wordbuf ; variable wordbuf
  dd m_store	; variable wordbuf = address of wordbuffer
 
  dd m_Tib	; constant puts address of tibuffer on the top of stack
--- a/os/port/chan.c
+++ b/os/port/chan.c
@@ -1591,7 +1591,7 @@
 		 */
 		m = nil;
 		cnew = nil;	/* is this assignment necessary? */
-		if(!waserror()){	/* try create */
+		if(waserror() == 0){	/* try create, no error condition */
 			if(!nomount && findmount(&cnew, &m, c->type, c->dev, c->qid))
 				cnew = createdir(cnew, m);
 			else{
--- a/os/port/proc.c
+++ b/os/port/proc.c
@@ -1012,12 +1012,13 @@
 }
 
 void
-showerrlabs(void)
+showerrlabs(char *str)
 {
 	int i;
 
+	print("%s caller 0x%zx\n", str, getcallerpc(&str));
 	for(i=0; i<up->nerrlab; i++){
-		print("i %d SP 0x%p PC 0x%p\n", i, up->errlab[i].sp, up->errlab[i].pc);
+		print("	i %d SP 0x%p PC 0x%p\n", i, up->errlab[i].sp, up->errlab[i].pc);
 	}
 }
 
@@ -1027,7 +1028,6 @@
 	if(up == nil)
 		panic("error(%s) not in a process", err);
 	spllo();
-
 	if(up->nerrlab >= NERR)
 		panic("error stack too deep");
 	if(err == nil)
@@ -1036,13 +1036,14 @@
 	if(emptystr(err) == 1){
 		DBG("error nil error err %s caller 0x%p\n", err, getcallerpc(&err));
 		up->env->errpc = 0;
-		/* showerrlabs(); */
+		/* showerrlabs("error == nil"); */
 	}else{
+		DBG("error err %s caller 0x%p\n", err, getcallerpc(&err));
 		up->env->errpc = getcallerpc(&err);
 		/* proactively show issues */
 		/* print("up->nerrlab %d error %s raised by 0x%zx\n",
 			up->nerrlab, err, getcallerpc(&err)); */
-		/* showerrlabs(); */
+		/* showerrlabs("error != nil"); */
 	}
 	nexterror();
 }
--- a/os/port/sysfile.c
+++ b/os/port/sysfile.c
@@ -922,17 +922,19 @@
 	nr = 0;
 	while(mount != nil) {
 		/* Error causes component of union to be skipped */
-		if(mount->to && !waserror()) {
-			if(c->umc == nil){
-				c->umc = cclone(mount->to);
-				c->umc = devtab[c->umc->type]->open(c->umc, OREAD);
-			}
+		if(mount->to != nil){
+			if(waserror() == 0) { /* no error */
+				if(c->umc == nil){
+					c->umc = cclone(mount->to);
+					c->umc = devtab[c->umc->type]->open(c->umc, OREAD);
+				}
 	
-			nr = devtab[c->umc->type]->read(c->umc, va, n, c->umc->offset);
-			if(nr < 0)
-				nr = 0;	/* dev.c can return -1 */
-			c->umc->offset += nr;
-			poperror();
+				nr = devtab[c->umc->type]->read(c->umc, va, n, c->umc->offset);
+				if(nr < 0)
+					nr = 0;	/* dev.c can return -1 */
+				c->umc->offset += nr;
+				poperror();
+			}
 		}
 		if(nr > 0)
 			break;