1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-07-19 21:29:56 +00:00

Merge branch 'devel' of https://github.com/dschmenk/PLASMA into devel

This commit is contained in:
Dave Schmenk 2018-03-15 21:54:32 -07:00
commit b987b927d3
12 changed files with 49 additions and 26 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1268,6 +1268,14 @@ int crunch_seq(t_opseq **seq, int pass)
freeops = 1; freeops = 1;
} }
break; break;
case BRGT_CODE:
if (opprev && (opprev->code == CONST_CODE) && (op->val <= opprev->val))
freeops = 1;
break;
case BRLT_CODE:
if (opprev && (opprev->code == CONST_CODE) && (op->val >= opprev->val))
freeops = 1;
break;
case BROR_CODE: case BROR_CODE:
if (!op->val) if (!op->val)
freeops = -2; // Remove zero constant freeops = -2; // Remove zero constant
@ -1355,7 +1363,7 @@ int crunch_seq(t_opseq **seq, int pass)
case BINARY_CODE(LE_TOKEN): case BINARY_CODE(LE_TOKEN):
op->val = op->val <= opnext->val ? 1 : 0; op->val = op->val <= opnext->val ? 1 : 0;
freeops = 2; freeops = 2;
break; break;
} }
// End of collapse constant operation // End of collapse constant operation
if ((pass > 0) && (freeops == 0) && (op->val != 0)) if ((pass > 0) && (freeops == 0) && (op->val != 0))
@ -1976,6 +1984,12 @@ int emit_pending_seq()
case BRTRUE_CODE: case BRTRUE_CODE:
emit_brtru(op->tag); emit_brtru(op->tag);
break; break;
case BRGT_CODE:
emit_brgt(op->tag);
break;
case BRLT_CODE:
emit_brlt(op->tag);
break;
case CODETAG_CODE: case CODETAG_CODE:
printf("_B%03d%c\n", op->tag, LBL); printf("_B%03d%c\n", op->tag, LBL);
break; break;

View File

