diff --git a/src/vmsrc/a1cmd.pla b/src/vmsrc/a1cmd.pla index ed61cb1..c096631 100755 --- a/src/vmsrc/a1cmd.pla +++ b/src/vmsrc/a1cmd.pla @@ -30,12 +30,12 @@ const CFFAEntryPtr = $0B // // Pedefined functions. // -predef crout, cout, prstr, cin, rdstr -predef syscall, call -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)#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 variables. // @@ -117,7 +117,7 @@ word syslibsym = @exports // CALL CFFA1 API ENTRYPOINT // SYSCALL(CMD) // -asm syscall +asm syscall(cmd)#1 LDA ESTKL,X STX ESP TAX @@ -132,7 +132,7 @@ end // CALL 6502 ROUTINE // CALL(ADDR, AREG, XREG, YREG, STATUS) // -asm call +asm call(addr,areg,xreg,yreg,sstatus)#1 PHP LDA ESTKL+4,X STA CALL6502+1 @@ -172,7 +172,7 @@ end // // QUIT TO MONITOR // -asm quit +asm quit()#0 JMP $9000 end // @@ -180,7 +180,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 @@ -207,6 +207,7 @@ SETMLPH STA (DST),Y ++ DEC ESTKH,X BNE - SETMEX INX + INX INX RTS end @@ -214,31 +215,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 @@ -246,34 +248,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 + LDA ESTKL-3,X ADC ESTKL,X STA DSTL - LDA ESTKH-2,X + LDA ESTKH-3,X ADC ESTKH,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 @@ -281,16 +283,16 @@ 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 // // Unsigned word comparisons. // -asm uword_isge +asm uword_isge(a,b)#1 LDA ESTKL+1,X CMP ESTKL,X LDA ESTKH+1,X @@ -303,7 +305,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 @@ -316,7 +318,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 @@ -328,7 +330,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 @@ -343,7 +345,7 @@ end // // Addresses of internal routines. // -asm interp +asm interp()#1 DEX LDA #> 4) & $0F]) - return cout(hexchar[v & $0F]) + cout(hexchar[v & $0F]) end -def prword(v) +def prword(v)#0 prbyte(v >> 8) - return prbyte(v) + prbyte(v) end // // CFFA1 routines @@ -647,12 +649,12 @@ end // perr = syscall($12) // return *CFFAEntryPtr //end -def finddirentry(filename) +def finddirentry(filename)#1 *CFFAFileName = filename perr = syscall($14) return *CFFAEntryPtr end -def readfile(filename, buffer) +def readfile(filename, buffer)#1 *CFFADest = buffer *CFFAFileName = filename perr = syscall($22) @@ -661,11 +663,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 @@ -674,7 +676,7 @@ def allocheap(size) fin return addr end -def allocalignheap(size, pow2, freeaddr) +def allocalignheap(size, pow2, freeaddr)#1 word align, addr if freeaddr *freeaddr = heap @@ -687,20 +689,20 @@ 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 // // 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 @@ -714,20 +716,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 @@ -747,7 +749,7 @@ def lookupextern(esd, index) loop return 0 end -def adddef(addr, deflast) +def adddef(addr, deflast)#1 word defentry defentry = *deflast *deflast = defentry + 5 @@ -757,7 +759,7 @@ def adddef(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 @@ -766,7 +768,7 @@ def lookupdef(addr, deftbl) loop return 0 end -def loadmod(mod) +def loadmod(mod)#1 word rdlen, modsize, bytecode, defofst, defcnt, init, fixup word addr, modaddr, modfix, modend word deftbl, deflast @@ -929,14 +931,14 @@ end // // Command mode // -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 @@ -945,7 +947,7 @@ def stripspaces(strptr) ^strptr = ^strptr - 1 loop end -def striptrail(strptr) +def striptrail(strptr)#0 byte i for i = 1 to ^strptr @@ -955,7 +957,7 @@ def striptrail(strptr) fin next end -def parsecmd(strptr) +def parsecmd(strptr)#1 byte cmd cmd = 0 @@ -968,7 +970,7 @@ def parsecmd(strptr) stripspaces(strptr) return cmd end -def execmod(modfile) +def execmod(modfile)#1 byte moddci[17] word saveheap, savesym, saveflags diff --git a/src/vmsrc/soscmd.pla b/src/vmsrc/soscmd.pla index 0767d88..007d218 100755 --- a/src/vmsrc/soscmd.pla +++ b/src/vmsrc/soscmd.pla @@ -25,12 +25,12 @@ const O_READ_WRITE = 3 // // Pedefined functions. // -predef crout, cout, prstr, cin, rdstr -predef syscall, call -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 variables. // @@ -113,7 +113,7 @@ word syslibsym = @exports // CALL SOS // SYSCALL(CMD, PARAMS) // -asm syscall +asm syscall(cmd,params)#1 LDA ESTKL,X LDY ESTKH,X STA PARAMS @@ -133,7 +133,7 @@ end // CALL 6502 ROUTINE // CALL(AREG, XREG, YREG, STATUS, ADDR) // -asm call +asm call(addr,areg,xreg,yreg,sstatus)#1 REGVALS = SRC PHP LDA ESTKL,X @@ -176,7 +176,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 @@ -203,6 +203,7 @@ SETMLPH STA (DST),Y ++ DEC ESTKH,X BNE - SETMEX INX + INX INX RTS end @@ -210,31 +211,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 + LDA ESTKL-2,X STA DSTL - LDA ESTKH,X + LDA ESTKH-2,X STA DSTH - LDA ESTKL-1,X + LDA ESTKL-2,X STA SRCL - LDA ESTKH-1,X + 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 @@ -242,34 +244,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 @@ -277,9 +279,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 @@ -288,7 +290,7 @@ end // // MEMXCPY(DSTSEG, SRC, SIZE) // -asm memxcpy +asm memxcpy(dst,src,size)#0 LDA ESTKL,X ORA ESTKH,X BEQ CPYXMEX @@ -320,6 +322,7 @@ CPYXLP LDA (SRC),Y LDA #$00 STA DSTX CPYXMEX INX + INX INX RTS end @@ -328,7 +331,7 @@ end // // XPOKEB(SEG, DST, BYTEVAL) // -asm xpokeb +asm xpokeb(seg, dst, byteval)#0 LDA ESTKL+1,X STA DSTL LDA ESTKH+1,X @@ -345,12 +348,13 @@ asm xpokeb STY DSTX INX INX + INX RTS end // // Unsigned word comparisons. // -asm uword_isge +asm uword_isge(a,b)#1 LDA ESTKL+1,X CMP ESTKL,X LDA ESTKH+1,X @@ -363,7 +367,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 @@ -376,7 +380,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 @@ -388,7 +392,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 @@ -403,7 +407,7 @@ end // // Addresses of internal routines. // -asm interp +asm interp()#1 DEX LDA #[^str] == $0D cout($0A) fin end -def rdstr(prompt) +def rdstr(prompt)#1 cout(prompt) ^heap = read(refcons, heap + 1, 128) if heap->[^heap] == $0D @@ -809,25 +813,25 @@ def rdstr(prompt) cout($0D) return heap end -def crout - return cout($0D) +def crout()#0 + cout($0D) end -def prbyte(v) +def prbyte(v)#0 cout(hexchar[(v >> 4) & $0F]) - return cout(hexchar[v & $0F]) + cout(hexchar[v & $0F]) end -def prword(v) +def prword(v)#0 prbyte(v >> 8) - return prbyte(v) + prbyte(v) 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 @@ -836,7 +840,7 @@ def allocheap(size) fin return addr end -def allocalignheap(size, pow2, freeaddr) +def allocalignheap(size, pow2, freeaddr)#1 word align, addr if freeaddr *freeaddr = heap @@ -849,20 +853,20 @@ 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 // // 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 xpokeb(symtbl.0, lastsym, ^sym) lastsym = lastsym + 1 @@ -877,20 +881,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 @@ -910,7 +914,7 @@ def lookupextern(esd, index) loop return 0 end -def adddef(ext, addr, deflast) +def adddef(ext, addr, deflast)#1 word defentry defentry = *deflast *deflast = defentry + 6 @@ -920,7 +924,7 @@ def adddef(ext, addr, deflast) defentry=>5 = ext // ext is byte, so this nulls 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 @@ -929,7 +933,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, codeseg @@ -1121,7 +1125,7 @@ end // // Command mode // -def volumes +def volumes()#0 byte info[11] byte devname[17] byte volname[17] @@ -1141,7 +1145,7 @@ def volumes next perr = 0 end -def catalog(optpath) +def catalog(optpath)#1 byte path[64] byte refnum byte firstblk @@ -1202,14 +1206,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 @@ -1218,7 +1222,7 @@ def stripspaces(strptr) ^strptr = ^strptr - 1 loop end -def striptrail(strptr) +def striptrail(strptr)#0 byte i for i = 1 to ^strptr @@ -1228,7 +1232,7 @@ def striptrail(strptr) fin next end -def parsecmd(strptr) +def parsecmd(strptr)#1 byte cmd cmd = 0 @@ -1241,7 +1245,7 @@ def parsecmd(strptr) stripspaces(strptr) return cmd end -def execmod(modfile) +def execmod(modfile)#1 byte moddci[17] word saveheap, savesym, saveflags