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;