Update stdlib, optimize memcpy, make unresolved externals generate error

This commit is contained in:
David Schmenk 2014-06-06 19:37:53 -07:00
parent d8cc70dbc9
commit 38b8858578
3 changed files with 140 additions and 153 deletions

View File

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

View File

@ -1,6 +1,8 @@
;**********************************************************
;*
;* SYSTEM ROUTINES AND LOCATIONS
;* APPLE ][ 64K/128K PLASMA INTERPETER
;*
;* SYSTEM ROUTINES AND LOCATIONS
;*
;**********************************************************
;*

View File

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