diff --git a/src/inc/cmdsys.plh b/src/inc/cmdsys.plh index 59ad45d..e8d6599 100644 --- a/src/inc/cmdsys.plh +++ b/src/inc/cmdsys.plh @@ -36,10 +36,10 @@ import cmdsys // // CMD exported functions // - predef putc, putln, puts, getc, gets - predef call, syscall - predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail - predef memset, memcpy - predef isugt, isuge, isult, isule - predef modload, modexec, modaddr + predef putc(c)#0, putln()#0, puts(s)#0, getc()#1, gets(p)#1 + predef call(addr,areg,xreg,yreg,status)#1, syscall(cmd,params)#1 + predef heapmark()#1, heapallocalign(size, pow2, freeaddr), heapalloc(size)#1, heaprelease(newheap)#1, heapavail()#1 + predef memset(addr,value,size)#0, memcpy(dst,src,size)#0 + predef isugt(a,b)#1, isuge(a,b)#1, isult(a,b)#1, isule(a,b)#1 + predef modload(mod)#1, modexec(modfile)#1, modaddr(str)#1 end diff --git a/src/inc/testlib.plh b/src/inc/testlib.plh index 66710fa..11f5abd 100644 --- a/src/inc/testlib.plh +++ b/src/inc/testlib.plh @@ -1,6 +1,6 @@ import testlib - predef puti - word print + predef puti(i)#0 + word print(s)#0 const dec = 0 const hex = 2 const newln = 4 diff --git a/src/makefile b/src/makefile index e82e8be..d1f53bb 100755 --- a/src/makefile +++ b/src/makefile @@ -83,20 +83,20 @@ $(PLVM): vmsrc/plvm.c cc vmsrc/plvm.c -o $(PLVM) vmsrc/a1cmd.a: vmsrc/a1cmd.pla $(PLASM) - ./$(PLASM) -AO < vmsrc/a1cmd.pla > vmsrc/a1cmd.a + ./$(PLASM) -AOW < vmsrc/a1cmd.pla > vmsrc/a1cmd.a $(PLVM01): vmsrc/plvm01.s vmsrc/a1cmd.a acme -o $(PLVM01) -l vmsrc/plvm01.sym vmsrc/plvm01.s $(CMD): vmsrc/cmd.pla vmsrc/cmdstub.s $(PLVM02) $(PLASM) - ./$(PLASM) -AO < vmsrc/cmd.pla > vmsrc/cmd.a + ./$(PLASM) -AOW < vmsrc/cmd.pla > vmsrc/cmd.a acme --setpc 8192 -o $(CMD) vmsrc/cmdstub.s $(PLVM02): vmsrc/plvm02.s acme -o $(PLVM02) -l vmsrc/plvm02.sym vmsrc/plvm02.s vmsrc/soscmd.a: vmsrc/soscmd.pla $(PLASM) - ./$(PLASM) -AO < vmsrc/soscmd.pla > vmsrc/soscmd.a + ./$(PLASM) -AOW < vmsrc/soscmd.pla > vmsrc/soscmd.a $(PLVM03): vmsrc/plvm03.s vmsrc/soscmd.a acme -o $(PLVM03) -l vmsrc/plvm03.sym vmsrc/plvm03.s @@ -105,9 +105,9 @@ $(PLVM03): vmsrc/plvm03.s vmsrc/soscmd.a # Sample code # test: samplesrc/test.pla samplesrc/testlib.pla $(PLVM) $(PLASM) - ./$(PLASM) -AMO < samplesrc/test.pla > samplesrc/test.a + ./$(PLASM) -AMOW < samplesrc/test.pla > samplesrc/test.a acme --setpc 4094 -o $(TEST) samplesrc/test.a - ./$(PLASM) -AMO < samplesrc/testlib.pla > samplesrc/testlib.a + ./$(PLASM) -AMOW < samplesrc/testlib.pla > samplesrc/testlib.a acme --setpc 4094 -o $(TESTLIB) samplesrc/testlib.a ./$(PLVM) TEST diff --git a/src/samplesrc/test.pla b/src/samplesrc/test.pla index 0de4a05..f07cab7 100755 --- a/src/samplesrc/test.pla +++ b/src/samplesrc/test.pla @@ -35,20 +35,20 @@ word ptr // // Define functions. // -def tens(start) +def tens(start)#0 word i, pptr i = start pptr = @print repeat - print:hex(i) + print:hex(i)#0 print:str(" ") - pptr=>dec(i) + pptr=>dec(i)#0 print:newln() i = i / 10 until i == 0 end -def ascii +def ascii#0 byte i i = 32 while i < 128 @@ -56,7 +56,7 @@ def ascii i = i + 1 loop end -def nums(range) +def nums(range)#0 word i byte j for i = range downto -range step range/10 @@ -81,7 +81,7 @@ def printfunc(a, b, lambda)#0 puti(lambda(a,b)) putln end -export def main(range) +export def main(range)#0 byte a word lambda @@ -124,6 +124,7 @@ end def dummy(zz)#0 puts("dummy func"); putln + return 0 end puti(array[0]);putc(' ') diff --git a/src/samplesrc/testlib.pla b/src/samplesrc/testlib.pla index ebaca9f..2a50e73 100755 --- a/src/samplesrc/testlib.pla +++ b/src/samplesrc/testlib.pla @@ -5,21 +5,21 @@ include "inc/cmdsys.plh" // // Module data. // -predef puti, puth +predef puti(i)#0, puth(h)#0 export word print[] = @puti, @puth, @putln, @puts, @putc byte valstr[] = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' byte loadstr[] = "testlib loaded!" // // Define functions. // -def puth(h) +def puth(h)#0 putc('$') putc(valstr[(h >> 12) & $0F]) putc(valstr[(h >> 8) & $0F]) putc(valstr[(h >> 4) & $0F]) putc(valstr[ h & $0F]) end -export def puti(i) +export def puti(i)#0 if i < 0; putc('-'); i = -i; fin if i < 10 putc(i + '0') diff --git a/src/vmsrc/cmd.pla b/src/vmsrc/cmd.pla index 14c9201..efbc46a 100755 --- a/src/vmsrc/cmd.pla +++ b/src/vmsrc/cmd.pla @@ -24,12 +24,12 @@ const modinitkeep = $4000 // // Pedefined functions. // -predef syscall, call -predef crout, cout, prstr, cin, rdstr -predef markheap, allocheap, allocalignheap, releaseheap, availheap -predef memset, memcpy -predef uword_isgt, uword_isge, uword_islt, uword_isle -predef loadmod, execmod, lookupstrmod +predef syscall(cmd,params)#1, call(addr,areg,xreg,yreg,status)#1 +predef crout()#0, cout(c)#0, prstr(s)#0, cin()#1, rdstr(p)#1 +predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr), releaseheap(newheap)#1, availheap()#1 +predef memset(addr,value,size)#0, memcpy(dst,src,size)#0 +predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1 +predef loadmod(mod)#1, execmod(modfile)#1, lookupstrmod(str)#1 // // System variable. // @@ -100,7 +100,7 @@ word syslibsym = @exports // CALL PRODOS // SYSCALL(CMD, PARAMS) // -asm syscall +asm syscall(cmd,params)#1 LDA ESTKL,X LDY ESTKH,X STA PARAMS @@ -120,7 +120,7 @@ end // CALL 6502 ROUTINE // CALL(ADDR, AREG, XREG, YREG, STATUS) // -asm call +asm call(addr,areg,xreg,yreg,sstatus)#1 REGVALS = SRC PHP LDA ESTKL+4,X @@ -137,7 +137,7 @@ REGVALS = SRC INX INX INX - INX + INX STX ESP TAX PLA @@ -163,7 +163,7 @@ end // // CALL LOADED SYSTEM PROGRAM // -asm exec +asm exec()#0 LDX #$00 STX IFPL LDA #$BF @@ -177,7 +177,7 @@ end // // EXIT // -asm reboot +asm reboot()#0 BIT ROMEN DEC $03F4 ; INVALIDATE POWER-UP BYTE JMP ($FFFC) ; RESET @@ -187,7 +187,7 @@ end // MEMSET(ADDR, VALUE, SIZE) // With optimizations from Peter Ferrie // -asm memset +asm memset(addr,value,size)#0 LDA ESTKL+2,X STA DSTL LDA ESTKH+2,X @@ -214,6 +214,7 @@ SETMLPH STA (DST),Y ++ DEC ESTKH,X BNE - SETMEX INX + INX INX RTS end @@ -221,31 +222,32 @@ end // COPY MEMORY // MEMCPY(DSTADDR, SRCADDR, SIZE) // -asm memcpy +asm memcpy(dst,src,size)#0 INX INX - LDA ESTKL-2,X - ORA ESTKH-2,X + INX + LDA ESTKL-3,X + ORA ESTKH-3,X BEQ CPYMEX - LDA ESTKL-1,X - CMP ESTKL,X - LDA ESTKH-1,X - SBC ESTKH,X + LDA ESTKL-2,X + CMP ESTKL-1,X + LDA ESTKH-2,X + SBC ESTKH-1,X BCC REVCPY ; ; FORWARD COPY ; - LDA ESTKL,X - STA DSTL - LDA ESTKH,X - STA DSTH LDA ESTKL-1,X - STA SRCL + STA DSTL LDA ESTKH-1,X + STA DSTH + LDA ESTKL-2,X + STA SRCL + LDA ESTKH-2,X STA SRCH - LDY ESTKL-2,X + LDY ESTKL-3,X BEQ FORCPYLP - INC ESTKH-2,X + INC ESTKH-3,X LDY #$00 FORCPYLP LDA (SRC),Y STA (DST),Y @@ -253,34 +255,34 @@ FORCPYLP LDA (SRC),Y BNE + INC DSTH INC SRCH -+ DEC ESTKL-2,X ++ DEC ESTKL-3,X BNE FORCPYLP - DEC ESTKH-2,X + DEC ESTKH-3,X BNE FORCPYLP RTS ; ; REVERSE COPY ; REVCPY ;CLC - LDA ESTKL-2,X - ADC ESTKL,X + LDA ESTKL-3,X + ADC ESTKL-1,X STA DSTL - LDA ESTKH-2,X - ADC ESTKH,X + LDA ESTKH-3,X + ADC ESTKH-1,X STA DSTH CLC - LDA ESTKL-2,X - ADC ESTKL-1,X + LDA ESTKL-3,X + ADC ESTKL-2,X STA SRCL - LDA ESTKH-2,X - ADC ESTKH-1,X + LDA ESTKH-3,X + ADC ESTKH-2,X STA SRCH DEC DSTH DEC SRCH LDY #$FF - LDA ESTKL-2,X + LDA ESTKL-3,X BEQ REVCPYLP - INC ESTKH-2,X + INC ESTKH-3,X REVCPYLP LDA (SRC),Y STA (DST),Y DEY @@ -288,9 +290,9 @@ REVCPYLP LDA (SRC),Y BNE + DEC DSTH DEC SRCH -+ DEC ESTKL-2,X ++ DEC ESTKL-3,X BNE REVCPYLP - DEC ESTKH-2,X + DEC ESTKH-3,X BNE REVCPYLP CPYMEX RTS end @@ -299,7 +301,7 @@ end // // MEMXCPY(DST, SRC, SIZE) // -asm memxcpy +asm memxcpy(dst,src,size)#0 LDA ESTKL+1,X STA $3C CLC @@ -321,9 +323,10 @@ asm memxcpy LDX ESP INX INX + INX RTS end -asm crout +asm crout()#0 DEX LDA #$0D BNE + @@ -333,7 +336,7 @@ end // CHAR OUT // COUT(CHAR) // -asm cout +asm cout(c)#0 LDA ESTKL,X BIT $BF98 BMI + @@ -342,13 +345,14 @@ asm cout BIT ROMEN JSR $FDED BIT LCRDEN+LCBNK2 + INX RTS end // // CHAR IN // RDKEY() // -asm cin +asm cin()#1 BIT ROMEN JSR $FD0C BIT LCRDEN+LCBNK2 @@ -363,7 +367,7 @@ end // PRINT STRING // PRSTR(STR) // -asm prstr +asm prstr(s)#0 LDY #$00 LDA ESTKL,X STA SRCL @@ -383,24 +387,26 @@ asm prstr CPY TMP BNE - BIT LCRDEN+LCBNK2 -++ RTS +++ INX + RTS end // // PRINT BYTE // -asm prbyte +asm prbyte(b)#0 LDA ESTKL,X STX ESP BIT ROMEN JSR $FDDA LDX ESP BIT LCRDEN+LCBNK2 + INX RTS end // // PRINT WORD // -asm prword +asm prword(w)#0 STX ESP TXA TAY @@ -410,13 +416,14 @@ asm prword JSR $F941 LDX ESP BIT LCRDEN+LCBNK2 + INX RTS end // // READ STRING // STR = RDSTR(PROMPTCHAR) // -asm rdstr +asm rdstr(p)#1 LDA ESTKL,X STA $33 STX ESP @@ -436,7 +443,7 @@ asm rdstr BIT LCRDEN+LCBNK2 RTS end -asm uword_isge +asm uword_isge(a,b)#1 LDA ESTKL+1,X CMP ESTKL,X LDA ESTKH+1,X @@ -449,7 +456,7 @@ asm uword_isge INX RTS end -asm uword_isle +asm uword_isle(a,b)#1 LDA ESTKL,X CMP ESTKL+1,X LDA ESTKH,X @@ -462,7 +469,7 @@ asm uword_isle INX RTS end -asm uword_isgt +asm uword_isgt(a,b)#1 LDA ESTKL,X CMP ESTKL+1,X LDA ESTKH,X @@ -474,7 +481,7 @@ asm uword_isgt INX RTS end -asm uword_islt +asm uword_islt(a,b)#1 LDA ESTKL+1,X CMP ESTKL,X LDA ESTKH+1,X @@ -503,7 +510,7 @@ end // ^str = len // return len //end -asm dcitos +asm dcitos(dci, str)#1 LDA ESTKL,X STA DSTL LDA ESTKH,X @@ -543,7 +550,7 @@ end // loop // return ^str //end -asm stodci +asm stodci(str,dci)#1 LDA ESTKL,X STA DSTL LDA ESTKH,X @@ -571,7 +578,7 @@ asm stodci STY ESTKH,X RTS end -asm toupper +asm toupper(c)#1 LDA ESTKL,X TOUPR AND #$7F CMP #'a' @@ -598,7 +605,7 @@ end // until !(c & $80) // return dci //end -asm modtosym +asm modtosym(mod,dci)#1 LDA ESTKL+1,X STA SRCL LDA ESTKH+1,X @@ -639,7 +646,7 @@ end // tbl = tbl + 3 // loop // return 0 -asm lookuptbl +asm lookuptbl(dci, tbl)#1 LDA ESTKL,X STA DSTL LDA ESTKH,X @@ -684,7 +691,7 @@ end // // ProDOS routines // -def getpfx(path) +def getpfx(path)#1 byte params[3] ^path = 0 @@ -693,7 +700,7 @@ def getpfx(path) perr = syscall($C7, @params) return path end -def setpfx(path) +def setpfx(path)#1 byte params[3] params.0 = 1 @@ -701,7 +708,7 @@ def setpfx(path) perr = syscall($C6, @params) return path end -def open(path, buff) +def open(path, buff)#1 byte params[6] params.0 = 3 @@ -711,7 +718,7 @@ def open(path, buff) perr = syscall($C8, @params) return params.5 end -def close(refnum) +def close(refnum)#1 byte params[2] params.0 = 1 @@ -719,7 +726,7 @@ def close(refnum) perr = syscall($CC, @params) return perr end -def read(refnum, buff, len) +def read(refnum, buff, len)#1 byte params[8] params.0 = 4 @@ -733,11 +740,11 @@ end // // Heap routines. // -def availheap +def availheap()#1 byte fp return @fp - heap end -def allocheap(size) +def allocheap(size)#1 word addr addr = heap heap = heap + size @@ -771,14 +778,14 @@ def allocalignheap(size, pow2, freeaddr) fin return addr end -def markheap +def markheap()#1 return heap end -def releaseheap(newheap) +def releaseheap(newheap)#1 heap = newheap return @newheap - heap end -def allocxheap(size) +def allocxheap(size)#1 word xaddr xaddr = xheap xheap = xheap + size @@ -814,10 +821,10 @@ end // // Symbol table routines. // -def lookupsym(sym) +def lookupsym(sym)#1 return lookuptbl(sym, symtbl) end -def addsym(sym, addr) +def addsym(sym, addr)#0 while ^sym & $80 ^lastsym = ^sym lastsym = lastsym + 1 @@ -831,20 +838,20 @@ end // // Module routines. // -def lookupmod(mod) +def lookupmod(mod)#1 byte dci[17] return lookuptbl(modtosym(mod, @dci), symtbl) end -def lookupstrmod(str) +def lookupstrmod(str)#1 byte mod[17] stodci(str, @mod) return lookupmod(@mod) end -def addmod(mod, addr) +def addmod(mod, addr)#0 byte dci[17] - return addsym(modtosym(mod, @dci), addr) + addsym(modtosym(mod, @dci), addr) end -def lookupextern(esd, index) +def lookupextern(esd, index)#1 word sym, addr byte str[16] while ^esd @@ -864,7 +871,7 @@ def lookupextern(esd, index) loop return 0 end -def adddef(bank, addr, deflast) +def adddef(bank, addr, deflast)#1 word defentry defentry = *deflast *deflast = defentry + 5 @@ -878,7 +885,7 @@ def adddef(bank, addr, deflast) defentry->5 = 0 // NULL out next entry return defentry end -def lookupdef(addr, deftbl) +def lookupdef(addr, deftbl)#1 while deftbl->0 == $20 if deftbl=>3 == addr return deftbl @@ -887,7 +894,7 @@ def lookupdef(addr, deftbl) loop return 0 end -def loadmod(mod) +def loadmod(mod)#1 word refnum, rdlen, modsize, bytecode, defofst, defcnt, init, fixup word addr, defaddr, modaddr, modfix, modend word deftbl, deflast @@ -1087,7 +1094,7 @@ end // // Command mode // -def volumes +def volumes()#0 byte params[4] word strbuf byte i @@ -1107,7 +1114,7 @@ def volumes strbuf = strbuf + 16 next end -def catalog(optpath) +def catalog(optpath)#1 byte path[64] byte refnum byte firstblk @@ -1168,14 +1175,14 @@ def catalog(optpath) crout() return 0 end -def stripchars(strptr) +def stripchars(strptr)#1 while ^strptr and ^(strptr + 1) > ' ' memcpy(strptr + 1, strptr + 2, ^strptr) ^strptr = ^strptr - 1 loop return ^strptr end -def stripspaces(strptr) +def stripspaces(strptr)#0 while ^strptr and ^(strptr + ^strptr) <= ' ' ^strptr = ^strptr - 1 loop @@ -1184,7 +1191,7 @@ def stripspaces(strptr) ^strptr = ^strptr - 1 loop end -def striptrail(strptr) +def striptrail(strptr)#1 byte i for i = 1 to ^strptr @@ -1195,7 +1202,7 @@ def striptrail(strptr) next return strptr end -def parsecmd(strptr) +def parsecmd(strptr)#1 byte cmd cmd = 0 @@ -1208,7 +1215,7 @@ def parsecmd(strptr) stripspaces(strptr) return cmd end -def resetmemfiles +def resetmemfiles()#0 // // Close all files // @@ -1221,7 +1228,7 @@ def resetmemfiles ^$BF58 = $CF ^$BF6F = $01 end -def execsys(sysfile) +def execsys(sysfile)#0 byte refnum word len @@ -1246,7 +1253,7 @@ def execsys(sysfile) fin fin end -def execmod(modfile) +def execmod(modfile)#1 byte moddci[17] word saveheap, savexheap, savesym, saveflags diff --git a/src/vmsrc/plvm.c b/src/vmsrc/plvm.c index 62356d6..d009266 100755 --- a/src/vmsrc/plvm.c +++ b/src/vmsrc/plvm.c @@ -457,12 +457,10 @@ void call(uword pc) if (c == 0x0D) c = '\n'; putchar(c); - PUSH(0); break; case 4: // LIBRARY STDLIB::PUTS s = POP; i = mem_data[s++]; - PUSH(i); while (i--) { c = mem_data[s++]; @@ -479,7 +477,6 @@ void call(uword pc) c = '\n'; putchar(c); } - PUSH(0); break; case 6: // LIBRARY STDLIB::GETC PUSH(getchar()); @@ -495,7 +492,6 @@ void call(uword pc) case 8: // LIBRARY STDLIB::PUTNL putchar('\n'); fflush(stdout); - PUSH(0); break; default: printf("\nBad call code:$%02X\n", mem_data[pc - 1]);