1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-08-09 01:25:00 +00:00

Constant op codes

This commit is contained in:
Dave Schmenk
2018-03-03 18:55:39 -08:00
parent 40c3dcd197
commit 793b1760a0
8 changed files with 163 additions and 50 deletions

View File

@@ -614,6 +614,21 @@ void emit_conststr(long conststr)
printf("\t%s\t$2E\t\t\t; CS\n", DB); printf("\t%s\t$2E\t\t\t; CS\n", DB);
emit_data(0, STRING_TYPE, conststr, 0); emit_data(0, STRING_TYPE, conststr, 0);
} }
void emit_addi(int cval)
{
emit_pending_seq();
printf("\t%s\t$34,$%02X\t\t\t; ADDI\t%d\n", DB, cval, cval);
}
void emit_andi(int cval)
{
emit_pending_seq();
printf("\t%s\t$3C,$%02X\t\t\t; ANDI\t%d\n", DB, cval, cval);
}
void emit_ori(int cval)
{
emit_pending_seq();
printf("\t%s\t$52,$%02X\t\t\t; IORI\t%d\n", DB, cval, cval);
}
void emit_lb(void) void emit_lb(void)
{ {
printf("\t%s\t$60\t\t\t; LB\n", DB); printf("\t%s\t$60\t\t\t; LB\n", DB);
@@ -793,28 +808,28 @@ void emit_brlt(int tag)
printf("\t%s\t$3A\t\t\t; BRLT\t_B%03d\n", DB, 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); printf("\t%s\t_B%03d-*\n", DW, tag);
} }
void emit_nxtup(int tag) void emit_brle(int tag)
{ {
emit_pending_seq(); emit_pending_seq();
printf("\t%s\t$32\t\t\t; NXTUP\t_B%03d\n", DB, tag); printf("\t%s\t$80\t\t\t; NXTUP\t_B%03d\n", DB, tag);
printf("\t%s\t_B%03d-*\n", DW, tag); printf("\t%s\t_B%03d-*\n", DW, tag);
} }
void emit_inxtup(int tag) void emit_incbrle(int tag)
{ {
emit_pending_seq(); emit_pending_seq();
printf("\t%s\t$34\t\t\t; INXTUP\t_B%03d\n", DB, tag); printf("\t%s\t$82\t\t\t; INXTUP\t_B%03d\n", DB, tag);
printf("\t%s\t_B%03d-*\n", DW, tag); printf("\t%s\t_B%03d-*\n", DW, tag);
} }
void emit_nxtdn(int tag) void emit_brge(int tag)
{ {
emit_pending_seq(); emit_pending_seq();
printf("\t%s\t$3C\t\t\t; NXTDN\t_B%03d\n", DB, tag); printf("\t%s\t$84\t\t\t; NXTDN\t_B%03d\n", DB, tag);
printf("\t%s\t_B%03d-*\n", DW, tag); printf("\t%s\t_B%03d-*\n", DW, tag);
} }
void emit_dnxtdn(int tag) void emit_decbrge(int tag)
{ {
emit_pending_seq(); emit_pending_seq();
printf("\t%s\t$52\t\t\t; DNXTDN\t_B%03d\n", DB, tag); printf("\t%s\t$84\t\t\t; DNXTDN\t_B%03d\n", DB, tag);
printf("\t%s\t_B%03d-*\n", DW, tag); printf("\t%s\t_B%03d-*\n", DW, tag);
} }
void emit_call(int tag, int type) void emit_call(int tag, int type)
@@ -865,6 +880,11 @@ void emit_drop(void)
emit_pending_seq(); emit_pending_seq();
printf("\t%s\t$30\t\t\t; DROP\n", DB); printf("\t%s\t$30\t\t\t; DROP\n", DB);
} }
void emit_dup(void)
{
emit_pending_seq();
printf("\t%s\t$32\t\t\t; DUP\n", DB);
}
int emit_unaryop(t_token op) int emit_unaryop(t_token op)
{ {
emit_pending_seq(); emit_pending_seq();
@@ -1240,6 +1260,27 @@ int crunch_seq(t_opseq **seq, int pass)
if ((pass > 0) && (freeops == 0) && (op->val != 0)) if ((pass > 0) && (freeops == 0) && (op->val != 0))
crunched = try_dupify(op); crunched = try_dupify(op);
break; // CONST_CODE break; // CONST_CODE
case BINARY_CODE(ADD_TOKEN):
if (op->val >= 0 && op->val <= 255)
{
op->code = ADDI_CODE;
freeops = 1;
}
break;
case BINARY_CODE(AND_TOKEN):
if (op->val >= 0 && op->val <= 255)
{
op->code = ANDI_CODE;
freeops = 1;
}
break;
case BINARY_CODE(OR_TOKEN):
if (op->val >= 0 && op->val <= 255)
{
op->code = ORI_CODE;
freeops = 1;
}
break;
case BINARY_CODE(MUL_TOKEN): case BINARY_CODE(MUL_TOKEN):
for (shiftcnt = 0; shiftcnt < 16; shiftcnt++) for (shiftcnt = 0; shiftcnt < 16; shiftcnt++)
{ {
@@ -1607,6 +1648,15 @@ int emit_pending_seq()
case STR_CODE: case STR_CODE:
emit_conststr(op->val); emit_conststr(op->val);
break; break;
case ADDI_CODE:
emit_addi(op->val);
break;
case ANDI_CODE:
emit_andi(op->val);
break;
case ORI_CODE:
emit_ori(op->val);
break;
case LB_CODE: case LB_CODE:
emit_lb(); emit_lb();
break; break;
@@ -1676,6 +1726,9 @@ int emit_pending_seq()
case DROP_CODE: case DROP_CODE:
emit_drop(); emit_drop();
break; break;
case DUP_CODE:
emit_dup();
break;
case BRNCH_CODE: case BRNCH_CODE:
emit_brnch(op->tag); emit_brnch(op->tag);
break; break;

View File

@@ -59,11 +59,14 @@ typedef struct _opseq {
#define INDEXW_CODE 0x0317 #define INDEXW_CODE 0x0317
#define DROP_CODE 0x0318 #define DROP_CODE 0x0318
#define DUP_CODE 0x0319 #define DUP_CODE 0x0319
#define BRNCH_CODE 0x031C #define ADDI_CODE 0x031A
#define BRFALSE_CODE 0x031D #define ANDI_CODE 0x031B
#define BRTRUE_CODE 0x031E #define ORI_CODE 0x31C
#define CODETAG_CODE 0x031F #define BRNCH_CODE 0x031D
#define NOP_CODE 0x0320 #define BRFALSE_CODE 0x031E
#define BRTRUE_CODE 0x031F
#define CODETAG_CODE 0x0320
#define NOP_CODE 0x0321
#define gen_uop(seq,op) gen_seq(seq,UNARY_CODE(op),0,0,0,0) #define gen_uop(seq,op) gen_seq(seq,UNARY_CODE(op),0,0,0,0)
#define gen_op(seq,op) gen_seq(seq,BINARY_CODE(op),0,0,0,0) #define gen_op(seq,op) gen_seq(seq,BINARY_CODE(op),0,0,0,0)
@@ -102,6 +105,9 @@ int emit_data(int vartype, int consttype, long constval, int constsize);
void emit_codetag(int tag); void emit_codetag(int tag);
void emit_const(int cval); void emit_const(int cval);
void emit_conststr(long conststr); void emit_conststr(long conststr);
void emit_addi(int cval);
void emit_andi(int cval);
void emit_ori(int cval);
void emit_lb(void); void emit_lb(void);
void emit_lw(void); void emit_lw(void);
void emit_llb(int index); void emit_llb(int index);
@@ -128,16 +134,17 @@ int emit_unaryop(t_token op);
int emit_op(t_token op); int emit_op(t_token op);
void emit_brtru(int tag); void emit_brtru(int tag);
void emit_brfls(int tag); void emit_brfls(int tag);
void emit_brgt(int tag);
void emit_brlt(int tag);
void emit_brne(int tag); void emit_brne(int tag);
void emit_brnch(int tag); void emit_brnch(int tag);
void emit_nxtup(int tag); void emit_brgt(int tag);
void emit_inxtup(int tag); void emit_brlt(int tag);
void emit_nxtdn(int tag); void emit_brle(int tag);
void emit_dnxtdn(int tag); void emit_incbrle(int tag);
void emit_brge(int tag);
void emit_decbrge(int tag);
void emit_empty(void); void emit_empty(void);
void emit_drop(void); void emit_drop(void);
void emit_dup(void);
void emit_leave(void); void emit_leave(void);
void emit_ret(void); void emit_ret(void);
void emit_enter(int cparams); void emit_enter(int cparams);

View File

@@ -191,24 +191,24 @@ def emit_brlt(tag)#0
emit_byte($3A) emit_byte($3A)
emit_reladdr(tag) emit_reladdr(tag)
end end
def emit_nxtup(tag)#0 def emit_brle(tag)#0
emit_pending_seq emit_pending_seq
emit_byte($32) emit_byte($80)
emit_reladdr(tag) emit_reladdr(tag)
end end
def emit_inxtup(tag)#0 def emit_incbrle(tag)#0
emit_pending_seq emit_pending_seq
emit_byte($34) emit_byte($82)
emit_reladdr(tag) emit_reladdr(tag)
end end
def emit_nxtdn(tag)#0 def emit_brge(tag)#0
emit_pending_seq emit_pending_seq
emit_byte($3C) emit_byte($84)
emit_reladdr(tag) emit_reladdr(tag)
end end
def emit_dnxtdn(tag)#0 def emit_decbrge(tag)#0
emit_pending_seq emit_pending_seq
emit_byte($52) emit_byte($86)
emit_reladdr(tag) emit_reladdr(tag)
end end
def emit_leave#0 def emit_leave#0
@@ -300,6 +300,9 @@ def emit_pending_seq#0
codeptr=>1 = op=>opval codeptr=>1 = op=>opval
codeptr = codeptr + 3 codeptr = codeptr + 3
fin fin
else
*codeptr = op->opcode | (op->opval << 8)
codeptr = codeptr + 2
fin fin
break break
// //

View File

@@ -214,6 +214,24 @@ def crunch_seq(seq, pass)
crunched = try_dupify(op) crunched = try_dupify(op)
fin fin
break // CONST_CODE break // CONST_CODE
is ADD_CODE
if op=>opval >= 0 and op=>opval <= 255
op->opcode = ADDI_CODE
freeops = 1
fin
break
is AND_CODE
if op=>opval >= 0 and op=>opval <= 255
op->opcode = ANDI_CODE
freeops = 1
fin
break
is OR_CODE
if op=>opval >= 0 and op=>opval <= 255
op->opcode = ORI_CODE
freeops = 1
fin
break
is MUL_CODE is MUL_CODE
for shiftcnt = 0 to 15 for shiftcnt = 0 to 15
if op=>opval == 1 << shiftcnt if op=>opval == 1 << shiftcnt

View File

@@ -3,6 +3,9 @@
// //
const CONST_GROUP = $00 const CONST_GROUP = $00
const CONST_CODE = $2C const CONST_CODE = $2C
const ADDI_CODE = $34
const ANDI_CODE = $3C
const ORI_CODE = $52
const CONSTR_GROUP = $01 const CONSTR_GROUP = $01
const CONSTR_CODE = $2E const CONSTR_CODE = $2E
// //

View File

@@ -979,10 +979,10 @@ int parse_stmnt(void)
{ {
emit_seq(seq); emit_seq(seq);
emit_op(ADD_TOKEN); emit_op(ADD_TOKEN);
emit_nxtup(tag_for); emit_brle(tag_for);
} }
else else
emit_inxtup(tag_for); emit_incbrle(tag_for);
} }
else else
{ {
@@ -990,10 +990,10 @@ int parse_stmnt(void)
{ {
emit_seq(seq); emit_seq(seq);
emit_op(SUB_TOKEN); emit_op(SUB_TOKEN);
emit_nxtdn(tag_for); emit_brge(tag_for);
} }
else else
emit_dnxtdn(tag_for); emit_decbrge(tag_for);
} }
emit_codetag(break_tag); emit_codetag(break_tag);
break_tag = tag_prevbrk; break_tag = tag_prevbrk;

View File

@@ -762,17 +762,17 @@ def parse_stmnt
if seq if seq
emit_seq(seq) emit_seq(seq)
emit_code(ADD_CODE) emit_code(ADD_CODE)
emit_nxtup(tag_for) emit_brle(tag_for)
else else
emit_inxtup(tag_for) emit_incbrle(tag_for)
fin fin
else else
if seq if seq
emit_seq(seq) emit_seq(seq)
emit_code(SUB_CODE) emit_code(SUB_CODE)
emit_nxtdn(tag_for) emit_brge(tag_for)
else else
emit_dnxtdn(tag_for) emit_decbrge(tag_for)
fin fin
fin fin

View File

@@ -198,11 +198,12 @@ VMCORE = *
OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E !WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E !WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,NXTUP,INXTUP,DIVMOD,BRGT,BRLT,NXTDN,BRNE ; 30 32 34 36 38 3A 3C 3E !WORD DROP,DUP,ADDI,DIVMOD,BRGT,BRLT,ANDI,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E !WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,DNXTDN,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E !WORD BRNCH,ORI,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E !WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
!WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E !WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E
!WORD BRLE,INCBRLE,BRGE,DECBRGE ; 80 82 84 86 88 8A 8C 8E
;* ;*
;* ENTER INTO BYTECODE INTERPRETER ;* ENTER INTO BYTECODE INTERPRETER
;* ;*
@@ -407,11 +408,12 @@ LCDEFCMD = *-28 ; DEFCMD IN LC MEMORY
OPXTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E OPXTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E !WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CSX ; 20 22 24 26 28 2A 2C 2E !WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CSX ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,NXTUP,INXTUP,DIVMOD,BRGT,BRLT,NXTDN,BRNE ; 30 32 34 36 38 3A 3C 3E !WORD DROP,DUP,ADDI,DIVMOD,BRGT,BRLT,ANDI,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E !WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,DNXTDN,CALLX,ICALX,ENTER,LEAVEX,RETX,CFFB ; 50 52 54 56 58 5A 5C 5E !WORD BRNCH,ORI,CALLX,ICALX,ENTER,LEAVEX,RETX,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLB,DLW ; 60 62 64 66 68 6A 6C 6E !WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
!WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E !WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E
!WORD BRLE,INCBRLE,BRGE,DECBRGE ; 80 82 84 86 88 8A 8C 8E
;* ;*
;* ADD TOS TO TOS-1 ;* ADD TOS TO TOS-1
;* ;*
@@ -710,12 +712,12 @@ LOR LDA ESTKL,X
;* ;*
;* DUPLICATE TOS ;* DUPLICATE TOS
;* ;*
;DUP DEX DUP DEX
; LDA ESTKL+1,X LDA ESTKL+1,X
; STA ESTKL,X STA ESTKL,X
; LDA ESTKH+1,X LDA ESTKH+1,X
; STA ESTKH,X STA ESTKH,X
; JMP NEXTOP JMP NEXTOP
;* ;*
;* LOGICAL NOT ;* LOGICAL NOT
;* ;*
@@ -752,6 +754,33 @@ CB DEX
STA ESTKL,X STA ESTKL,X
JMP NEXTOP JMP NEXTOP
;* ;*
;* ADD IMMEDIATE TO TOS
;*
ADDI INY ;+INC_IP
LDA (IP),Y
CLC
ADC ESTKL,X
STA ESTKL,X
BCC +
INC ESTKH,X
+ JMP NEXTOP
;*
;* AND IMMEDIATE TO TOS
;*
ANDI INY ;+INC_IP
LDA (IP),Y
AND ESTKL,X
STA ESTKL,X
JMP NEXTOP
;*
;* IOR IMMEDIATE TO TOS
;*
ORI INY ;+INC_IP
LDA (IP),Y
ORA ESTKL,X
STA ESTKL,X
JMP NEXTOP
;*
;* LOAD ADDRESS & LOAD CONSTANT WORD (SAME THING, WITH OR WITHOUT FIXUP) ;* LOAD ADDRESS & LOAD CONSTANT WORD (SAME THING, WITH OR WITHOUT FIXUP)
;* ;*
- TYA ; RENORMALIZE IP - TYA ; RENORMALIZE IP
@@ -1340,11 +1369,11 @@ BRLT LDA ESTKL,X
BNE BRNCH ; BMI BRNCH BNE BRNCH ; BMI BRNCH
+ BMI NOBRNCH + BMI NOBRNCH
BPL - BPL -
DNXTDN LDA ESTKL,X DECBRGE LDA ESTKL,X
BNE + BNE +
DEC ESTKH,X DEC ESTKH,X
+ DEC ESTKL,X + DEC ESTKL,X
NXTDN LDA ESTKL,X ; BRGE BRGE LDA ESTKL,X ; BRGE
CMP ESTKL+1,X CMP ESTKL+1,X
LDA ESTKH,X LDA ESTKH,X
SBC ESTKH+1,X SBC ESTKH+1,X
@@ -1353,10 +1382,10 @@ NXTDN LDA ESTKL,X ; BRGE
- INX ; DROP FOR VALUES - INX ; DROP FOR VALUES
INX INX
BNE NOBRNCH ; BMI NOBRNCH BNE NOBRNCH ; BMI NOBRNCH
INXTUP INC ESTKL,X INCBRLE INC ESTKL,X
BNE NXTUP BNE BRLE
INC ESTKH,X INC ESTKH,X
NXTUP LDA ESTKL+1,X ; BRLE BRLE LDA ESTKL+1,X ; BRLE
CMP ESTKL,X CMP ESTKL,X
LDA ESTKH+1,X LDA ESTKH+1,X
SBC ESTKH,X SBC ESTKH,X