mirror of
https://github.com/badvision/lawless-legends.git
synced 2025-02-09 09:31:57 +00:00
New 'pointer-to' operators.
This commit is contained in:
parent
f43c51dd74
commit
f0c628016e
@ -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
|
||||
;
|
||||
|
@ -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;
|
||||
|
@ -288,11 +288,14 @@ 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)
|
||||
{
|
||||
case OPEN_BRACKET_TOKEN:
|
||||
/*
|
||||
* Array
|
||||
*/
|
||||
@ -336,9 +339,29 @@ int parse_value(int rvalue)
|
||||
emit_indexbyte();
|
||||
}
|
||||
//type &= ~(ADDR_TYPE | CONST_TYPE);
|
||||
}
|
||||
else if (scantoken == DOT_TOKEN || scantoken == COLON_TOKEN)
|
||||
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
|
||||
*/
|
||||
@ -420,9 +443,8 @@ int parse_value(int rvalue)
|
||||
return (0);
|
||||
}
|
||||
type = elem_type; //(type & ~(ADDR_TYPE | CONST_TYPE)) | elem_type;
|
||||
}
|
||||
else if (scantoken == OPEN_PAREN_TOKEN)
|
||||
{
|
||||
break;
|
||||
case OPEN_PAREN_TOKEN:
|
||||
/*
|
||||
* Function call
|
||||
*/
|
||||
@ -466,6 +488,7 @@ int parse_value(int rvalue)
|
||||
}
|
||||
emit_value = 1;
|
||||
type = WORD_TYPE; //(type & ~(FUNC_TYPE | CONST_TYPE)) | WORD_TYPE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (emit_value)
|
||||
|
@ -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
|
||||
|
@ -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('(')
|
||||
|
Loading…
x
Reference in New Issue
Block a user