mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-02-20 17:29:11 +00:00
Add 'point-to' operator
This commit is contained in:
parent
c75a354254
commit
2e0674c158
@ -30,7 +30,9 @@ const page2 = 1
|
||||
;
|
||||
; Predefined functions.
|
||||
;
|
||||
predef a2keypressed, a2gotoxy, a2grmixmode, a2textmode
|
||||
predef a2reset,a2keypressed,a2home,a2gotoxy,a2viewport,a2texttype
|
||||
predef a2textmode,a2writeint,a2writeln
|
||||
predef a2grmode,grcolor,grplot
|
||||
;
|
||||
; String pool.
|
||||
;
|
||||
@ -45,6 +47,12 @@ word txt2scrn[] = $0800,$0880,$0900,$0980,$0A00,$0A80,$0B00,$0B80
|
||||
word = $0828,$08A8,$0928,$09A8,$0A28,$0AA8,$0B28,$0BA8
|
||||
word = $0850,$08D0,$0950,$09D0,$0A50,$0AD0,$0B50,$0BD0
|
||||
;
|
||||
; Text screen parameters.
|
||||
;
|
||||
byte textcols = 40
|
||||
byte curshpos = 0
|
||||
byte cursvpos = 0
|
||||
;
|
||||
; Apple 3 console codes.
|
||||
;
|
||||
byte textbwmode[] = 2, 16, 0
|
||||
@ -65,7 +73,7 @@ word = @a2gotoxy
|
||||
word = @a2viewport
|
||||
word = @a2texttype
|
||||
word = @a2textmode
|
||||
word = @a2grmixmode
|
||||
word = @a2grmode
|
||||
word = @grcolor
|
||||
word = @grplot
|
||||
;
|
||||
@ -141,6 +149,13 @@ def a1keypressed
|
||||
return ^$D011 >= 128
|
||||
end
|
||||
def a1gotoxy(x, y)
|
||||
curshpos = x
|
||||
cursvpos = y
|
||||
putln
|
||||
while x
|
||||
putc(' ')
|
||||
x = x - 1
|
||||
loop
|
||||
end
|
||||
def a1viewport(left, top, width, height)
|
||||
end
|
||||
@ -157,7 +172,14 @@ end
|
||||
def a2keypressed
|
||||
return ^keyboard >= 128
|
||||
end
|
||||
def a2home
|
||||
curshpos = 0
|
||||
cursypos = 0
|
||||
return call($FC58, 0, 0, 0, 0) ;home()
|
||||
end
|
||||
def a2gotoxy(x, y)
|
||||
curshpos = x
|
||||
cursvpos = y
|
||||
^$24 = x + ^$20
|
||||
return call($FB5B, y + ^$22, 0, 0, 0)
|
||||
end
|
||||
@ -175,10 +197,13 @@ def a2viewport(left, top, width, height)
|
||||
return a2gotoxy(0, 0)
|
||||
end
|
||||
def a2texttype(type)
|
||||
end
|
||||
def a2writeln(string, start, fill)
|
||||
|
||||
end
|
||||
def a2textmode(columns)
|
||||
call($FB39, 0, 0, 0, 0) ;textmode()
|
||||
return call($FC58, 0, 0, 0, 0) ;home()
|
||||
return a2home
|
||||
end
|
||||
def a2grmode(mix)
|
||||
call($FB2F, 0, 0, 0, 0) ;initmode()
|
||||
@ -186,7 +211,7 @@ def a2grmode(mix)
|
||||
if !mix
|
||||
^showfull
|
||||
fin
|
||||
call($FC58, 0, 0, 0, 0) ;home()
|
||||
a2home
|
||||
return grscrn(@txt1scrn) ; point to lo-res screen
|
||||
end
|
||||
;
|
||||
@ -216,9 +241,13 @@ def a3keypressed
|
||||
return count
|
||||
end
|
||||
def a3home
|
||||
curshpos = 0
|
||||
cursvpos = 0
|
||||
return cout(28)
|
||||
end
|
||||
def a3gotoxy(x, y)
|
||||
curshpos = x
|
||||
cursvpos = y
|
||||
putc(24)
|
||||
putc(x)
|
||||
putc(25)
|
||||
@ -231,7 +260,7 @@ def a3viewport(left, top, width, height)
|
||||
;
|
||||
left = 0
|
||||
top = 0
|
||||
width = 80
|
||||
width = textwidth
|
||||
height = 24
|
||||
fin
|
||||
putc(1) ; Reset viewport
|
||||
@ -248,8 +277,13 @@ end
|
||||
def a3texttype(type)
|
||||
end
|
||||
def a3textmode(columns)
|
||||
puts(@textbwmode)
|
||||
a3viewport(0, 0, 40, 24)
|
||||
if columns > 40
|
||||
puts(@textbwmode)
|
||||
a3viewport(0, 0, 80, 24)
|
||||
else
|
||||
puts(@textbwmode)
|
||||
a3viewport(0, 0, 40, 24)
|
||||
fin
|
||||
return putc(28)
|
||||
end
|
||||
def a3grmode(mix)
|
||||
|
@ -17,6 +17,7 @@ byte a2e[] = "//e"
|
||||
byte a2c[] = "//c"
|
||||
byte a3[] = "///"
|
||||
word struct[] = 1, 10, 100, 1000, 10000
|
||||
word ptr
|
||||
byte spaces[] = " "
|
||||
|
||||
;
|
||||
@ -77,5 +78,8 @@ export def main(range)
|
||||
putln
|
||||
end
|
||||
|
||||
ptr=@struct
|
||||
main(@struct:6)
|
||||
puti((ptr):6)
|
||||
puti(ptr=>6)
|
||||
done
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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('(')
|
||||
|
@ -678,10 +678,10 @@ def addsym(sym, addr)
|
||||
lastsym = lastsym + 1
|
||||
sym = sym + 1
|
||||
loop
|
||||
(lastsym).0 = ^sym
|
||||
(lastsym):1 = addr
|
||||
lastsym = lastsym + 3
|
||||
^lastsym = 0
|
||||
lastsym->0 = ^sym
|
||||
lastsym=>1 = addr
|
||||
lastsym = lastsym + 3
|
||||
^lastsym = 0
|
||||
end
|
||||
;
|
||||
; Module routines.
|
||||
@ -705,7 +705,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
|
||||
@ -723,15 +723,15 @@ def adddef(addr, deflast)
|
||||
word defentry
|
||||
defentry = *deflast
|
||||
*deflast = defentry + 5
|
||||
(defentry).0 = $20
|
||||
(defentry):1 = interp
|
||||
(defentry):3 = addr
|
||||
(defentry).5 = 0 ; null out next entry
|
||||
defentry->0 = $20
|
||||
defentry=>1 = interp
|
||||
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
|
||||
@ -749,7 +749,7 @@ def loadmod(mod)
|
||||
; Read the RELocatable module header (first 128 bytes)
|
||||
;
|
||||
dcitos(mod, @filename)
|
||||
rdlen = (finddirentry(@filename)):$15
|
||||
rdlen = finddirentry(@filename)=>$15
|
||||
if perr
|
||||
return -perr
|
||||
fin
|
||||
@ -760,7 +760,7 @@ def loadmod(mod)
|
||||
moddep = @header.1
|
||||
defofst = modsize
|
||||
init = 0
|
||||
if rdlen > 4 and (heap):2 == $DA7E ; DAVE = magic number :-)
|
||||
if rdlen > 4 and heap=>2 == $DA7E ; DAVE = magic number :-)
|
||||
;
|
||||
; This is an EXTended RELocatable (data+bytecode) module.
|
||||
;
|
||||
@ -823,9 +823,9 @@ def loadmod(mod)
|
||||
;
|
||||
; This is a bytcode def entry - add it to the def directory.
|
||||
;
|
||||
adddef((rld):1 - defofst + bytecode, @deflast)
|
||||
adddef(rld=>1 - defofst + bytecode, @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
|
||||
@ -833,7 +833,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)
|
||||
@ -862,7 +862,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.
|
||||
@ -962,8 +962,8 @@ lastsym = symtbl
|
||||
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
|
||||
;
|
||||
|
@ -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
|
||||
;
|
||||
|
@ -334,16 +334,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
|
||||
@ -354,9 +354,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
|
||||
|
@ -632,16 +632,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
|
||||
@ -652,9 +652,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
|
||||
|
@ -422,16 +422,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
|
||||
@ -442,9 +442,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
|
||||
|
@ -773,14 +773,14 @@ def cin
|
||||
end
|
||||
def prstr(str)
|
||||
write(refcons, str + 1, ^str)
|
||||
if (str).[^str] == $0D
|
||||
if str->[^str] == $0D
|
||||
cout($0A)
|
||||
fin
|
||||
end
|
||||
def rdstr(prompt)
|
||||
cout(prompt)
|
||||
^heap = read(refcons, heap + 1, 128)
|
||||
if (heap).[^heap] == $0D
|
||||
if heap->[^heap] == $0D
|
||||
^heap = ^heap - 1
|
||||
fin
|
||||
cout($0D)
|
||||
@ -873,7 +873,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
|
||||
lerr = $81
|
||||
@ -891,15 +891,15 @@ def adddef(ext, addr, deflast)
|
||||
word defentry
|
||||
defentry = *deflast
|
||||
*deflast = defentry + 6
|
||||
(defentry).0 = $20
|
||||
(defentry):1 = interp
|
||||
(defentry):3 = addr
|
||||
(defentry):5 = ext ; ext is byte, so this nulls out next entry
|
||||
defentry->0 = $20
|
||||
defentry=>1 = interp
|
||||
defentry=>3 = addr
|
||||
defentry=>5 = ext ; ext is byte, so this nulls 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 + 6
|
||||
@ -1013,9 +1013,9 @@ def loadmod(mod)
|
||||
;
|
||||
; This is a bytcode def entry - add it to the def directory.
|
||||
;
|
||||
adddef(defext, (rld):1 - defofst + defaddr, @deflast)
|
||||
adddef(defext, 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
|
||||
@ -1023,7 +1023,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)
|
||||
@ -1052,7 +1052,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.
|
||||
@ -1136,9 +1136,9 @@ def catalog(optpath)
|
||||
if read(refnum, heap, 512) == 512
|
||||
entry = heap + 4
|
||||
if firstblk
|
||||
entrylen = (heap).$23
|
||||
entriesblk = (heap).$24
|
||||
filecnt = (heap):$25
|
||||
entrylen = heap->$23
|
||||
entriesblk = heap->$24
|
||||
filecnt = heap=>$25
|
||||
entry = entry + entrylen
|
||||
fin
|
||||
for i = firstblk to entriesblk
|
||||
@ -1150,10 +1150,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
|
||||
@ -1244,8 +1244,8 @@ xpokeb(symtbl.0, lastsym, 0)
|
||||
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
|
||||
;
|
||||
|
Loading…
x
Reference in New Issue
Block a user