From 38b88585781b67f35d37c2181b2093bcd57d04cb Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 6 Jun 2014 19:37:53 -0700 Subject: [PATCH] Update stdlib, optimize memcpy, make unresolved externals generate error --- PLASMA/src/cmd.pla | 283 ++++++++++++++++++++---------------------- PLASMA/src/plvm02.s | 4 +- PLASMA/src/stdlib.plh | 6 +- 3 files changed, 140 insertions(+), 153 deletions(-) diff --git a/PLASMA/src/cmd.pla b/PLASMA/src/cmd.pla index a8beedf4..2d14a910 100644 --- a/PLASMA/src/cmd.pla +++ b/PLASMA/src/cmd.pla @@ -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 - 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. ; diff --git a/PLASMA/src/plvm02.s b/PLASMA/src/plvm02.s index 58ee6ca1..f5afd546 100644 --- a/PLASMA/src/plvm02.s +++ b/PLASMA/src/plvm02.s @@ -1,6 +1,8 @@ ;********************************************************** ;* -;* SYSTEM ROUTINES AND LOCATIONS +;* APPLE ][ 64K/128K PLASMA INTERPETER +;* +;* SYSTEM ROUTINES AND LOCATIONS ;* ;********************************************************** ;* diff --git a/PLASMA/src/stdlib.plh b/PLASMA/src/stdlib.plh index 2307526b..f898d6ca 100644 --- a/PLASMA/src/stdlib.plh +++ b/PLASMA/src/stdlib.plh @@ -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. ;