New 'pointer-to' operators.

This commit is contained in:
David Schmenk 2014-07-04 10:20:01 -07:00
parent f43c51dd74
commit f0c628016e
5 changed files with 216 additions and 181 deletions

View File

@ -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
;

View File

@ -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;

View File

@ -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)

View File

@ -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

View File

@ -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('(')