Yet another RAM structure revamp for memory protection and future multitasking - to be reflected in README

This commit is contained in:
Luxferre
2022-08-13 19:05:25 +03:00
parent b16e692e89
commit 080078cce5
+12 -11
View File
@@ -101,6 +101,9 @@ struct EquiCtx { /* one Equi program context */
ushort rsp; /* return stack pointer */
ushort lsp; /* literal stack pointer */
ushort cltp; /* compilation lookup table pointer */
ushort cbp; /* compilation buffer pointer */
uchar CM; /* compilation mode flag */
uchar IM; /* interpretation mode flag */
ushort gpd_start; /* GPD area start for this task */
ushort cmd_start; /* command buffer start for this task */
ushort cmd_size; /* size of loaded code in bytes for this task */
@@ -117,11 +120,8 @@ struct EquiRAM {
uchar literal_stack_size; /* literal stack size in bytes */
ushort cmd_start; /* (global) command buffer start */
ushort cmd_size; /* (global) command buffer size in bytes */
ushort cbp; /* compilation buffer pointer */
ushort ibp; /* input buffer pointer */
uchar II; /* instruction ignore mode flag */
uchar CM; /* compilation mode flag */
uchar IM; /* interpretation mode flag */
uchar MM; /* minification bypass mode flag */
ushort taskcount; /* count of active tasks */
ushort taskid; /* currently running task ID - necessary? */
@@ -400,6 +400,8 @@ struct EquiCtx* equi_load_task(ushort progStart, ushort len) {
taskptr->cmd_size = len; /* actual command buffer size */
taskptr->id = ram.taskcount; /* assign task ID */
taskptr->gpd_start = (ushort) (taskptr->gpd - flatram); /* assign GPD area start */
taskptr->IM = 1; /* set interpretation mode flag */
taskptr->CM = 0; /* unset compilation mode flag */
++ram.taskcount; /* increase task count */
return taskptr;
}
@@ -421,7 +423,7 @@ void equi_main_loop() {
continue;
}
/* then, check for compilation mode */
if(ram.CM) {
if(curtask->CM) {
if(instr == INS_CMEND) { /* trigger word compilation logic as per the spec */
if(curtask->lsp < 1)
trapout(STACK_UNDERFLOW);
@@ -429,11 +431,11 @@ void equi_main_loop() {
/* hash and save compiled word */
curtask->clt[curtask->cltp].nhash = crc16(&(curtask->literal_stack[0]), curtask->lsp);
curtask->lsp = 0; /* clear the literal stack */
curtask->clt[curtask->cltp].loc = ram.cbp; /* stored the compiled code location from the most recent CBP value */
curtask->clt[curtask->cltp].loc = curtask->cbp; /* stored the compiled code location from the most recent CBP value */
++curtask->cltp; /* increase the word */
if(curtask->cltp == CLT_ENTRIES_MAX)
trapout(CLT_OVERFLOW);
ram.CM = 0; /* unset compilation mode flag */
curtask->CM = 0; /* unset compilation mode flag */
}
continue;
}
@@ -448,8 +450,8 @@ void equi_main_loop() {
pushLitVal();
switch(instr) { /* then perform all main interpretation logic */
case INS_CMSTART: /* compilation start */
ram.cbp = curtask->pc + 1U; /* save CBP */
ram.CM = 1U; /* raise CM flag */
curtask->cbp = curtask->pc + 1U; /* save CBP */
curtask->CM = 1U; /* raise CM flag */
break;
case CR:
case LF:
@@ -630,7 +632,7 @@ void equi_main_loop() {
/* close the persistent sandbox file if open */
if(pfd) fclose(pfd);
/* unset interpretation mode flag and exit */
ram.IM = 0;
curtask->IM = 0;
curtask->pc = ram.ibp = 65535U;
/* clear all stacks and CLT */
curtask->msp = curtask->rsp = curtask->lsp = curtask->cltp = 0;
@@ -654,7 +656,7 @@ int main(int argc, char* argv[]) {
ram.literal_stack_size = LIT_STACK_SIZE;
ram.cmd_start = (uchar *)&ram.cmdbuf - (uchar *)&ram;
ram.cmd_size = CMD_BUF_SIZE;
ram.II = ram.CM = ram.IM = ram.MM = 0; /* reset all flags */
ram.II = ram.MM = 0; /* reset all flags */
ram.taskcount = 0;
/* process command line params */
if(argc > 1 && argv[1][0] == 'm') /* enter minification mode, don't run the programs */
@@ -706,7 +708,6 @@ int main(int argc, char* argv[]) {
cputc(LF); /* echo LF */
}
ram.cmdbuf[++ram.ibp] = INS_QUIT; /* end program with INS_QUIT */
ram.IM = 1; /* set the mandatory interpretation mode flag */
curtask = equi_load_task((ushort)ram.cmd_start, ram.ibp + 1); /* load the code as task 0 */
equi_main_loop(); /* and run the interpreter loop */
if(!smode) {