mirror of
https://github.com/badvision/lawless-legends.git
synced 2025-01-29 15:32:23 +00:00
Bug fixes for VM and code generator
This commit is contained in:
parent
8807fbcbc2
commit
4b3de4e458
@ -557,14 +557,14 @@ void emit_brne(int tag)
|
||||
printf("\t%s\t$3E\t\t\t; BRNE\t_B%03d\n", DB, tag);
|
||||
printf("\t%s\t_B%03d-*\n", DW, tag);
|
||||
}
|
||||
void emit_brlt(int tag)
|
||||
{
|
||||
printf("\t%s\t$38\t\t\t; BRLT\t_B%03d\n", DB, tag);
|
||||
printf("\t%s\t_B%03d-*\n", DW, tag);
|
||||
}
|
||||
void emit_brgt(int tag)
|
||||
{
|
||||
printf("\t%s\t$3A\t\t\t; BRGT\t_B%03d\n", DB, tag);
|
||||
printf("\t%s\t$38\t\t\t; BRGT\t_B%03d\n", DB, tag);
|
||||
printf("\t%s\t_B%03d-*\n", DW, tag);
|
||||
}
|
||||
void emit_brlt(int tag)
|
||||
{
|
||||
printf("\t%s\t$3A\t\t\t; BRLT\t_B%03d\n", DB, tag);
|
||||
printf("\t%s\t_B%03d-*\n", DW, tag);
|
||||
}
|
||||
void emit_call(int tag, int type)
|
||||
|
@ -20,10 +20,10 @@ TXTTYPE = .TXT
|
||||
#SYSTYPE = \#ff0000
|
||||
#TXTTYPE = \#040000
|
||||
|
||||
all: $(PLASM) $(PLVM)
|
||||
all: $(PLASM) $(PLVM) TESTLIB
|
||||
|
||||
clean:
|
||||
-rm *.o *~ *.a *.BIN $(PLASM) $(PLVM)
|
||||
-rm *.o *~ *.a *.BIN TESTLIB $(PLASM) $(PLVM)
|
||||
|
||||
$(PLASM): $(OBJS) $(INCS)
|
||||
cc $(OBJS) -o $(PLASM)
|
||||
@ -31,12 +31,16 @@ $(PLASM): $(OBJS) $(INCS)
|
||||
$(PLVM): plvm.c
|
||||
cc plvm.c -o $(PLVM)
|
||||
|
||||
test: test.pla $(PLVM) $(PLASM)
|
||||
TESTLIB: testlib.pla $(PLVM) $(PLASM)
|
||||
./$(PLASM) -A < testlib.pla > testlib.a
|
||||
acme --setpc 4096 -o TESTLIB testlib.a
|
||||
|
||||
test: test.pla TESTLIB $(PLVM) $(PLASM)
|
||||
./$(PLASM) -A < test.pla > test.a
|
||||
acme --setpc 4096 -o TEST.BIN test.a
|
||||
./$(PLVM) TEST.BIN MAIN
|
||||
|
||||
debug: test.pla $(PLVM) $(PLASM)
|
||||
debug: test.pla TESTLIB $(PLVM) $(PLASM)
|
||||
./$(PLASM) -A < test.pla > test.a
|
||||
acme --setpc 4096 -o TEST.BIN test.a
|
||||
./$(PLVM) -s TEST.BIN MAIN
|
||||
|
@ -17,7 +17,8 @@ int show_state = 0;
|
||||
*/
|
||||
#define BYTE_PTR(bp) ((byte)(*bp++))
|
||||
#define WORD_PTR(bp) ((word)(*bp++|(*++bp << 8)))
|
||||
#define UWORD_PTR(bp) ((uword)(*bp++|(*++bp << 8)))
|
||||
#define UWORD_PTR(bp) ((uword)((*bp++|(*++bp << 8))&0xFFFF))
|
||||
#define TO_UWORD(w) ((w)&0xFFFF)
|
||||
#define MOD_ADDR 0x1000
|
||||
#define DEF_CALL 0x0800
|
||||
#define DEF_CALLSZ 0x0800
|
||||
@ -502,17 +503,19 @@ OPTBL: DW ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
|
||||
*/
|
||||
void interp(code *ip)
|
||||
{
|
||||
word val, ea, frmsz, parmcnt;
|
||||
int val, ea, frmsz, parmcnt;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (show_state)
|
||||
{
|
||||
char cmdline[16];
|
||||
word *dsp = &eval_stack[EVAL_STACKSZ - 1];
|
||||
printf("$%04X: $%02X [ ", ip - mem_data, *ip);
|
||||
while (dsp >= esp)
|
||||
printf("$%04X ", (*dsp--) & 0xFFFF);
|
||||
printf("]\n");
|
||||
gets(cmdline);
|
||||
}
|
||||
switch (*ip++)
|
||||
{
|
||||
@ -548,7 +551,7 @@ void interp(code *ip)
|
||||
PUSH(ea % val);
|
||||
break;
|
||||
case 0x0C: // INCR : TOS = TOS + 1
|
||||
TOS++;
|
||||
TOS++;;
|
||||
break;
|
||||
case 0x0E: // DECR : TOS = TOS - 1
|
||||
TOS--;
|
||||
@ -644,32 +647,28 @@ void interp(code *ip)
|
||||
break;
|
||||
case 0x38: // BRGT : TOS-1 > TOS ? IP += (IP)
|
||||
val = POP;
|
||||
ea = POP;
|
||||
if (ea <= val)
|
||||
if (TOS > val)
|
||||
ip += WORD_PTR(ip) - 2;
|
||||
else
|
||||
ip += 2;
|
||||
break;
|
||||
case 0x3A: // BRLT : TOS-1 < TOS ? IP += (IP)
|
||||
val = POP;
|
||||
ea = TOS;
|
||||
if (ea >= val)
|
||||
if (TOS < val)
|
||||
ip += WORD_PTR(ip) - 2;
|
||||
else
|
||||
ip += 2;
|
||||
break;
|
||||
case 0x3C: // BREQ : TOS == TOS-1 ? IP += (IP)
|
||||
val = POP;
|
||||
ea = TOS;
|
||||
if (ea == val)
|
||||
if (TOS == val)
|
||||
ip += WORD_PTR(ip) - 2;
|
||||
else
|
||||
ip += 2;
|
||||
break;
|
||||
case 0x3E: // BRNE : TOS != TOS-1 ? IP += (IP)
|
||||
val = POP;
|
||||
ea = TOS;
|
||||
if (ea != val)
|
||||
if (TOS != val)
|
||||
ip += WORD_PTR(ip) - 2;
|
||||
else
|
||||
ip += 2;
|
||||
@ -680,32 +679,32 @@ void interp(code *ip)
|
||||
case 0x40: // ISEQ : TOS = TOS == TOS-1
|
||||
val = POP;
|
||||
ea = POP;
|
||||
PUSH(ea == val);
|
||||
PUSH((ea == val) ? -1 : 0);
|
||||
break;
|
||||
case 0x42: // ISNE : TOS = TOS != TOS-1
|
||||
val = POP;
|
||||
ea = POP;
|
||||
PUSH(ea != val);
|
||||
PUSH((ea != val) ? -1 : 0);
|
||||
break;
|
||||
case 0x44: // ISGT : TOS = TOS-1 > TOS
|
||||
val = POP;
|
||||
ea = POP;
|
||||
PUSH(ea <= val);
|
||||
PUSH((ea > val) ? -1 : 0);
|
||||
break;
|
||||
case 0x46: // ISLT : TOS = TOS-1 < TOS
|
||||
val = POP;
|
||||
ea = POP;
|
||||
PUSH(ea >= val);
|
||||
PUSH((ea < val) ? -1 : 0);
|
||||
break;
|
||||
case 0x48: // ISGE : TOS = TOS-1 >= TOS
|
||||
val = POP;
|
||||
ea = POP;
|
||||
PUSH(ea < val);
|
||||
PUSH((ea >= val) ? -1 : 0);
|
||||
break;
|
||||
case 0x4A: // ISLE : TOS = TOS-1 <= TOS
|
||||
val = POP;
|
||||
ea = POP;
|
||||
PUSH(ea > val);
|
||||
PUSH((ea <= val) ? -1 : 0);
|
||||
break;
|
||||
case 0x4C: // BRFLS : !TOS ? IP += (IP)
|
||||
if (!POP)
|
||||
@ -740,14 +739,20 @@ void interp(code *ip)
|
||||
frmsz = BYTE_PTR(ip);
|
||||
mem_data[fp - frmsz] = fp;
|
||||
mem_data[fp - frmsz + 1] = fp >> 8;
|
||||
if (show_state)
|
||||
printf("< $%04X: $%04X > ", fp - frmsz, fp);
|
||||
fp -= frmsz;
|
||||
parmcnt = BYTE_PTR(ip);
|
||||
while (parmcnt--)
|
||||
{
|
||||
val = POP;
|
||||
mem_data[fp + parmcnt + 2] = val;
|
||||
mem_data[fp + parmcnt + 3] = val >> 8;
|
||||
mem_data[fp + parmcnt * 2 + 2] = val;
|
||||
mem_data[fp + parmcnt * 2 + 3] = val >> 8;
|
||||
if (show_state)
|
||||
printf("< $%04X: $%04X > ", fp + parmcnt * 2 + 2, mem_data[fp + parmcnt * 2 + 2] | (mem_data[fp + parmcnt * 2 + 3] >> 8));
|
||||
}
|
||||
if (show_state)
|
||||
printf("\n");
|
||||
break;
|
||||
case 0x5A: // LEAVE : DEL FRAME, IP = TOFP
|
||||
fp = mem_data[fp] | (mem_data[fp + 1] << 8);
|
||||
@ -759,18 +764,18 @@ void interp(code *ip)
|
||||
* 0x60-0x6F
|
||||
*/
|
||||
case 0x60: // LB : TOS = BYTE (TOS)
|
||||
val = UPOP;
|
||||
PUSH(mem_data[val]);
|
||||
ea = TO_UWORD(POP);
|
||||
PUSH(mem_data[ea]);
|
||||
break;
|
||||
case 0x62: // LW : TOS = WORD (TOS)
|
||||
ea = POP;
|
||||
ea = TO_UWORD(POP);
|
||||
PUSH(mem_data[ea] | (mem_data[ea + 1] << 8));
|
||||
break;
|
||||
case 0x64: // LLB : TOS = LOCALBYTE [IP]
|
||||
PUSH(mem_data[fp + BYTE_PTR(ip)]);
|
||||
PUSH(mem_data[TO_UWORD(fp + BYTE_PTR(ip))]);
|
||||
break;
|
||||
case 0x66: // LLW : TOS = LOCALWORD [IP]
|
||||
ea = fp + BYTE_PTR(ip);
|
||||
ea = TO_UWORD(fp + BYTE_PTR(ip));
|
||||
PUSH(mem_data[ea] | (mem_data[ea + 1] << 8));
|
||||
break;
|
||||
case 0x68: // LAB : TOS = BYTE (IP)
|
||||
@ -781,10 +786,10 @@ void interp(code *ip)
|
||||
PUSH(mem_data[ea] | (mem_data[ea + 1] << 8));
|
||||
break;
|
||||
case 0x6C: // DLB : TOS = TOS, LOCALBYTE [IP] = TOS
|
||||
mem_data[fp + BYTE_PTR(ip)] = TOS;
|
||||
mem_data[TO_UWORD(fp + BYTE_PTR(ip))] = TOS;
|
||||
break;
|
||||
case 0x6E: // DLW : TOS = TOS, LOCALWORD [IP] = TOS
|
||||
ea = fp + BYTE_PTR(ip);
|
||||
ea = TO_UWORD(fp + BYTE_PTR(ip));
|
||||
mem_data[ea] = TOS;
|
||||
mem_data[ea + 1] = TOS >> 8;
|
||||
break;
|
||||
@ -793,38 +798,38 @@ void interp(code *ip)
|
||||
*/
|
||||
case 0x70: // SB : BYTE (TOS) = TOS-1
|
||||
val = POP;
|
||||
ea = POP;
|
||||
ea = TO_UWORD(POP);
|
||||
mem_data[ea] = val;
|
||||
break;
|
||||
case 0x72: // SW : WORD (TOS) = TOS-1
|
||||
val = POP;
|
||||
ea = POP;
|
||||
ea = TO_UWORD(POP);
|
||||
mem_data[ea] = val;
|
||||
mem_data[ea + 1] = val >> 8;
|
||||
break;
|
||||
case 0x74: // SLB : LOCALBYTE [TOS] = TOS-1
|
||||
mem_data[fp + BYTE_PTR(ip)] = POP;
|
||||
mem_data[TO_UWORD(fp + BYTE_PTR(ip))] = POP;
|
||||
break;
|
||||
case 0x76: // SLW : LOCALWORD [TOS] = TOS-1
|
||||
ea = fp + BYTE_PTR(ip);
|
||||
ea = TO_UWORD(fp + BYTE_PTR(ip));
|
||||
val = POP;
|
||||
mem_data[ea] = val;
|
||||
mem_data[ea + 1] = val >> 8;
|
||||
break;
|
||||
case 0x78: // SAB : BYTE (IP) = TOS
|
||||
mem_data[WORD_PTR(ip)] = POP;
|
||||
mem_data[TO_UWORD(WORD_PTR(ip))] = POP;
|
||||
break;
|
||||
case 0x7A: // SAW : WORD (IP) = TOS
|
||||
ea = WORD_PTR(ip);
|
||||
ea = TO_UWORD(WORD_PTR(ip));
|
||||
val = POP;
|
||||
mem_data[ea] = val;
|
||||
mem_data[ea + 1] = val >> 8;
|
||||
break;
|
||||
case 0x7C: // DAB : TOS = TOS, BYTE (IP) = TOS
|
||||
mem_data[WORD_PTR(ip)] = TOS;
|
||||
mem_data[TO_UWORD(WORD_PTR(ip))] = TOS;
|
||||
break;
|
||||
case 0x7E: // DAW : TOS = TOS, WORD (IP) = TOS
|
||||
ea = WORD_PTR(ip);
|
||||
ea = TO_UWORD(WORD_PTR(ip));
|
||||
mem_data[ea] = TOS;
|
||||
mem_data[ea + 1] = TOS >> 8;
|
||||
break;
|
||||
|
@ -4,6 +4,10 @@
|
||||
import stdlib
|
||||
predef cls, gotoxy, puts, putc
|
||||
end
|
||||
|
||||
import testlib
|
||||
predef puti
|
||||
end
|
||||
;
|
||||
; Predeclare and functions called before defined.
|
||||
;
|
||||
@ -16,7 +20,6 @@ word defptr = main
|
||||
;
|
||||
; Define functions.
|
||||
;
|
||||
|
||||
export def ascii
|
||||
byte i
|
||||
cls()
|
||||
@ -25,10 +28,19 @@ export def ascii
|
||||
next
|
||||
end
|
||||
|
||||
export def nums
|
||||
word i
|
||||
for i = -10 to 10
|
||||
puti(i)
|
||||
putc('\n')
|
||||
next
|
||||
end
|
||||
|
||||
export def main
|
||||
cls()
|
||||
gotoxy(35,15)
|
||||
return puts(@hello)
|
||||
gotoxy(35,5)
|
||||
puts(@hello)
|
||||
return nums
|
||||
end
|
||||
|
||||
export def indirect
|
||||
|
Loading…
x
Reference in New Issue
Block a user