From f0c628016edea7447db6d46d7d62dedf97d8d875 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 4 Jul 2014 10:20:01 -0700 Subject: [PATCH 1/9] New 'pointer-to' operators. --- PLASMA/src/cmd.pla | 36 ++--- PLASMA/src/lex.c | 24 +++- PLASMA/src/parse.c | 321 ++++++++++++++++++++++++-------------------- PLASMA/src/plvm02.s | 14 +- PLASMA/src/tokens.h | 2 + 5 files changed, 216 insertions(+), 181 deletions(-) diff --git a/PLASMA/src/cmd.pla b/PLASMA/src/cmd.pla index b7463c10..e6f9a232 100644 --- a/PLASMA/src/cmd.pla +++ b/PLASMA/src/cmd.pla @@ -812,8 +812,8 @@ def addsym(sym, addr) lastsym = lastsym + 1 sym = sym + 1 loop - (lastsym).0 = ^sym - (lastsym):1 = addr + lastsym->0 = ^sym + lastsym=>1 = addr lastsym = lastsym + 3 ^lastsym = 0 end @@ -839,7 +839,7 @@ def lookupextern(esd, index) while ^esd sym = esd esd = esd + dcitos(esd, @str) - if (esd).0 & $10 and (esd).1 == index + if esd->0 & $10 and esd->1 == index addr = lookupsym(sym) if !addr perr = $81 @@ -858,18 +858,18 @@ def adddef(bank, addr, deflast) defentry = *deflast *deflast = defentry + 5 if bank - (defentry):1 = $03DC ; JSR $03DC (AUX MEM INTERP) + defentry=>1 = $03DC ; JSR $03DC (AUX MEM INTERP) else - (defentry):1 = $03D6 ; JSR $03D6 (MAIN MEM INTERP) + defentry=>1 = $03D6 ; JSR $03D6 (MAIN MEM INTERP) fin - (defentry).0 = $20 - (defentry):3 = addr - (defentry).5 = 0 ; NULL out next entry + defentry->0 = $20 + defentry=>3 = addr + defentry->5 = 0 ; NULL out next entry return defentry end def lookupdef(addr, deftbl) - while (deftbl).0 == $20 - if (deftbl):3 == addr + while deftbl->0 == $20 + if deftbl=>3 == addr return deftbl fin deftbl = deftbl + 5 @@ -983,9 +983,9 @@ def loadmod(mod) ; ; This is a bytcode def entry - add it to the def directory. ; - adddef(defbank, (rld):1 - defofst + defaddr, @deflast) + adddef(defbank, rld=>1 - defofst + defaddr, @deflast) else - addr = (rld):1 + modfix + addr = rld=>1 + modfix if uword_isge(addr, modaddr) ; Skip fixups to header if ^rld & $80 ; WORD sized fixup. fixup = *addr @@ -993,7 +993,7 @@ def loadmod(mod) fixup = ^addr fin if ^rld & $10 ; EXTERN reference. - fixup = fixup + lookupextern(esd, (rld).3) + fixup = fixup + lookupextern(esd, rld->3) else ; INTERN fixup. fixup = fixup + modfix - MODADDR if uword_isge(fixup, bytecode) @@ -1022,7 +1022,7 @@ def loadmod(mod) ; ; EXPORT symbol - add it to the global symbol table. ; - addr = (esd):1 + modfix - MODADDR + addr = esd=>1 + modfix - MODADDR if uword_isge(addr, bytecode) ; ; Use the def directory address for bytecode. @@ -1123,10 +1123,10 @@ def catalog(optpath) if type & $F0 == $D0 ; Is it a directory? cout('/') len = len + 1 - elsif (entry).$10 == $FF + elsif entry->$10 == $FF cout('-') len = len + 1 - elsif (entry).$10 == $FE + elsif entry->$10 == $FE cout('+') len = len + 1 fin @@ -1250,8 +1250,8 @@ heap = *freemem stodci(@stdlibstr, heap) addmod(heap, @version) while *stdlibsym - stodci((stdlibsym):0, heap) - addsym(heap, (stdlibsym):2) + stodci(stdlibsym=>0, heap) + addsym(heap, stdlibsym=>2) stdlibsym = stdlibsym + 4 loop ; diff --git a/PLASMA/src/lex.c b/PLASMA/src/lex.c index 10f1bf86..7ce51ae8 100755 --- a/PLASMA/src/lex.c +++ b/PLASMA/src/lex.c @@ -22,28 +22,28 @@ t_token keywords[] = { ENDCASE_TOKEN, 'W', 'E', 'N', 'D', FOR_TOKEN, 'F', 'O', 'R', TO_TOKEN, 'T', 'O', - DOWNTO_TOKEN, 'D', 'O', 'W', 'N', 'T', 'O', + DOWNTO_TOKEN, 'D', 'O', 'W', 'N', 'T', 'O', STEP_TOKEN, 'S', 'T', 'E', 'P', NEXT_TOKEN, 'N', 'E', 'X', 'T', REPEAT_TOKEN, 'R', 'E', 'P', 'E', 'A', 'T', - UNTIL_TOKEN, 'U', 'N', 'T', 'I', 'L', - BREAK_TOKEN, 'B', 'R', 'E', 'A', 'K', + UNTIL_TOKEN, 'U', 'N', 'T', 'I', 'L', + BREAK_TOKEN, 'B', 'R', 'E', 'A', 'K', ASM_TOKEN, 'A', 'S', 'M', DEF_TOKEN, 'D', 'E', 'F', - EXPORT_TOKEN, 'E', 'X', 'P', 'O', 'R', 'T', - IMPORT_TOKEN, 'I', 'M', 'P', 'O', 'R', 'T', + EXPORT_TOKEN, 'E', 'X', 'P', 'O', 'R', 'T', + IMPORT_TOKEN, 'I', 'M', 'P', 'O', 'R', 'T', RETURN_TOKEN, 'R', 'E', 'T', 'U', 'R', 'N', END_TOKEN, 'E', 'N', 'D', EXIT_TOKEN, 'E', 'X', 'I', 'T', DONE_TOKEN, 'D', 'O', 'N', 'E', LOGIC_NOT_TOKEN, 'N', 'O', 'T', LOGIC_AND_TOKEN, 'A', 'N', 'D', - LOGIC_OR_TOKEN, 'O', 'R', + LOGIC_OR_TOKEN, 'O', 'R', BYTE_TOKEN, 'B', 'Y', 'T', 'E', WORD_TOKEN, 'W', 'O', 'R', 'D', CONST_TOKEN, 'C', 'O', 'N', 'S', 'T', PREDEF_TOKEN, 'P', 'R', 'E', 'D', 'E', 'F', - SYSFLAGS_TOKEN, 'S', 'Y', 'S', 'F', 'L', 'A', 'G', 'S', + SYSFLAGS_TOKEN, 'S', 'Y', 'S', 'F', 'L', 'A', 'G', 'S', EOL_TOKEN }; @@ -293,6 +293,11 @@ t_token scan(void) scantoken = EQ_TOKEN; scanpos += 2; } + else if (scanpos[1] == '>') + { + scantoken = PTRW_TOKEN; + scanpos += 2; + } else { scantoken = SET_TOKEN; @@ -317,6 +322,11 @@ t_token scan(void) scantoken = DEC_TOKEN; scanpos += 2; } + else if (scanpos[1] == '>') + { + scantoken = PTRB_TOKEN; + scanpos += 2; + } else { scantoken = SUB_TOKEN; diff --git a/PLASMA/src/parse.c b/PLASMA/src/parse.c index 67d82f23..da5bc5f7 100755 --- a/PLASMA/src/parse.c +++ b/PLASMA/src/parse.c @@ -288,108 +288,25 @@ int parse_value(int rvalue) */ while (scan() == OPEN_PAREN_TOKEN || scantoken == OPEN_BRACKET_TOKEN + || scantoken == PTRB_TOKEN + || scantoken == PTRW_TOKEN || scantoken == DOT_TOKEN || scantoken == COLON_TOKEN) { - if (scantoken == OPEN_BRACKET_TOKEN) + switch (scantoken) { - /* - * Array - */ - if (!emit_value) - { - if (type & ADDR_TYPE) - { - if (type & LOCAL_TYPE) - emit_localaddr(value); - else - emit_globaladdr(value, 0, type); - } - else if (type & CONST_TYPE) - { - emit_const(value); - } - emit_value = 1; - } - if (type & PTR_TYPE) - emit_lw(); - if (!parse_expr()) - { - parse_error("Bad expression"); - return (0); - } - if (scantoken != CLOSE_BRACKET_TOKEN) - { - parse_error("Missing closing bracket"); - return (0); - } - if (type & WORD_TYPE) - { - //type |= WPTR_TYPE; - type = WPTR_TYPE; - emit_indexword(); - } - else - { - //type |= BPTR_TYPE; - type = BPTR_TYPE; - emit_indexbyte(); - } - //type &= ~(ADDR_TYPE | CONST_TYPE); - } - else if (scantoken == DOT_TOKEN || scantoken == COLON_TOKEN) - { - /* - * Structure member offset or array of arrays - */ - elem_type = (scantoken == DOT_TOKEN) ? BPTR_TYPE : WPTR_TYPE; - if (parse_constval(&elem_offset, &elem_size)) - { + case OPEN_BRACKET_TOKEN: /* - * Constant member offset - */ - if (!emit_value) - { - if (type & VAR_TYPE) - { - elem_type = (type & ~VAR_TYPE) | (elem_type == BPTR_TYPE ? BYTE_TYPE : WORD_TYPE); - } - else if (type & CONST_TYPE) - { - value += elem_offset; - emit_const(value); - elem_offset = 0; - emit_value = 1; - } - else // FUNC_TYPE - { - emit_globaladdr(value, elem_offset, type); - emit_value = 1; - } - } - else - { - if (elem_offset != 0) - { - emit_const(elem_offset); - emit_op(ADD_TOKEN); - elem_offset = 0; - } - } - } - else if (scantoken == OPEN_BRACKET_TOKEN) - { - /* - * Array of arrays + * Array */ if (!emit_value) { if (type & ADDR_TYPE) { if (type & LOCAL_TYPE) - emit_localaddr(value + elem_offset); + emit_localaddr(value); else - emit_globaladdr(value, elem_offset, type); + emit_globaladdr(value, 0, type); } else if (type & CONST_TYPE) { @@ -397,75 +314,181 @@ int parse_value(int rvalue) } emit_value = 1; } - while (parse_expr()) - { - if (scantoken != COMMA_TOKEN) - break; - emit_indexword(); + if (type & PTR_TYPE) emit_lw(); + if (!parse_expr()) + { + parse_error("Bad expression"); + return (0); } if (scantoken != CLOSE_BRACKET_TOKEN) { parse_error("Missing closing bracket"); return (0); } - if (elem_type & WPTR_TYPE) - emit_indexword(); - else - emit_indexbyte(); - } - else - { - parse_error("Invalid member offset"); - return (0); - } - type = elem_type; //(type & ~(ADDR_TYPE | CONST_TYPE)) | elem_type; - } - else if (scantoken == OPEN_PAREN_TOKEN) - { - /* - * Function call - */ - if (emit_value && !(type & (FUNC_TYPE | CONST_TYPE))) - { - if (scan_lookahead() != CLOSE_PAREN_TOKEN) - emit_push(); - } - cparams = 0; - while (parse_expr()) - { - cparams++; - if (scantoken != COMMA_TOKEN) - break; - } - if (scantoken != CLOSE_PAREN_TOKEN) - { - parse_error("Missing closing parenthesis"); - return (0); - } - if (type & (FUNC_TYPE | CONST_TYPE)) - emit_call(value, type); - else - { - if (!emit_value) + if (type & WORD_TYPE) { - if (type & VAR_TYPE) - { - if (type & LOCAL_TYPE) - emit_llw(value + elem_offset); - else - emit_law(value, elem_offset, type); - } - else if (type & PTR_TYPE) - emit_lw(); + //type |= WPTR_TYPE; + type = WPTR_TYPE; + emit_indexword(); } else - if (cparams) - emit_pull(); - emit_ical(); - } - emit_value = 1; - type = WORD_TYPE; //(type & ~(FUNC_TYPE | CONST_TYPE)) | WORD_TYPE; + { + //type |= BPTR_TYPE; + type = BPTR_TYPE; + emit_indexbyte(); + } + //type &= ~(ADDR_TYPE | CONST_TYPE); + break; + case PTRB_TOKEN: + case PTRW_TOKEN: + if (!emit_value) + { + if (type & FUNC_TYPE) + emit_call(value, type); + else if (type & VAR_TYPE) + { + if (type & LOCAL_TYPE) + (type & BYTE_TYPE) ? emit_llb(value + elem_offset) : emit_llw(value + elem_offset); + else + (type & BYTE_TYPE) ? emit_lab(value, elem_offset, type) : emit_law(value, elem_offset, type); + } + else + (type & BPTR_TYPE) ? emit_lb() : emit_lw(); + } + emit_value = 1; + type &= ~(VAR_TYPE | ADDR_TYPE); + type |= WORD_TYPE; + scantoken = scantoken == PTRB_TOKEN ? DOT_TOKEN : COLON_TOKEN; + case DOT_TOKEN: + case COLON_TOKEN: + /* + * Structure member offset or array of arrays + */ + elem_type = (scantoken == DOT_TOKEN) ? BPTR_TYPE : WPTR_TYPE; + if (parse_constval(&elem_offset, &elem_size)) + { + /* + * Constant member offset + */ + if (!emit_value) + { + if (type & VAR_TYPE) + { + elem_type = (type & ~VAR_TYPE) | (elem_type == BPTR_TYPE ? BYTE_TYPE : WORD_TYPE); + } + else if (type & CONST_TYPE) + { + value += elem_offset; + emit_const(value); + elem_offset = 0; + emit_value = 1; + } + else // FUNC_TYPE + { + emit_globaladdr(value, elem_offset, type); + emit_value = 1; + } + } + else + { + if (elem_offset != 0) + { + emit_const(elem_offset); + emit_op(ADD_TOKEN); + elem_offset = 0; + } + } + } + else if (scantoken == OPEN_BRACKET_TOKEN) + { + /* + * Array of arrays + */ + if (!emit_value) + { + if (type & ADDR_TYPE) + { + if (type & LOCAL_TYPE) + emit_localaddr(value + elem_offset); + else + emit_globaladdr(value, elem_offset, type); + } + else if (type & CONST_TYPE) + { + emit_const(value); + } + emit_value = 1; + } + while (parse_expr()) + { + if (scantoken != COMMA_TOKEN) + break; + emit_indexword(); + emit_lw(); + } + if (scantoken != CLOSE_BRACKET_TOKEN) + { + parse_error("Missing closing bracket"); + return (0); + } + if (elem_type & WPTR_TYPE) + emit_indexword(); + else + emit_indexbyte(); + } + else + { + parse_error("Invalid member offset"); + return (0); + } + type = elem_type; //(type & ~(ADDR_TYPE | CONST_TYPE)) | elem_type; + break; + case OPEN_PAREN_TOKEN: + /* + * Function call + */ + if (emit_value && !(type & (FUNC_TYPE | CONST_TYPE))) + { + if (scan_lookahead() != CLOSE_PAREN_TOKEN) + emit_push(); + } + cparams = 0; + while (parse_expr()) + { + cparams++; + if (scantoken != COMMA_TOKEN) + break; + } + if (scantoken != CLOSE_PAREN_TOKEN) + { + parse_error("Missing closing parenthesis"); + return (0); + } + if (type & (FUNC_TYPE | CONST_TYPE)) + emit_call(value, type); + else + { + if (!emit_value) + { + if (type & VAR_TYPE) + { + if (type & LOCAL_TYPE) + emit_llw(value + elem_offset); + else + emit_law(value, elem_offset, type); + } + else if (type & PTR_TYPE) + emit_lw(); + } + else + if (cparams) + emit_pull(); + emit_ical(); + } + emit_value = 1; + type = WORD_TYPE; //(type & ~(FUNC_TYPE | CONST_TYPE)) | WORD_TYPE; + break; } } if (emit_value) diff --git a/PLASMA/src/plvm02.s b/PLASMA/src/plvm02.s index 5346f678..1cb90852 100644 --- a/PLASMA/src/plvm02.s +++ b/PLASMA/src/plvm02.s @@ -630,16 +630,16 @@ LNOT1 EOR #$FF ;* ;* LOGICAL AND ;* -LAND LDA ESTKL,X - ORA ESTKH,X - BEQ LAND1 - LDA ESTKL+1,X +LAND LDA ESTKL+1,X ORA ESTKH+1,X + BEQ LAND2 + LDA ESTKL,X + ORA ESTKH,X BEQ LAND1 LDA #$FF LAND1 STA ESTKL+1,X STA ESTKH+1,X - INX +LAND2 INX JMP NEXTOP ;* ;* LOGICAL OR @@ -650,9 +650,9 @@ LOR LDA ESTKL,X ORA ESTKH+1,X BEQ LOR1 LDA #$FF -LOR1 STA ESTKL+1,X + STA ESTKL+1,X STA ESTKH+1,X - INX +LOR1 INX JMP NEXTOP ;* ;* SWAP TOS WITH TOS-1 diff --git a/PLASMA/src/tokens.h b/PLASMA/src/tokens.h index 8696f342..b5288a23 100755 --- a/PLASMA/src/tokens.h +++ b/PLASMA/src/tokens.h @@ -85,6 +85,8 @@ #define DEC_TOKEN TOKEN('K') #define BPTR_TOKEN TOKEN('^') #define WPTR_TOKEN TOKEN('*') +#define PTRB_TOKEN TOKEN('b') +#define PTRW_TOKEN TOKEN('w') #define POST_INC_TOKEN TOKEN('p') #define POST_DEC_TOKEN TOKEN('k') #define OPEN_PAREN_TOKEN TOKEN('(') From 41265e8f593c274668e9b9d217f6ab6191f2f68e Mon Sep 17 00:00:00 2001 From: Brendan Robert Date: Fri, 4 Jul 2014 16:52:14 -0500 Subject: [PATCH 2/9] Added script coloring in the scripts list -- makes it possible to tell what script is associated on the map (yay!) --- .../main/java/org/badvision/outlaweditor/MapEditor.java | 8 ++++---- .../java/org/badvision/outlaweditor/data/TileMap.java | 6 ++++-- .../outlaweditor/ui/impl/MapEditorTabControllerImpl.java | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java index 414569d9..2ec36f68 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java @@ -253,7 +253,7 @@ public class MapEditor extends Editor implements EventH idx = (idx + 1) % scripts.size(); gc.beginPath(); gc.moveTo(xx,yy); - gc.setStroke(currentMap.getScriptColor(scripts.get(idx))); + currentMap.getScriptColor(scripts.get(idx)).ifPresent(gc::setStroke); xx += dashLength; gc.lineTo(xx, yy); gc.setEffect(new DropShadow(2, Color.BLACK)); @@ -263,7 +263,7 @@ public class MapEditor extends Editor implements EventH idx = (idx + 1) % scripts.size(); gc.beginPath(); gc.moveTo(xx,yy); - gc.setStroke(currentMap.getScriptColor(scripts.get(idx))); + currentMap.getScriptColor(scripts.get(idx)).ifPresent(gc::setStroke); yy += dashLength; gc.lineTo(xx, yy); gc.setEffect(new DropShadow(2, Color.BLACK)); @@ -273,7 +273,7 @@ public class MapEditor extends Editor implements EventH idx = (idx + 1) % scripts.size(); gc.beginPath(); gc.moveTo(xx,yy); - gc.setStroke(currentMap.getScriptColor(scripts.get(idx))); + currentMap.getScriptColor(scripts.get(idx)).ifPresent(gc::setStroke); xx -= dashLength; gc.lineTo(xx, yy); gc.setEffect(new DropShadow(2, Color.BLACK)); @@ -283,7 +283,7 @@ public class MapEditor extends Editor implements EventH idx = (idx + 1) % scripts.size(); gc.beginPath(); gc.moveTo(xx,yy); - gc.setStroke(currentMap.getScriptColor(scripts.get(idx))); + currentMap.getScriptColor(scripts.get(idx)).ifPresent(gc::setStroke); yy -= dashLength; gc.lineTo(xx, yy); gc.setEffect(new DropShadow(2, Color.BLACK)); diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileMap.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileMap.java index 12c3c39d..97b2779e 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileMap.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileMap.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import javafx.scene.image.WritableImage; import javafx.scene.paint.Color; @@ -46,8 +47,8 @@ public class TileMap extends ArrayList> implements Serializable private final java.util.Map> locationScripts = new HashMap<>(); private final java.util.Map scriptColors = new HashMap<>(); - public Color getScriptColor(Script s) { - return scriptColors.get(s); + public Optional getScriptColor(Script s) { + return Optional.ofNullable(scriptColors.get(s)); } public List