diff --git a/PLASMA-BLD2.PO b/PLASMA-BLD2.PO index 096af24..8162723 100644 Binary files a/PLASMA-BLD2.PO and b/PLASMA-BLD2.PO differ diff --git a/PLASMA-DEM2.PO b/PLASMA-DEM2.PO index ea761b4..c0e4b40 100644 Binary files a/PLASMA-DEM2.PO and b/PLASMA-DEM2.PO differ diff --git a/PLASMA-SOS2.PO b/PLASMA-SOS2.PO index 5508da0..282707a 100644 Binary files a/PLASMA-SOS2.PO and b/PLASMA-SOS2.PO differ diff --git a/PLASMA-SYS2.PO b/PLASMA-SYS2.PO index 6c699f7..e8a2313 100644 Binary files a/PLASMA-SYS2.PO and b/PLASMA-SYS2.PO differ diff --git a/src/toolsrc/codegen.c b/src/toolsrc/codegen.c index e4419d2..7c24b4e 100755 --- a/src/toolsrc/codegen.c +++ b/src/toolsrc/codegen.c @@ -1268,6 +1268,14 @@ int crunch_seq(t_opseq **seq, int pass) freeops = 1; } 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: if (!op->val) freeops = -2; // Remove zero constant @@ -1355,7 +1363,7 @@ int crunch_seq(t_opseq **seq, int pass) case BINARY_CODE(LE_TOKEN): op->val = op->val <= opnext->val ? 1 : 0; freeops = 2; - break; + break; } // End of collapse constant operation if ((pass > 0) && (freeops == 0) && (op->val != 0)) @@ -1976,6 +1984,12 @@ int emit_pending_seq() case BRTRUE_CODE: emit_brtru(op->tag); break; + case BRGT_CODE: + emit_brgt(op->tag); + break; + case BRLT_CODE: + emit_brlt(op->tag); + break; case CODETAG_CODE: printf("_B%03d%c\n", op->tag, LBL); break; diff --git a/src/toolsrc/codegen.h b/src/toolsrc/codegen.h index 6288330..ffde6de 100755 --- a/src/toolsrc/codegen.h +++ b/src/toolsrc/codegen.h @@ -66,10 +66,12 @@ typedef struct _opseq { #define BRTRUE_CODE 0x0322 #define BREQ_CODE 0x0323 #define BRNE_CODE 0x0324 -#define BRAND_CODE 0x325 -#define BROR_CODE 0x326 -#define CODETAG_CODE 0x0327 -#define NOP_CODE 0x0328 +#define BRAND_CODE 0x0325 +#define BROR_CODE 0x0326 +#define BRLT_CODE 0x0327 +#define BRGT_CODE 0x0328 +#define CODETAG_CODE 0x0329 +#define NOP_CODE 0x032A #define ADDLB_CODE 0x0330 #define ADDLW_CODE 0x0331 #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_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_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_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) diff --git a/src/toolsrc/codeopt.pla b/src/toolsrc/codeopt.pla index aa56418..66a425d 100644 --- a/src/toolsrc/codeopt.pla +++ b/src/toolsrc/codeopt.pla @@ -113,6 +113,16 @@ def crunch_seq(seq, pass) freeops = 1 fin 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 if not op=>opval freeops = -2 // Remove zero constant diff --git a/src/toolsrc/codeseq.plh b/src/toolsrc/codeseq.plh index 9555920..3dc89e9 100644 --- a/src/toolsrc/codeseq.plh +++ b/src/toolsrc/codeseq.plh @@ -89,6 +89,8 @@ const BRTRUE_CODE = $4E const BRNCH_CODE = $50 const BRAND_CODE = $AC const BROR_CODE = $AE +const BRGT_CODE = $A0 +const BRLT_CODE = $A2 // // Code tag address group // diff --git a/src/toolsrc/parse.c b/src/toolsrc/parse.c index 82bc69c..77bee1e 100755 --- a/src/toolsrc/parse.c +++ b/src/toolsrc/parse.c @@ -994,9 +994,8 @@ int parse_stmnt(void) { seq = NULL; } - emit_seq(toseq); - emit_seq(fromseq); - step > 0 ? emit_brgt(break_tag) : emit_brlt(break_tag); + toseq = cat_seq(toseq, fromseq); + emit_seq(step > 0 ? gen_brgt(toseq, break_tag) : gen_brlt(toseq, break_tag)); emit_codetag(tag_for); if (type & LOCAL_TYPE) type & BYTE_TYPE ? emit_dlb(addr) : emit_dlw(addr); diff --git a/src/toolsrc/parse.pla b/src/toolsrc/parse.pla index 831beec..249850f 100644 --- a/src/toolsrc/parse.pla +++ b/src/toolsrc/parse.pla @@ -755,9 +755,7 @@ def parse_stmnt else seq = NULL fin - emit_seq(toseq) - emit_seq(fromseq) - if stepdir > 0; emit_brgt(break_tag); else; emit_brlt(break_tag); fin + emit_seq(gen_oprel(cat_seq(toseq, fromseq), stepdir > 0 ?? BRGT_CODE :: BRLT_CODE, break_tag)) emit_tag(tag_for) if type & LOCAL_TYPE if type & BYTE_TYPE; emit_dlb(addr); else; emit_dlw(addr); fin diff --git a/src/vmsrc/apple/plvm03.s b/src/vmsrc/apple/plvm03.s index b319393..fd1a9fd 100755 --- a/src/vmsrc/apple/plvm03.s +++ b/src/vmsrc/apple/plvm03.s @@ -634,12 +634,9 @@ LW LDA ESTKL,X LDA (ESTKH-1,X) STA ESTKL,X INC ESTKH-1,X - BEQ + - LDA (ESTKH-1,X) - STA ESTKH,X - JMP NEXTOP -+ INC ESTKH,X - LDA (ESTKH-1,X) + BNE + + INC ESTKH,X ++ LDA (ESTKH-1,X) STA ESTKH,X JMP NEXTOP ;* @@ -771,12 +768,9 @@ SW LDA ESTKL,X STA (ESTKH-1,X) LDA ESTKH+1,X INC ESTKH-1,X - BEQ + - STA (ESTKH-1,X) - INX - JMP DROP -+ INC ESTKH,X - STA (ESTKH-1,X) + BNE + + INC ESTKH,X ++ STA (ESTKH-1,X) ;* ;* DROP TOS, TOS-1 ;* diff --git a/src/vmsrc/apple/soscmd.pla b/src/vmsrc/apple/soscmd.pla index 7b89fc1..b5bf840 100755 --- a/src/vmsrc/apple/soscmd.pla +++ b/src/vmsrc/apple/soscmd.pla @@ -938,12 +938,14 @@ def init_cons()#0 dev_control(devcons, $02, @nlmode) end def cout(ch)#0 + byte nc + + nc = 1 if ch == $0D ch = $0A0D - write(refcons, @ch, 2) - else - write(refcons, @ch, 1) + nc = 2 fin + write(refcons, @ch, nc) end def crout()#0 cout($0D)