mirror of
https://github.com/badvision/lawless-legends.git
synced 2025-03-01 03:30:04 +00:00
Update stdlib, optimize memcpy, make unresolved externals generate error
This commit is contained in:
parent
d8cc70dbc9
commit
38b8858578
@ -5,13 +5,6 @@ const MODADDR = $1000
|
||||
const symtbl = $0C00
|
||||
const freemem = $0006
|
||||
;
|
||||
; ROMCALL return register structure.
|
||||
;
|
||||
const acc = 0
|
||||
const xreg = 1
|
||||
const yreg = 2
|
||||
const preg = 3
|
||||
;
|
||||
; System flags: memory allocator screen holes.
|
||||
;
|
||||
const restxt1 = $0001
|
||||
@ -24,15 +17,16 @@ const resxhgr2 = $0020
|
||||
; Pedefined functions.
|
||||
;
|
||||
predef home, gotoxy, viewport, crout, cout, prstr, cin, rdstr
|
||||
predef syscall, romcall
|
||||
predef syscall
|
||||
predef markheap, allocheap, allocalignheap, releaseheap, availheap
|
||||
predef memset, memcpy, xmemcpy, memxcpy
|
||||
predef memset, memcpy
|
||||
predef uword_isgt, uword_isge, uword_islt, uword_isle
|
||||
predef execmod
|
||||
predef loadmod, execmod
|
||||
;
|
||||
; Standard Library exported functions.
|
||||
;
|
||||
byte stdlibstr[] = "STDLIB"
|
||||
byte machidstr[] = "MACHID"
|
||||
byte clsstr[] = "CLS"
|
||||
byte gotoxystr[] = "GOTOXY"
|
||||
byte viewstr[] = "VIEWPORT"
|
||||
@ -41,7 +35,6 @@ byte putsstr[] = "PUTS"
|
||||
byte getcstr[] = "GETC"
|
||||
byte getsstr[] = "GETS"
|
||||
byte sysstr[] = "SYSCALL"
|
||||
byte romstr[] = "ROMCALL"
|
||||
byte hpmarkstr[] = "HEAPMARK"
|
||||
byte hpalignstr[] = "HEAPALLOCALIGN"
|
||||
byte hpallocstr[] = "HEAPALLOC"
|
||||
@ -49,11 +42,11 @@ byte hprelstr[] = "HEAPRELEASE"
|
||||
byte hpavailstr[] = "HEAPAVAIL"
|
||||
byte memsetstr[] = "MEMSET"
|
||||
byte memcpystr[] = "MEMCPY"
|
||||
byte memxcpystr[] = "MEMXCPY"
|
||||
byte uisgtstr[] = "ISUGT"
|
||||
byte uisgestr[] = "ISUGE"
|
||||
byte uisltstr[] = "ISULT"
|
||||
byte uislestr[] = "ISULE"
|
||||
byte loadstr[] = "LOAD"
|
||||
byte execstr[] = "EXEC"
|
||||
word exports[] = @clsstr, @home
|
||||
word = @gotoxystr, @gotoxy
|
||||
@ -63,19 +56,19 @@ word = @putsstr, @prstr
|
||||
word = @getcstr, @cin
|
||||
word = @getsstr, @rdstr
|
||||
word = @sysstr, @syscall
|
||||
word = @romstr, @romcall
|
||||
word = @hpmarkstr, @markheap
|
||||
word = @hpallocstr,@allocheap
|
||||
word = @hpalignstr,@allocalignheap
|
||||
word = @hprelstr, @releaseheap
|
||||
word = @memsetstr, @memset
|
||||
word = @memcpystr, @memcpy
|
||||
word = @memxcpystr, @memxcpy
|
||||
word = @uisgtstr, @uword_isgt
|
||||
word = @uisgestr, @uword_isge
|
||||
word = @uisltstr, @uword_islt
|
||||
word = @uislestr, @uword_isle
|
||||
word = @loadstr, @loadmod
|
||||
word = @execstr, @execmod
|
||||
word = @machidstr, MACHID
|
||||
word = 0
|
||||
word stdlibsym = @exports
|
||||
;
|
||||
@ -94,7 +87,7 @@ word heap
|
||||
word lastsym = symtbl
|
||||
word xheap = $0800
|
||||
word systemflags = 0
|
||||
word perr
|
||||
byte perr, lerr
|
||||
word cmdptr
|
||||
;
|
||||
; Utility functions
|
||||
@ -112,50 +105,6 @@ LCBNK1 = $08
|
||||
!SOURCE "plvm02zp.inc"
|
||||
end
|
||||
;
|
||||
; CALL 6502 ROUTINE
|
||||
; ROMCALL(AREG, XREG, YREG, STATUS, ADDR)
|
||||
;
|
||||
asm romcall
|
||||
PHP
|
||||
LDA ESTKL,X
|
||||
STA TMPL
|
||||
LDA ESTKH,X
|
||||
STA TMPH
|
||||
INX
|
||||
LDA ESTKL,X
|
||||
PHA
|
||||
INX
|
||||
LDA ESTKL,X
|
||||
TAY
|
||||
INX
|
||||
LDA ESTKL+1,X
|
||||
PHA
|
||||
LDA ESTKL,X
|
||||
INX
|
||||
STX ESP
|
||||
TAX
|
||||
PLA
|
||||
BIT ROMEN
|
||||
PLP
|
||||
JSR JMPTMP
|
||||
PHP
|
||||
BIT LCRDEN+LCBNK2
|
||||
STA REGVALS+0
|
||||
STX REGVALS+1
|
||||
STY REGVALS+2
|
||||
PLA
|
||||
STA REGVALS+3
|
||||
LDX ESP
|
||||
LDA #<REGVALS
|
||||
LDY #>REGVALS
|
||||
STA ESTKL,X
|
||||
STY ESTKH,X
|
||||
PLP
|
||||
RTS
|
||||
REGVALS !FILL 4
|
||||
JMPTMP JMP (TMP)
|
||||
end
|
||||
;
|
||||
; CALL PRODOS
|
||||
; SYSCALL(CMD, PARAMS)
|
||||
;
|
||||
@ -238,81 +187,77 @@ end
|
||||
; MEMCPY(DSTADDR, SRCADDR, SIZE)
|
||||
;
|
||||
asm memcpy
|
||||
LDY #$00
|
||||
INX
|
||||
INX
|
||||
LDA ESTKL-2,X
|
||||
ORA ESTKH-2,X
|
||||
BEQ CPYMEX
|
||||
LDA ESTKL-1,X
|
||||
CMP ESTKL,X
|
||||
LDA ESTKH-1,X
|
||||
SBC ESTKH,X
|
||||
BCC REVCPY
|
||||
;
|
||||
; FORWARD COPY
|
||||
;
|
||||
LDA ESTKL,X
|
||||
BNE +
|
||||
LDA ESTKH,X
|
||||
BEQ CPYMEX
|
||||
+ LDA ESTKL+2,X
|
||||
STA DSTL
|
||||
LDA ESTKH+2,X
|
||||
LDA ESTKH,X
|
||||
STA DSTH
|
||||
LDA ESTKL+1,X
|
||||
LDA ESTKL-1,X
|
||||
STA SRCL
|
||||
LDA ESTKH+1,X
|
||||
LDA ESTKH-1,X
|
||||
STA SRCH
|
||||
CMP DSTH
|
||||
BCC REVCPY
|
||||
BNE FORCPY
|
||||
LDA SRCL
|
||||
CMP DSTL
|
||||
BCS FORCPY
|
||||
REVCPY ; REVERSE DIRECTION COPY
|
||||
; CLC
|
||||
LDA ESTKL,X
|
||||
ADC DSTL
|
||||
STA DSTL
|
||||
LDA ESTKH,X
|
||||
ADC DSTH
|
||||
STA DSTH
|
||||
CLC
|
||||
LDA ESTKL,X
|
||||
ADC SRCL
|
||||
STA SRCL
|
||||
LDA ESTKH,X
|
||||
ADC SRCH
|
||||
STA SRCH
|
||||
INC ESTKH,X
|
||||
REVCPYLP
|
||||
LDA DSTL
|
||||
BNE +
|
||||
DEC DSTH
|
||||
+ DEC DSTL
|
||||
LDA SRCL
|
||||
BNE +
|
||||
DEC SRCH
|
||||
+ DEC SRCL
|
||||
LDA (SRC),Y
|
||||
INC ESTKH-2,X
|
||||
LDY #$00
|
||||
FORCPYLP LDA (SRC),Y
|
||||
STA (DST),Y
|
||||
DEC ESTKL,X
|
||||
BNE REVCPYLP
|
||||
DEC ESTKH,X
|
||||
BNE REVCPYLP
|
||||
BEQ CPYMEX
|
||||
FORCPY INC ESTKH,X
|
||||
FORCPYLP
|
||||
LDA (SRC),Y
|
||||
STA (DST),Y
|
||||
INC DSTL
|
||||
INY
|
||||
BNE +
|
||||
INC DSTH
|
||||
+ INC SRCL
|
||||
BNE +
|
||||
INC SRCH
|
||||
+ DEC ESTKL,X
|
||||
+ DEC ESTKL-2,X
|
||||
BNE FORCPYLP
|
||||
DEC ESTKH,X
|
||||
DEC ESTKH-2,X
|
||||
BNE FORCPYLP
|
||||
CPYMEX INX
|
||||
INX
|
||||
RTS
|
||||
;
|
||||
; REVERSE COPY
|
||||
;
|
||||
REVCPY ;CLC
|
||||
LDA ESTKL-2,X
|
||||
ADC ESTKL,X
|
||||
STA DSTL
|
||||
LDA ESTKH-2,X
|
||||
ADC ESTKH,X
|
||||
STA DSTH
|
||||
CLC
|
||||
LDA ESTKL-2,X
|
||||
ADC ESTKL-1,X
|
||||
STA SRCL
|
||||
LDA ESTKH-2,X
|
||||
ADC ESTKH-1,X
|
||||
STA SRCH
|
||||
INC ESTKH-2,X
|
||||
DEC DSTH
|
||||
DEC SRCH
|
||||
LDY #$FF
|
||||
REVCPYLP LDA (SRC),Y
|
||||
STA (DST),Y
|
||||
DEY
|
||||
BNE +
|
||||
DEC DSTH
|
||||
DEC SRCH
|
||||
+ DEC ESTKL-2,X
|
||||
BNE REVCPYLP
|
||||
DEC ESTKH-2,X
|
||||
BNE REVCPYLP
|
||||
CPYMEX RTS
|
||||
end
|
||||
;
|
||||
; COPY FROM MAIN MEM TO AUX MEM.
|
||||
;
|
||||
; MEMXCPY(DIR, DST, SRC, SIZE)
|
||||
; DIR = 0 : COPY FROM MAIN TO AUX
|
||||
; DIR = 1 : COPY FROM AUX TO MAIN
|
||||
; MEMXCPY(DST, SRC, SIZE)
|
||||
;
|
||||
asm memxcpy
|
||||
LDA ESTKL+1,X
|
||||
@ -330,14 +275,24 @@ asm memxcpy
|
||||
STA $43
|
||||
STX ESP
|
||||
BIT ROMEN
|
||||
LDA #$00
|
||||
CMP ESTKL+3,X
|
||||
SEC
|
||||
JSR $C311
|
||||
BIT LCRDEN+LCBNK2
|
||||
LDX ESP
|
||||
INX
|
||||
INX
|
||||
INX
|
||||
RTS
|
||||
end
|
||||
;
|
||||
; HOME
|
||||
;
|
||||
asm home
|
||||
STX ESP
|
||||
BIT ROMEN
|
||||
JSR $FC58
|
||||
BIT LCRDEN+LCBNK2
|
||||
LDX ESP
|
||||
DEX
|
||||
RTS
|
||||
end
|
||||
;
|
||||
@ -345,7 +300,17 @@ end
|
||||
; VIEWPORT(LEFT, TOP, WIDTH, HEIGHT)
|
||||
;
|
||||
asm viewport
|
||||
LDA ESTKL+3,X
|
||||
LDA ESTKL+1,X
|
||||
BNE +
|
||||
LDA ESTKL,X
|
||||
BNE +
|
||||
STA ESTKL+3,X
|
||||
STA ESTKL+2,X
|
||||
LDA #40
|
||||
STA ESTKL+1,X
|
||||
LDA #24
|
||||
STA ESTKL,X
|
||||
+ LDA ESTKL+3,X
|
||||
STA $20
|
||||
LDA ESTKL+1,X
|
||||
STA $21
|
||||
@ -386,19 +351,42 @@ VTAB STX ESP
|
||||
INX
|
||||
RTS
|
||||
end
|
||||
asm crout
|
||||
DEX
|
||||
LDA #$8D
|
||||
STA ESTKL,X
|
||||
; FALL THROUGH TO COUT
|
||||
end
|
||||
;
|
||||
; CHAR OUT
|
||||
; COUT(CHAR)
|
||||
;
|
||||
asm cout
|
||||
LDA ESTKL,X
|
||||
ORA #$80
|
||||
BIT $BF98
|
||||
BMI +
|
||||
JSR TOUPR
|
||||
+ ORA #$80
|
||||
BIT ROMEN
|
||||
JSR $FDED
|
||||
BIT LCRDEN+LCBNK2
|
||||
RTS
|
||||
end
|
||||
;
|
||||
; CHAR IN
|
||||
; RDKEY()
|
||||
;
|
||||
asm cin
|
||||
BIT ROMEN
|
||||
JSR $FD0C
|
||||
BIT LCRDEN+LCBNK2
|
||||
DEX
|
||||
LDY #$00
|
||||
STA ESTKL,X
|
||||
STY ESTKH,X
|
||||
RTS
|
||||
end
|
||||
;
|
||||
; PRINT STRING
|
||||
; PRSTR(STR)
|
||||
;
|
||||
@ -410,18 +398,21 @@ asm prstr
|
||||
STA SRCH
|
||||
STY ESTKH,X
|
||||
LDA (SRC),Y
|
||||
STA ESTKL,X
|
||||
BEQ +
|
||||
STA TMP
|
||||
BEQ ++
|
||||
BIT ROMEN
|
||||
- INY
|
||||
LDA (SRC),Y
|
||||
ORA #$80
|
||||
BIT $BF98
|
||||
BMI +
|
||||
JSR TOUPR
|
||||
+ ORA #$80
|
||||
JSR $FDED
|
||||
TYA
|
||||
CMP ESTKL,X
|
||||
CMP TMP
|
||||
BNE -
|
||||
BIT LCRDEN+LCBNK2
|
||||
+ RTS
|
||||
++ RTS
|
||||
end
|
||||
;
|
||||
; PRINT BYTE
|
||||
@ -727,22 +718,6 @@ asm lookuptbl
|
||||
BNE -
|
||||
end
|
||||
;
|
||||
; CHAR IN
|
||||
; RDKEY()
|
||||
;
|
||||
def cin
|
||||
return romcall(0, 0, 0, 0, $FD0C).acc
|
||||
end
|
||||
;
|
||||
; HOME
|
||||
;
|
||||
def home
|
||||
return romcall(0, 0, 0, 0, $FC58)
|
||||
end
|
||||
def crout
|
||||
return cout($0D)
|
||||
end
|
||||
;
|
||||
; ProDOS routines
|
||||
;
|
||||
def getpfx(path)
|
||||
@ -950,13 +925,20 @@ def addmod(mod, addr)
|
||||
return addtbl(modtosym(mod, @dci), addr, @lastsym)
|
||||
end
|
||||
def lookupextern(esd, index)
|
||||
word sym
|
||||
word sym, addr
|
||||
byte str[16]
|
||||
while ^esd
|
||||
sym = esd
|
||||
esd = esd + dcitos(esd, @str)
|
||||
if (esd).0 & $10 and (esd).1 == index
|
||||
return lookupsym(sym)
|
||||
addr = lookupsym(sym)
|
||||
if !addr
|
||||
lerr = $81
|
||||
cout('?')
|
||||
prstr(@str)
|
||||
crout
|
||||
fin
|
||||
return addr
|
||||
fin
|
||||
esd = esd + 3
|
||||
loop
|
||||
@ -992,6 +974,7 @@ def loadmod(mod)
|
||||
word moddep, rld, esd, sym
|
||||
byte defbank, str[16], filename[64]
|
||||
byte header[128]
|
||||
lerr = 0
|
||||
;
|
||||
; Read the RELocatable module header (first 128 bytes)
|
||||
;
|
||||
@ -1058,8 +1041,7 @@ def loadmod(mod)
|
||||
until rdlen <= 0
|
||||
close(refnum)
|
||||
;
|
||||
|
||||
; Apply all fixups and symbol import/export.
|
||||
; Apply all fixups and symbol import/export.
|
||||
;
|
||||
modfix = modaddr - modfix
|
||||
bytecode = defofst + modfix - MODADDR
|
||||
@ -1143,7 +1125,7 @@ def loadmod(mod)
|
||||
;
|
||||
; Move bytecode to AUX bank.
|
||||
;
|
||||
memxcpy(0, defaddr, bytecode, modsize - (bytecode - modaddr))
|
||||
memxcpy(defaddr, bytecode, modsize - (bytecode - modaddr))
|
||||
fin
|
||||
;
|
||||
; Free up the end-of-module in main memory.
|
||||
@ -1153,6 +1135,9 @@ def loadmod(mod)
|
||||
perr = perr | 0x100
|
||||
return -perr
|
||||
fin
|
||||
if lerr
|
||||
return -lerr
|
||||
fin
|
||||
;
|
||||
; Call init routine if it exists.
|
||||
;
|
||||
|
@ -1,6 +1,8 @@
|
||||
;**********************************************************
|
||||
;*
|
||||
;* SYSTEM ROUTINES AND LOCATIONS
|
||||
;* APPLE ][ 64K/128K PLASMA INTERPETER
|
||||
;*
|
||||
;* SYSTEM ROUTINES AND LOCATIONS
|
||||
;*
|
||||
;**********************************************************
|
||||
;*
|
||||
|
@ -1,9 +1,9 @@
|
||||
import stdlib
|
||||
predef cls, gotoxy, viewport, putc, puts, getc, gets, syscall, romcall
|
||||
predef cls, gotoxy, viewport, putc, puts, getc, gets, syscall
|
||||
predef heapmark, heapallocallign, heapalloc, heaprelease, heapavail
|
||||
predef memset, memcpy, memxcpy
|
||||
predef memset, memcpy
|
||||
predef isugt, isuge, isult, isule
|
||||
predef exec
|
||||
predef load, exec
|
||||
;
|
||||
; System flags: memory allocator screen holes.
|
||||
;
|
||||
|
Loading…
x
Reference in New Issue
Block a user