mirror of
https://github.com/badvision/lawless-legends.git
synced 2024-07-12 02:29:00 +00:00
Merge branch 'master' of https://github.com/badvision/lawless-legends
This commit is contained in:
commit
c137981da2
Binary file not shown.
@ -1062,6 +1062,13 @@ int crunch_seq(t_opseq **seq, int pass)
|
|||||||
freeops = 1;
|
freeops = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (opnext->code == BINARY_CODE(SHL_TOKEN))
|
||||||
|
{
|
||||||
|
op->code = DUP_CODE;
|
||||||
|
opnext->code = BINARY_CODE(ADD_TOKEN);
|
||||||
|
crunched = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
switch (opnext->code)
|
switch (opnext->code)
|
||||||
{
|
{
|
||||||
@ -1667,6 +1674,11 @@ int emit_pending_seq()
|
|||||||
case BRTRUE_CODE:
|
case BRTRUE_CODE:
|
||||||
emit_brtru(op->tag);
|
emit_brtru(op->tag);
|
||||||
break;
|
break;
|
||||||
|
case CODETAG_CODE:
|
||||||
|
printf("_B%03d%c\n", op->tag, LBL);
|
||||||
|
break;
|
||||||
|
case NOP_CODE:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,8 @@ typedef struct _opseq {
|
|||||||
#define BRNCH_CODE 0x031C
|
#define BRNCH_CODE 0x031C
|
||||||
#define BRFALSE_CODE 0x031D
|
#define BRFALSE_CODE 0x031D
|
||||||
#define BRTRUE_CODE 0x031E
|
#define BRTRUE_CODE 0x031E
|
||||||
|
#define CODETAG_CODE 0x031F
|
||||||
|
#define NOP_CODE 0x0320
|
||||||
|
|
||||||
#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)
|
||||||
@ -92,6 +94,9 @@ 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_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_codetag(seq,tag) gen_seq(seq, CODETAG_CODE,0,tag,0,0)
|
||||||
|
#define gen_nop(seq) gen_seq(seq,NOP_CODE,0,0,0,0)
|
||||||
|
|
||||||
void emit_flags(int flags);
|
void emit_flags(int flags);
|
||||||
void emit_header(void);
|
void emit_header(void);
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include "plasm.h"
|
#include "plasm.h"
|
||||||
|
|
||||||
char *statement, *tokenstr, *scanpos = "", *strpos = "";
|
char *statement, *tokenstr, *scanpos = "", *strpos = "";
|
||||||
t_token scantoken, prevtoken;
|
t_token scantoken = EOL_TOKEN, prevtoken;
|
||||||
int tokenlen;
|
int tokenlen;
|
||||||
long constval;
|
long constval;
|
||||||
FILE* inputfile;
|
FILE* inputfile;
|
||||||
@ -397,6 +397,30 @@ t_token scan(void)
|
|||||||
scanpos++;
|
scanpos++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ':':
|
||||||
|
if (scanpos[1] == ':')
|
||||||
|
{
|
||||||
|
scantoken = TRIELSE_TOKEN;
|
||||||
|
scanpos += 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scantoken = COLON_TOKEN;
|
||||||
|
scanpos++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
if (scanpos[1] == '?')
|
||||||
|
{
|
||||||
|
scantoken = TERNARY_TOKEN;
|
||||||
|
scanpos += 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scantoken = TERNARY_TOKEN;
|
||||||
|
scanpos++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/*
|
/*
|
||||||
* Simple single character tokens.
|
* Simple single character tokens.
|
||||||
@ -449,6 +473,12 @@ int next_line(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (!(scantoken == EOL_TOKEN || scantoken == EOF_TOKEN))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "scantoken = %d (%c)\n", scantoken & 0x7F, scantoken & 0x7F);
|
||||||
|
parse_error("Extraneous characters");
|
||||||
|
return EOF_TOKEN;
|
||||||
|
}
|
||||||
statement = inputline;
|
statement = inputline;
|
||||||
scanpos = inputline;
|
scanpos = inputline;
|
||||||
/*
|
/*
|
||||||
@ -501,6 +531,10 @@ int next_line(void)
|
|||||||
scantoken = EOF_TOKEN;
|
scantoken = EOF_TOKEN;
|
||||||
return EOF_TOKEN;
|
return EOF_TOKEN;
|
||||||
}
|
}
|
||||||
|
if (scan() != EOL_TOKEN)
|
||||||
|
{
|
||||||
|
parse_error("Extraneous characters");
|
||||||
|
}
|
||||||
outer_inputfile = inputfile;
|
outer_inputfile = inputfile;
|
||||||
outer_filename = filename;
|
outer_filename = filename;
|
||||||
outer_lineno = lineno;
|
outer_lineno = lineno;
|
||||||
|
@ -593,6 +593,11 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
|
|||||||
type = (scantoken == PTRB_TOKEN) ? BPTR_TYPE : WPTR_TYPE;
|
type = (scantoken == PTRB_TOKEN) ? BPTR_TYPE : WPTR_TYPE;
|
||||||
if (!parse_const(&const_offset))
|
if (!parse_const(&const_offset))
|
||||||
{
|
{
|
||||||
|
if (scantoken == EOL_TOKEN || scantoken == CLOSE_PAREN_TOKEN)
|
||||||
|
{
|
||||||
|
parse_error("Syntax");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Setting type override for following operations
|
* Setting type override for following operations
|
||||||
*/
|
*/
|
||||||
@ -627,6 +632,11 @@ t_opseq *parse_value(t_opseq *codeseq, int rvalue, int *stackdepth)
|
|||||||
: ((scantoken == DOT_TOKEN) ? BPTR_TYPE : WPTR_TYPE);
|
: ((scantoken == DOT_TOKEN) ? BPTR_TYPE : WPTR_TYPE);
|
||||||
if (!parse_const(&const_offset))
|
if (!parse_const(&const_offset))
|
||||||
{
|
{
|
||||||
|
if (scantoken == EOL_TOKEN || scantoken == CLOSE_PAREN_TOKEN)
|
||||||
|
{
|
||||||
|
parse_error("Syntax");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Setting type override for following operations
|
* Setting type override for following operations
|
||||||
*/
|
*/
|
||||||
@ -745,6 +755,32 @@ t_opseq *parse_expr(t_opseq *codeseq, int *stackdepth)
|
|||||||
if (stackdepth)
|
if (stackdepth)
|
||||||
(*stackdepth)--;
|
(*stackdepth)--;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Look for ternary operator
|
||||||
|
*/
|
||||||
|
if (scantoken == TERNARY_TOKEN)
|
||||||
|
{
|
||||||
|
int tag_else, tag_endtri;
|
||||||
|
int stackdepth1;
|
||||||
|
|
||||||
|
if (*stackdepth != 1)
|
||||||
|
parse_error("Ternary op must evaluate to single value");
|
||||||
|
tag_else = tag_new(BRANCH_TYPE);
|
||||||
|
tag_endtri = tag_new(BRANCH_TYPE);
|
||||||
|
codeseq = gen_brfls(codeseq, tag_else);
|
||||||
|
codeseq = parse_expr(codeseq, &stackdepth1);
|
||||||
|
if (scantoken != TRIELSE_TOKEN)
|
||||||
|
{
|
||||||
|
parse_error("Missing '::' in ternary op");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
codeseq = gen_brnch(codeseq, tag_endtri);
|
||||||
|
codeseq = gen_codetag(codeseq, tag_else);
|
||||||
|
codeseq = parse_expr(codeseq, stackdepth);
|
||||||
|
if (stackdepth1 != *stackdepth)
|
||||||
|
parse_error("Inconsistent value counts in ternary op");
|
||||||
|
codeseq = gen_codetag(codeseq, tag_endtri);
|
||||||
|
}
|
||||||
return (codeseq);
|
return (codeseq);
|
||||||
}
|
}
|
||||||
t_opseq *parse_set(t_opseq *codeseq)
|
t_opseq *parse_set(t_opseq *codeseq)
|
||||||
@ -819,7 +855,7 @@ int parse_stmnt(void)
|
|||||||
tag_endif = tag_new(BRANCH_TYPE);
|
tag_endif = tag_new(BRANCH_TYPE);
|
||||||
seq = gen_brfls(seq, tag_else);
|
seq = gen_brfls(seq, tag_else);
|
||||||
emit_seq(seq);
|
emit_seq(seq);
|
||||||
scan();
|
//scan();
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
while (parse_stmnt()) next_line();
|
while (parse_stmnt()) next_line();
|
||||||
@ -1074,7 +1110,7 @@ int parse_stmnt(void)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EOL_TOKEN:
|
case EOL_TOKEN:
|
||||||
case COMMENT_TOKEN:
|
//case COMMENT_TOKEN:
|
||||||
return (1);
|
return (1);
|
||||||
case ELSE_TOKEN:
|
case ELSE_TOKEN:
|
||||||
case ELSEIF_TOKEN:
|
case ELSEIF_TOKEN:
|
||||||
@ -1130,7 +1166,7 @@ int parse_stmnt(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (scan() != EOL_TOKEN && scantoken != COMMENT_TOKEN)
|
if (scan() != EOL_TOKEN /*&& scantoken != COMMENT_TOKEN*/)
|
||||||
{
|
{
|
||||||
parse_error("Extraneous characters");
|
parse_error("Extraneous characters");
|
||||||
return (0);
|
return (0);
|
||||||
@ -1223,6 +1259,7 @@ int parse_struc(void)
|
|||||||
struclen = tokenlen;
|
struclen = tokenlen;
|
||||||
for (idlen = 0; idlen < struclen; idlen++)
|
for (idlen = 0; idlen < struclen; idlen++)
|
||||||
strucid[idlen] = tokenstr[idlen];
|
strucid[idlen] = tokenstr[idlen];
|
||||||
|
scan();
|
||||||
}
|
}
|
||||||
while (next_line() == BYTE_TOKEN || scantoken == WORD_TOKEN || scantoken == EOL_TOKEN)
|
while (next_line() == BYTE_TOKEN || scantoken == WORD_TOKEN || scantoken == EOL_TOKEN)
|
||||||
{
|
{
|
||||||
@ -1265,12 +1302,16 @@ int parse_struc(void)
|
|||||||
idconst_add(idstr, idlen, offset);
|
idconst_add(idstr, idlen, offset);
|
||||||
offset += size;
|
offset += size;
|
||||||
} while (scantoken == COMMA_TOKEN);
|
} while (scantoken == COMMA_TOKEN);
|
||||||
if (scantoken != EOL_TOKEN && scantoken != COMMENT_TOKEN)
|
if (scantoken != EOL_TOKEN /*&& scantoken != COMMENT_TOKEN*/)
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (struclen)
|
if (struclen)
|
||||||
idconst_add(strucid, struclen, offset);
|
idconst_add(strucid, struclen, offset);
|
||||||
return (scantoken == END_TOKEN);
|
//return (scantoken == END_TOKEN);
|
||||||
|
if (scantoken != END_TOKEN)
|
||||||
|
return (0);
|
||||||
|
scan();
|
||||||
|
return (1);
|
||||||
}
|
}
|
||||||
int parse_vars(int type)
|
int parse_vars(int type)
|
||||||
{
|
{
|
||||||
@ -1443,7 +1484,7 @@ int parse_vars(int type)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
case EOL_TOKEN:
|
case EOL_TOKEN:
|
||||||
case COMMENT_TOKEN:
|
//case COMMENT_TOKEN:
|
||||||
return (1);
|
return (1);
|
||||||
default:
|
default:
|
||||||
return (0);
|
return (0);
|
||||||
@ -1467,13 +1508,13 @@ int parse_mods(void)
|
|||||||
parse_error("Syntax error");
|
parse_error("Syntax error");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (scan() != EOL_TOKEN && scantoken != COMMENT_TOKEN)
|
if (scan() != EOL_TOKEN /*&& scantoken != COMMENT_TOKEN*/)
|
||||||
{
|
{
|
||||||
parse_error("Extraneous characters");
|
parse_error("Extraneous characters");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (scantoken == EOL_TOKEN || scantoken == COMMENT_TOKEN)
|
if (scantoken == EOL_TOKEN /*|| scantoken == COMMENT_TOKEN*/)
|
||||||
return (1);
|
return (1);
|
||||||
emit_moddep(0, 0);
|
emit_moddep(0, 0);
|
||||||
return (0);
|
return (0);
|
||||||
@ -1650,7 +1691,7 @@ int parse_defs(void)
|
|||||||
parse_error("Syntax error");
|
parse_error("Syntax error");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (scan() != EOL_TOKEN && scantoken != COMMENT_TOKEN)
|
if (scan() != EOL_TOKEN /*&& scantoken != COMMENT_TOKEN*/)
|
||||||
{
|
{
|
||||||
parse_error("Extraneous characters");
|
parse_error("Extraneous characters");
|
||||||
return (0);
|
return (0);
|
||||||
@ -1739,18 +1780,19 @@ int parse_defs(void)
|
|||||||
idstr[idlen] = c;
|
idstr[idlen] = c;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (scantoken == EOL_TOKEN || scantoken == COMMENT_TOKEN)
|
///if (scantoken == EOL_TOKEN /*|| scantoken == COMMENT_TOKEN*/)
|
||||||
next_line();
|
//next_line();
|
||||||
else if (scantoken != END_TOKEN)
|
if (scantoken != END_TOKEN && scantoken != EOL_TOKEN)
|
||||||
{
|
{
|
||||||
|
scantoken = EOL_TOKEN;
|
||||||
emit_asm(inputline);
|
emit_asm(inputline);
|
||||||
|
}
|
||||||
next_line();
|
next_line();
|
||||||
}
|
} while (scantoken != END_TOKEN);
|
||||||
}
|
scan();
|
||||||
while (scantoken != END_TOKEN);
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
if (scantoken == EOL_TOKEN || scantoken == COMMENT_TOKEN)
|
if (scantoken == EOL_TOKEN /*|| scantoken == COMMENT_TOKEN*/)
|
||||||
return (1);
|
return (1);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,7 @@ IINTRPX PLA
|
|||||||
STA IFPH
|
STA IFPH
|
||||||
LDA #>OPXTBL
|
LDA #>OPXTBL
|
||||||
STA OPPAGE
|
STA OPPAGE
|
||||||
SEI
|
;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
|
||||||
STA ALTRDON
|
STA ALTRDON
|
||||||
JMP FETCHOP
|
JMP FETCHOP
|
||||||
;*
|
;*
|
||||||
@ -1207,9 +1207,9 @@ CALLX +INC_IP
|
|||||||
TYA
|
TYA
|
||||||
PHA
|
PHA
|
||||||
STA ALTRDOFF
|
STA ALTRDOFF
|
||||||
CLI
|
;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
|
||||||
JSR JMPTMP
|
JSR JMPTMP
|
||||||
SEI
|
;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
|
||||||
STA ALTRDON
|
STA ALTRDON
|
||||||
PLA
|
PLA
|
||||||
TAY
|
TAY
|
||||||
@ -1257,9 +1257,9 @@ ICALX LDA ESTKL,X
|
|||||||
TYA
|
TYA
|
||||||
PHA
|
PHA
|
||||||
STA ALTRDOFF
|
STA ALTRDOFF
|
||||||
CLI
|
;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
|
||||||
JSR JMPTMP
|
JSR JMPTMP
|
||||||
SEI
|
;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
|
||||||
STA ALTRDON
|
STA ALTRDON
|
||||||
PLA
|
PLA
|
||||||
TAY
|
TAY
|
||||||
@ -1308,7 +1308,7 @@ ENTER INY
|
|||||||
;* LEAVE FUNCTION
|
;* LEAVE FUNCTION
|
||||||
;*
|
;*
|
||||||
LEAVEX STA ALTRDOFF
|
LEAVEX STA ALTRDOFF
|
||||||
CLI
|
;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
|
||||||
LEAVE PLA ; DEALLOCATE POOL + FRAME
|
LEAVE PLA ; DEALLOCATE POOL + FRAME
|
||||||
CLC
|
CLC
|
||||||
ADC IFPL
|
ADC IFPL
|
||||||
@ -1323,7 +1323,7 @@ LEAVE PLA ; DEALLOCATE POOL + FRAME
|
|||||||
RTS
|
RTS
|
||||||
;
|
;
|
||||||
RETX STA ALTRDOFF
|
RETX STA ALTRDOFF
|
||||||
CLI
|
;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
|
||||||
RET LDA IFPL ; DEALLOCATE POOL
|
RET LDA IFPL ; DEALLOCATE POOL
|
||||||
STA PPL
|
STA PPL
|
||||||
LDA IFPH
|
LDA IFPH
|
||||||
|
@ -160,4 +160,6 @@ putln
|
|||||||
puts(@constr); puti(constval); putln
|
puts(@constr); puti(constval); putln
|
||||||
puts("Signed byte constant:"); puti(-3); putln
|
puts("Signed byte constant:"); puti(-3); putln
|
||||||
puts("Hello from in-line string!\$7F\n")
|
puts("Hello from in-line string!\$7F\n")
|
||||||
|
puts(1 ?? "This is TRUE\n" :: "This is FALSE\n")
|
||||||
|
puts(0 ?? "This is TRUE\n" :: "This is FALSE\n")
|
||||||
done
|
done
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
* ANY KIND, either express or implied. See the License for the specific language
|
* ANY KIND, either express or implied. See the License for the specific language
|
||||||
* governing permissions and limitations under the License.
|
* governing permissions and limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define TOKEN(c) (0x80|(c))
|
#define TOKEN(c) (0x80|(c))
|
||||||
#define IS_TOKEN(c) (0x80&(c))
|
#define IS_TOKEN(c) (0x80&(c))
|
||||||
/*
|
/*
|
||||||
@ -54,6 +53,11 @@
|
|||||||
#define STRUC_TOKEN TOKEN(31)
|
#define STRUC_TOKEN TOKEN(31)
|
||||||
#define CONTINUE_TOKEN TOKEN(32)
|
#define CONTINUE_TOKEN TOKEN(32)
|
||||||
//#define EVAL_TOKEN TOKEN(32)
|
//#define EVAL_TOKEN TOKEN(32)
|
||||||
|
/*
|
||||||
|
* Ternary operand operators.
|
||||||
|
*/
|
||||||
|
#define TERNARY_TOKEN TOKEN('?')
|
||||||
|
#define TRIELSE_TOKEN TOKEN('_')
|
||||||
/*
|
/*
|
||||||
* Double operand operators.
|
* Double operand operators.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user