1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-08-07 18:25:03 +00:00

Keep exported functions with a return value

This commit is contained in:
Dave Schmenk
2017-12-16 11:04:42 -08:00
parent 40715efbdb
commit 6c0147819c

View File

@@ -516,7 +516,7 @@ end
// MEMSET(ADDR, VALUE, SIZE) // MEMSET(ADDR, VALUE, SIZE)
// With optimizations from Peter Ferrie // With optimizations from Peter Ferrie
// //
asm memset(addr, val, size)#0 asm memset(addr, val, size)
LDA ESTKL+2,X LDA ESTKL+2,X
STA DSTL STA DSTL
LDA ESTKH+2,X LDA ESTKH+2,X
@@ -542,7 +542,6 @@ SETMLPH STA (DST),Y
LDA ESTKH+1,X LDA ESTKH+1,X
BCS SETMLPH BCS SETMLPH
SETMEX INX SETMEX INX
INX
INX INX
RTS RTS
end end
@@ -550,32 +549,31 @@ end
// COPY MEMORY // COPY MEMORY
// MEMCPY(DSTADDR, SRCADDR, SIZE) // MEMCPY(DSTADDR, SRCADDR, SIZE)
// //
asm memcpy(dst, src, size)#0 asm memcpy(dst, src, size)
INX INX
INX INX
INX
LDA ESTKL-3,X
ORA ESTKH-3,X
BEQ CPYMEX
LDA ESTKL-2,X LDA ESTKL-2,X
CMP ESTKL-1,X ORA ESTKH-2,X
LDA ESTKH-2,X BEQ CPYMEX
SBC ESTKH-1,X LDA ESTKL-1,X
CMP ESTKL,X
LDA ESTKH-1,X
SBC ESTKH,X
BCC REVCPY BCC REVCPY
; ;
; FORWARD COPY ; FORWARD COPY
; ;
LDA ESTKL-1,X LDA ESTKL,X
STA DSTL STA DSTL
LDA ESTKH-1,X LDA ESTKH,X
STA DSTH STA DSTH
LDA ESTKL-2,X LDA ESTKL-1,X
STA SRCL STA SRCL
LDA ESTKH-2,X LDA ESTKH-1,X
STA SRCH STA SRCH
LDY ESTKL-3,X LDY ESTKL-2,X
BEQ FORCPYLP BEQ FORCPYLP
INC ESTKH-3,X INC ESTKH-2,X
LDY #$00 LDY #$00
FORCPYLP LDA (SRC),Y FORCPYLP LDA (SRC),Y
STA (DST),Y STA (DST),Y
@@ -583,34 +581,34 @@ FORCPYLP LDA (SRC),Y
BNE + BNE +
INC DSTH INC DSTH
INC SRCH INC SRCH
+ DEC ESTKL-3,X + DEC ESTKL-2,X
BNE FORCPYLP BNE FORCPYLP
DEC ESTKH-3,X DEC ESTKH-2,X
BNE FORCPYLP BNE FORCPYLP
RTS RTS
; ;
; REVERSE COPY ; REVERSE COPY
; ;
REVCPY ;CLC REVCPY ;CLC
LDA ESTKL-3,X LDA ESTKL-2,X
ADC ESTKL-1,X ADC ESTKL,X
STA DSTL STA DSTL
LDA ESTKH-3,X LDA ESTKH-2,X
ADC ESTKH-1,X ADC ESTKH,X
STA DSTH STA DSTH
CLC CLC
LDA ESTKL-3,X LDA ESTKL-2,X
ADC ESTKL-2,X ADC ESTKL-1,X
STA SRCL STA SRCL
LDA ESTKH-3,X LDA ESTKH-2,X
ADC ESTKH-2,X ADC ESTKH-1,X
STA SRCH STA SRCH
DEC DSTH DEC DSTH
DEC SRCH DEC SRCH
LDY #$FF LDY #$FF
LDA ESTKL-3,X LDA ESTKL-2,X
BEQ REVCPYLP BEQ REVCPYLP
INC ESTKH-3,X INC ESTKH-2,X
REVCPYLP LDA (SRC),Y REVCPYLP LDA (SRC),Y
STA (DST),Y STA (DST),Y
DEY DEY
@@ -618,9 +616,9 @@ REVCPYLP LDA (SRC),Y
BNE + BNE +
DEC DSTH DEC DSTH
DEC SRCH DEC SRCH
+ DEC ESTKL-3,X + DEC ESTKL-2,X
BNE REVCPYLP BNE REVCPYLP
DEC ESTKH-3,X DEC ESTKH-2,X
BNE REVCPYLP BNE REVCPYLP
CPYMEX RTS CPYMEX RTS
end end
@@ -628,9 +626,8 @@ end
// CHAR OUT // CHAR OUT
// COUT(CHAR) // COUT(CHAR)
// //
asm cout(char)#0 asm cout(char)
LDA ESTKL,X LDA ESTKL,X
INX
COUT1 BIT $BF98 COUT1 BIT $BF98
BMI + BMI +
JSR TOUPR JSR TOUPR
@@ -659,13 +656,12 @@ end
// PRINT STRING // PRINT STRING
// PRSTR(STR) // PRSTR(STR)
// //
asm prstr(pstr)#0 asm prstr(pstr)
LDY #$00 LDY #$00
LDA ESTKL,X LDA ESTKL,X
STA SRCL STA SRCL
LDA ESTKH,X LDA ESTKH,X
STA SRCH STA SRCH
INX
LDA (SRC),Y LDA (SRC),Y
STA TMP STA TMP
BEQ ++ BEQ ++
@@ -903,12 +899,12 @@ end
// //
// Runtime routines // Runtime routines
// //
def home#0 def home
call($FC58, 0, 0, 0, 0) return call($FC58, 0, 0, 0, 0)
end end
def gotoxy(x, y)#0 def gotoxy(x, y)
^$24 = x + ^$20 ^$24 = x + ^$20
call($FB5B, y + ^$22, 0, 0, 0) return call($FB5B, y + ^$22, 0, 0, 0)
end end
// //
// ProDOS routines // ProDOS routines
@@ -1171,7 +1167,7 @@ def prword(h)#0
cout('$') cout('$')
call($F941, h >> 8, h, 0, 0) call($F941, h >> 8, h, 0, 0)
end end
def print(i)#0 def print(i)
byte numstr[7] byte numstr[7]
byte place, sign byte place, sign
@@ -1194,7 +1190,7 @@ def print(i)#0
place-- place--
fin fin
numstr[place] = 6 - place numstr[place] = 6 - place
prstr(@numstr[place]) return prstr(@numstr[place])
end end
def nametostr(namestr, len, strptr)#0 def nametostr(namestr, len, strptr)#0
^strptr = len ^strptr = len
@@ -2608,14 +2604,14 @@ end
// Alebraic op to stack op // Alebraic op to stack op
// //
def push_op(op, prec)#0 def push_op(op, prec)#0
opsp = opsp + 1 opsp++
if opsp == 16; parse_err(@estk_overflw); return; fin if opsp == 16; parse_err(@estk_overflw); return; fin
opstack[opsp] = op opstack[opsp] = op
precstack[opsp] = prec precstack[opsp] = prec
end end
def pop_op def pop_op
if opsp < 0; return parse_err(@estk_underflw); fin if opsp < 0; return parse_err(@estk_underflw); fin
opsp = opsp - 1 opsp--
return opstack[opsp + 1] return opstack[opsp + 1]
end end
def tos_op def tos_op
@@ -2631,7 +2627,7 @@ def tos_op_prec(tos)
return precstack[opsp] return precstack[opsp]
end end
def push_val(value, size, type)#0 def push_val(value, size, type)#0
valsp = valsp + 1 valsp++
if valsp == 16; parse_err(@estk_overflw); return; fin if valsp == 16; parse_err(@estk_overflw); return; fin
valstack[valsp] = value valstack[valsp] = value
sizestack[valsp] = size sizestack[valsp] = size
@@ -2642,7 +2638,7 @@ def pop_val(valptr, sizeptr, typeptr)
*valptr = valstack[valsp] *valptr = valstack[valsp]
^sizeptr = sizestack[valsp] ^sizeptr = sizestack[valsp]
^typeptr = typestack[valsp] ^typeptr = typestack[valsp]
valsp = valsp - 1 valsp--
return valsp + 1 return valsp + 1
end end
// //
@@ -2685,7 +2681,7 @@ def scan
// ID, either variable name or reserved word // ID, either variable name or reserved word
// //
repeat repeat
scanptr = scanptr + 1 scanptr++
until !isalphanum(^scanptr) until !isalphanum(^scanptr)
tknlen = scanptr - tknptr tknlen = scanptr - tknptr
token = keymatch token = keymatch
@@ -2697,7 +2693,7 @@ def scan
constval = 0 constval = 0
repeat repeat
constval = constval * 10 + ^scanptr - '0' constval = constval * 10 + ^scanptr - '0'
scanptr = scanptr + 1 scanptr++
until !isnum(^scanptr) until !isnum(^scanptr)
else else
// //
@@ -2710,9 +2706,9 @@ def scan
^scanptr = $00 ^scanptr = $00
else else
token = DIV_TKN token = DIV_TKN
scanptr = scanptr + 1 scanptr++
fin fin
break break
is '=' is '='
if ^(scanptr + 1) == '=' if ^(scanptr + 1) == '='
token = EQ_TKN token = EQ_TKN
@@ -2722,9 +2718,9 @@ def scan
scanptr = scanptr + 2 scanptr = scanptr + 2
else else
token = SET_TKN token = SET_TKN
scanptr = scanptr + 1 scanptr++
fin fin
break break
is '-' is '-'
if ^(scanptr + 1) == '>' if ^(scanptr + 1) == '>'
token = PTRB_TKN token = PTRB_TKN
@@ -2734,19 +2730,19 @@ def scan
scanptr = scanptr + 2 scanptr = scanptr + 2
else else
token = SUB_TKN token = SUB_TKN
scanptr = scanptr + 1 scanptr++
fin fin
break break
is '+' is '+'
if ^(scanptr + 1) == '+' if ^(scanptr + 1) == '+'
token = INC_TKN token = INC_TKN
scanptr = scanptr + 2 scanptr = scanptr + 2
else else
token = ADD_TKN token = ADD_TKN
scanptr = scanptr + 1 scanptr++
fin fin
break break
is '>' is '>'
if ^(scanptr + 1) == '>' if ^(scanptr + 1) == '>'
token = SHR_TKN token = SHR_TKN
scanptr = scanptr + 2 scanptr = scanptr + 2
@@ -2755,9 +2751,9 @@ def scan
scanptr = scanptr + 2 scanptr = scanptr + 2
else else
token = GT_TKN token = GT_TKN
scanptr = scanptr + 1 scanptr++
fin fin
break break
is '<' is '<'
if ^(scanptr + 1) == '<' if ^(scanptr + 1) == '<'
token = SHL_TKN token = SHL_TKN
@@ -2770,41 +2766,41 @@ def scan
scanptr = scanptr + 2 scanptr = scanptr + 2
else else
token = LT_TKN token = LT_TKN
scanptr = scanptr + 1 scanptr++
fin fin
break break
is '$' is '$'
// //
// Hexadecimal constant // Hexadecimal constant
// //
token = INT_TKN token = INT_TKN
constval = 0 constval = 0
repeat repeat
scanptr = scanptr + 1 scanptr++
if ^scanptr >= '0' and ^scanptr <= '9' if ^scanptr >= '0' and ^scanptr <= '9'
constval = (constval << 4) + ^scanptr - '0' constval = (constval << 4) + ^scanptr - '0'
elsif ^scanptr >= 'A' and ^scanptr <= 'F' elsif ^scanptr >= 'A' and ^scanptr <= 'F'
constval = (constval << 4) + ^scanptr - '7'// 'A'-10 constval = (constval << 4) + ^scanptr - '7'// 'A'-10
elsif ^scanptr >= 'a' and ^scanptr <= 'f' elsif ^scanptr >= 'a' and ^scanptr <= 'f'
constval = (constval << 4) + ^scanptr - 'W'// 'a'-10 constval = (constval << 4) + ^scanptr - 'W'// 'a'-10
else else
break break
fin fin
until !^scanptr until !^scanptr
break break
is $27 // ' is $27 // '
// //
// Character constant // Character constant
// //
token = CHR_TKN token = CHR_TKN
if ^(scanptr + 1) <> $5C // \ if ^(scanptr + 1) <> $5C // \
constval = ^(scanptr + 1) constval = ^(scanptr + 1)
if ^(scanptr + 2) <> $27 // ' if ^(scanptr + 2) <> $27 // '
return parse_err(@bad_cnst) return parse_err(@bad_cnst)
fin fin
scanptr = scanptr + 3 scanptr = scanptr + 3
else else
when ^(scanptr + 2) when ^(scanptr + 2)
is 'n' is 'n'
constval = $0D; break constval = $0D; break
is 'r' is 'r'
@@ -2819,34 +2815,34 @@ def scan
fin fin
scanptr = scanptr + 4 scanptr = scanptr + 4
fin fin
break break
is '"' is '"'
// //
// String constant // String constant
// //
token = STR_TKN token = STR_TKN
scanptr = scanptr + 1 constval = scanptr
constval = scanptr scanptr++
while ^scanptr and ^scanptr <> '"' while ^scanptr and ^scanptr <> '"'
scanptr = scanptr + 1 scanptr++
loop loop
if !^scanptr if !^scanptr
return parse_err(@bad_cnst) return parse_err(@bad_cnst)
fin fin
scanptr = scanptr + 1 scanptr++
break break
is 0 is 0
is ';' is ';'
if token <> EOF_TKN if token <> EOF_TKN
token = EOL_TKN token = EOL_TKN
fin fin
break break
otherwise otherwise
// //
// Simple single character tokens // Simple single character tokens
// //
token = scanchr | $80 token = scanchr | $80
scanptr = scanptr + 1 scanptr++
wend wend
fin fin
tknlen = scanptr - tknptr tknlen = scanptr - tknptr
@@ -2874,21 +2870,24 @@ end
// //
def nextln def nextln
if ^scanptr == ';' if ^scanptr == ';'
scanptr = scanptr + 1 scanptr++
scan scan
else else
scanptr = inbuff scanptr = inbuff
if lineno < numlines if lineno < numlines
cpyln(strlinbuf:[lineno], instr) cpyln(strlinbuf:[lineno], instr)
lineno = lineno + 1 lineno++
if !(lineno & $0F); cout('.'); fin if !(lineno & $0F); cout('.'); fin
//cout('>') print(lineno);cout(':');print(numlines)
//prstr(instr) cout('>')
//crout prstr(instr)
crout
scan scan
else else
^instr = 0 cout('<')
^inbuff = 0 crout
^instr = 0
^inbuff = 0
token = DONE_TKN token = DONE_TKN
fin fin
fin fin
@@ -3848,6 +3847,7 @@ def parse_var(type)
byte consttype, constsize, idlen byte consttype, constsize, idlen
word idptr, constval, arraysize, size word idptr, constval, arraysize, size
cout('T')
idlen = 0 idlen = 0
size = 1 size = 1
if scan == OPEN_BRACKET_TKN if scan == OPEN_BRACKET_TKN
@@ -3903,15 +3903,16 @@ def parse_struc
byte type, idlen, struclen, constsize byte type, idlen, struclen, constsize
word size, offset, idstr word size, offset, idstr
cout('S')
struclen = 0 struclen = 0
if scan == ID_TKN if scan == ID_TKN
struclen = tknlen struclen = tknlen
if struclen > 16 if struclen > 16
struclen = 16 struclen = 16
fin fin
for idlen = 0 to struclen for idlen = 0 to struclen
strucid[idlen] = ^(tknptr + idlen) strucid[idlen] = ^(tknptr + idlen)
next next
fin fin
offset = 0 offset = 0
while nextln == BYTE_TKN or token == WORD_TKN while nextln == BYTE_TKN or token == WORD_TKN
@@ -3941,10 +3942,10 @@ def parse_struc
fin fin
if type & WORD_TYPE if type & WORD_TYPE
size = size * 2 size = size * 2
fin fin
if idlen if idlen
idconst_add(idstr, idlen, offset) idconst_add(idstr, idlen, offset)
fin fin
offset = offset + size offset = offset + size
until token <> COMMA_TKN until token <> COMMA_TKN
if token <> EOL_TKN; return FALSE; fin if token <> EOL_TKN; return FALSE; fin
@@ -3958,6 +3959,7 @@ def parse_vars
byte idlen, type, size byte idlen, type, size
word value, idptr word value, idptr
cout('V')
when token when token
is CONST_TKN is CONST_TKN
if scan <> ID_TKN if scan <> ID_TKN
@@ -3972,7 +3974,7 @@ def parse_vars
return parse_err(@bad_cnst) return parse_err(@bad_cnst)
fin fin
idconst_add(idptr, idlen, value) idconst_add(idptr, idlen, value)
break break
is STRUC_TKN is STRUC_TKN
if !parse_struc; parse_err(@bad_struc); fin if !parse_struc; parse_err(@bad_struc); fin
break break
@@ -3988,7 +3990,7 @@ def parse_vars
return FALSE return FALSE
fin fin
until token <> COMMA_TKN until token <> COMMA_TKN
break break
is PREDEF_TKN is PREDEF_TKN
repeat repeat
if scan == ID_TKN if scan == ID_TKN
@@ -3997,7 +3999,7 @@ def parse_vars
return parse_err(@bad_decl) return parse_err(@bad_decl)
fin fin
until scan <> COMMA_TKN until scan <> COMMA_TKN
break break
is EOL_TKN is EOL_TKN
break break
otherwise otherwise
@@ -4010,6 +4012,7 @@ def parse_defs
word func_tag, idptr word func_tag, idptr
if token == DEF_TKN if token == DEF_TKN
cout('D')
if scan <> ID_TKN; return parse_err(@bad_decl); fin if scan <> ID_TKN; return parse_err(@bad_decl); fin
cfnparms = 0 cfnparms = 0
infunc = TRUE infunc = TRUE
@@ -4067,6 +4070,7 @@ def parse_module
while parse_defs while parse_defs
nextln nextln
loop loop
cout('I')
framesize = 0 framesize = 0
entrypoint = codeptr entrypoint = codeptr
emit_enter(0) emit_enter(0)
@@ -4076,6 +4080,7 @@ def parse_module
nextln nextln
loop loop
fin fin
cout('!')
if prevstmnt <> RETURN_TKN if prevstmnt <> RETURN_TKN
emit_const(0) emit_const(0)
emit_leave emit_leave