@ -66,10 +66,12 @@ typedef struct _opseq {
#define BRTRUE_CODE 0x0322 #define BRTRUE_CODE 0x0322
#define BREQ_CODE 0x0323 #define BREQ_CODE 0x0323
#define BRNE_CODE 0x0324 #define BRNE_CODE 0x0324
#define BRAND_CODE 0x325 #define BRAND_CODE 0x0325
#define BROR_CODE 0x326 #define BROR_CODE 0x0326
#define CODETAG_CODE 0x0327 #define BRLT_CODE 0x0327
#define NOP_CODE 0x0328 #define BRGT_CODE 0x0328
#define CODETAG_CODE 0x0329
#define NOP_CODE 0x032A
#define ADDLB_CODE 0x0330 #define ADDLB_CODE 0x0330
#define ADDLW_CODE 0x0331 #define ADDLW_CODE 0x0331
#define ADDAB_CODE 0x0332 #define ADDAB_CODE 0x0332
@ -95,6 +97,8 @@ typedef struct _opseq {
#define gen_drop(seq) gen_seq(seq,DROP_CODE,0,0,0,0) #define gen_drop(seq) gen_seq(seq,DROP_CODE,0,0,0,0)
#define gen_brand(seq,tag) gen_seq(seq,BRAND_CODE,0,tag,0,0) #define gen_brand(seq,tag) gen_seq(seq,BRAND_CODE,0,tag,0,0)
#define gen_bror(seq,tag) gen_seq(seq,BROR_CODE,0,tag,0,0) #define gen_bror(seq,tag) gen_seq(seq,BROR_CODE,0,tag,0,0)
#define gen_brgt(seq,tag) gen_seq(seq,BRGT_CODE,0,tag,0,0)
#define gen_brlt(seq,tag) gen_seq(seq,BRLT_CODE,0,tag,0,0)
#define gen_brfls(seq,tag) gen_seq(seq,BRFALSE_CODE,0,tag,0,0) #define gen_brfls(seq,tag) gen_seq(seq,BRFALSE_CODE,0,tag,0,0)
#define gen_brtru(seq,tag) gen_seq(seq,BRTRUE_CODE,0,tag,0,0) #define gen_brtru(seq,tag) gen_seq(seq,BRTRUE_CODE,0,tag,0,0)
#define gen_brnch(seq,tag) gen_seq(seq,BRNCH_CODE,0,tag,0,0) #define gen_brnch(seq,tag) gen_seq(seq,BRNCH_CODE,0,tag,0,0)

View File

@ -113,6 +113,16 @@ def crunch_seq(seq, pass)
freeops = 1 freeops = 1
fin fin
break break
is BRGT_CODE
if opprev and (opprev->opcode == CONST_CODE) and (op=>opval <= opprev=>opval)
freeops = 1
fin
break
is BRLT_CODE
if opprev and (opprev->opcode == CONST_CODE) and (op=>opval >= opprev=>opval)
freeops = 1
fin
break
is BROR_CODE is BROR_CODE
if not op=>opval if not op=>opval
freeops = -2 // Remove zero constant freeops = -2 // Remove zero constant

View File

@ -89,6 +89,8 @@ const BRTRUE_CODE = $4E
const BRNCH_CODE = $50 const BRNCH_CODE = $50
const BRAND_CODE = $AC const BRAND_CODE = $AC
const BROR_CODE = $AE const BROR_CODE = $AE
const BRGT_CODE = $A0
const BRLT_CODE = $A2
// //
// Code tag address group // Code tag address group
// //

View File

@ -994,9 +994,8 @@ int parse_stmnt(void)
{ {
seq = NULL; seq = NULL;
} }
emit_seq(toseq); toseq = cat_seq(toseq, fromseq);
emit_seq(fromseq); emit_seq(step > 0 ? gen_brgt(toseq, break_tag) : gen_brlt(toseq, break_tag));
step > 0 ? emit_brgt(break_tag) : emit_brlt(break_tag);
emit_codetag(tag_for); emit_codetag(tag_for);
if (type & LOCAL_TYPE) if (type & LOCAL_TYPE)
type & BYTE_TYPE ? emit_dlb(addr) : emit_dlw(addr); type & BYTE_TYPE ? emit_dlb(addr) : emit_dlw(addr);

View File

@ -755,9 +755,7 @@ def parse_stmnt
else else
seq = NULL seq = NULL
fin fin
emit_seq(toseq) emit_seq(gen_oprel(cat_seq(toseq, fromseq), stepdir > 0 ?? BRGT_CODE :: BRLT_CODE, break_tag))
emit_seq(fromseq)
if stepdir > 0; emit_brgt(break_tag); else; emit_brlt(break_tag); fin
emit_tag(tag_for) emit_tag(tag_for)
if type & LOCAL_TYPE if type & LOCAL_TYPE
if type & BYTE_TYPE; emit_dlb(addr); else; emit_dlw(addr); fin if type & BYTE_TYPE; emit_dlb(addr); else; emit_dlw(addr); fin

View File

@ -634,12 +634,9 @@ LW LDA ESTKL,X
LDA (ESTKH-1,X) LDA (ESTKH-1,X)
STA ESTKL,X STA ESTKL,X
INC ESTKH-1,X INC ESTKH-1,X
BEQ + BNE +
LDA (ESTKH-1,X) INC ESTKH,X
STA ESTKH,X + LDA (ESTKH-1,X)
JMP NEXTOP
+ INC ESTKH,X
LDA (ESTKH-1,X)
STA ESTKH,X STA ESTKH,X
JMP NEXTOP JMP NEXTOP
;* ;*
@ -771,12 +768,9 @@ SW LDA ESTKL,X
STA (ESTKH-1,X) STA (ESTKH-1,X)
LDA ESTKH+1,X LDA ESTKH+1,X
INC ESTKH-1,X INC ESTKH-1,X
BEQ + BNE +
STA (ESTKH-1,X) INC ESTKH,X
INX + STA (ESTKH-1,X)
JMP DROP
+ INC ESTKH,X
STA (ESTKH-1,X)
;* ;*
;* DROP TOS, TOS-1 ;* DROP TOS, TOS-1
;* ;*

View File

@ -938,12 +938,14 @@ def init_cons()#0
dev_control(devcons, $02, @nlmode) dev_control(devcons, $02, @nlmode)
end end
def cout(ch)#0 def cout(ch)#0
byte nc
nc = 1
if ch == $0D if ch == $0D
ch = $0A0D ch = $0A0D
write(refcons, @ch, 2) nc = 2
else
write(refcons, @ch, 1)
fin fin
write(refcons, @ch, nc)
end end
def crout()#0 def crout()#0
cout($0D) cout($0D)