1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-10-18 07:24:16 +00:00

Add def prototypes for cmdsys library functions

This commit is contained in:
David Schmenk 2017-08-27 20:38:26 -07:00
parent 326482a2a0
commit 255061f75a
2 changed files with 179 additions and 173 deletions

View File

@ -30,12 +30,12 @@ const CFFAEntryPtr = $0B
// //
// Pedefined functions. // Pedefined functions.
// //
predef crout, cout, prstr, cin, rdstr predef syscall(cmd)#1, call(addr,areg,xreg,yreg,status)#1
predef syscall, call predef crout()#0, cout(c)#0, prstr(s)#0, cin()#1, rdstr(p)#1
predef markheap, allocheap, allocalignheap, releaseheap, availheap predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr), releaseheap(newheap)#1, availheap()#1
predef memset, memcpy predef memset(addr,value,size)#0, memcpy(dst,src,size)#0
predef uword_isgt, uword_isge, uword_islt, uword_isle predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1
predef loadmod, execmod, lookupstrmod predef loadmod(mod)#1, execmod(modfile)#1, lookupstrmod(str)#1
// //
// System variables. // System variables.
// //
@ -117,7 +117,7 @@ word syslibsym = @exports
// CALL CFFA1 API ENTRYPOINT // CALL CFFA1 API ENTRYPOINT
// SYSCALL(CMD) // SYSCALL(CMD)
// //
asm syscall asm syscall(cmd)#1
LDA ESTKL,X LDA ESTKL,X
STX ESP STX ESP
TAX TAX
@ -132,7 +132,7 @@ end
// CALL 6502 ROUTINE // CALL 6502 ROUTINE
// CALL(ADDR, AREG, XREG, YREG, STATUS) // CALL(ADDR, AREG, XREG, YREG, STATUS)
// //
asm call asm call(addr,areg,xreg,yreg,sstatus)#1
PHP PHP
LDA ESTKL+4,X LDA ESTKL+4,X
STA CALL6502+1 STA CALL6502+1
@ -172,7 +172,7 @@ end
// //
// QUIT TO MONITOR // QUIT TO MONITOR
// //
asm quit asm quit()#0
JMP $9000 JMP $9000
end end
// //
@ -180,7 +180,7 @@ end
// MEMSET(ADDR, VALUE, SIZE) // MEMSET(ADDR, VALUE, SIZE)
// With optimizations from Peter Ferrie // With optimizations from Peter Ferrie
// //
asm memset asm memset(addr,value,size)#0
LDA ESTKL+2,X LDA ESTKL+2,X
STA DSTL STA DSTL
LDA ESTKH+2,X LDA ESTKH+2,X
@ -207,6 +207,7 @@ SETMLPH STA (DST),Y
++ DEC ESTKH,X ++ DEC ESTKH,X
BNE - BNE -
SETMEX INX SETMEX INX
INX
INX INX
RTS RTS
end end
@ -214,31 +215,32 @@ end
// COPY MEMORY // COPY MEMORY
// MEMCPY(DSTADDR, SRCADDR, SIZE) // MEMCPY(DSTADDR, SRCADDR, SIZE)
// //
asm memcpy asm memcpy(dst,src,size)#0
INX INX
INX INX
LDA ESTKL-2,X INX
ORA ESTKH-2,X LDA ESTKL-3,X
ORA ESTKH-3,X
BEQ CPYMEX BEQ CPYMEX
LDA ESTKL-1,X LDA ESTKL-2,X
CMP ESTKL,X CMP ESTKL-1,X
LDA ESTKH-1,X LDA ESTKH-2,X
SBC ESTKH,X SBC ESTKH-1,X
BCC REVCPY BCC REVCPY
; ;
; FORWARD COPY ; FORWARD COPY
; ;
LDA ESTKL,X
STA DSTL
LDA ESTKH,X
STA DSTH
LDA ESTKL-1,X LDA ESTKL-1,X
STA SRCL STA DSTL
LDA ESTKH-1,X LDA ESTKH-1,X
STA DSTH
LDA ESTKL-2,X
STA SRCL
LDA ESTKH-2,X
STA SRCH STA SRCH
LDY ESTKL-2,X LDY ESTKL-3,X
BEQ FORCPYLP BEQ FORCPYLP
INC ESTKH-2,X INC ESTKH-3,X
LDY #$00 LDY #$00
FORCPYLP LDA (SRC),Y FORCPYLP LDA (SRC),Y
STA (DST),Y STA (DST),Y
@ -246,34 +248,34 @@ FORCPYLP LDA (SRC),Y
BNE + BNE +
INC DSTH INC DSTH
INC SRCH INC SRCH
+ DEC ESTKL-2,X + DEC ESTKL-3,X
BNE FORCPYLP BNE FORCPYLP
DEC ESTKH-2,X DEC ESTKH-3,X
BNE FORCPYLP BNE FORCPYLP
RTS RTS
; ;
; REVERSE COPY ; REVERSE COPY
; ;
REVCPY ;CLC REVCPY ;CLC
LDA ESTKL-2,X LDA ESTKL-3,X
ADC ESTKL,X ADC ESTKL,X
STA DSTL STA DSTL
LDA ESTKH-2,X LDA ESTKH-3,X
ADC ESTKH,X ADC ESTKH,X
STA DSTH STA DSTH
CLC CLC
LDA ESTKL-2,X LDA ESTKL-3,X
ADC ESTKL-1,X ADC ESTKL-2,X
STA SRCL STA SRCL
LDA ESTKH-2,X LDA ESTKH-3,X
ADC ESTKH-1,X ADC ESTKH-2,X
STA SRCH STA SRCH
DEC DSTH DEC DSTH
DEC SRCH DEC SRCH
LDY #$FF LDY #$FF
LDA ESTKL-2,X LDA ESTKL-3,X
BEQ REVCPYLP BEQ REVCPYLP
INC ESTKH-2,X INC ESTKH-3,X
REVCPYLP LDA (SRC),Y REVCPYLP LDA (SRC),Y
STA (DST),Y STA (DST),Y
DEY DEY
@ -281,16 +283,16 @@ REVCPYLP LDA (SRC),Y
BNE + BNE +
DEC DSTH DEC DSTH
DEC SRCH DEC SRCH
+ DEC ESTKL-2,X + DEC ESTKL-3,X
BNE REVCPYLP BNE REVCPYLP
DEC ESTKH-2,X DEC ESTKH-3,X
BNE REVCPYLP BNE REVCPYLP
CPYMEX RTS CPYMEX RTS
end end
// //
// Unsigned word comparisons. // Unsigned word comparisons.
// //
asm uword_isge asm uword_isge(a,b)#1
LDA ESTKL+1,X LDA ESTKL+1,X
CMP ESTKL,X CMP ESTKL,X
LDA ESTKH+1,X LDA ESTKH+1,X
@ -303,7 +305,7 @@ asm uword_isge
INX INX
RTS RTS
end end
asm uword_isle asm uword_isle(a,b)#1
LDA ESTKL,X LDA ESTKL,X
CMP ESTKL+1,X CMP ESTKL+1,X
LDA ESTKH,X LDA ESTKH,X
@ -316,7 +318,7 @@ asm uword_isle
INX INX
RTS RTS
end end
asm uword_isgt asm uword_isgt(a,b)#1
LDA ESTKL,X LDA ESTKL,X
CMP ESTKL+1,X CMP ESTKL+1,X
LDA ESTKH,X LDA ESTKH,X
@ -328,7 +330,7 @@ asm uword_isgt
INX INX
RTS RTS
end end
asm uword_islt asm uword_islt(a,b)#1
LDA ESTKL+1,X LDA ESTKL+1,X
CMP ESTKL,X CMP ESTKL,X
LDA ESTKH+1,X LDA ESTKH+1,X
@ -343,7 +345,7 @@ end
// //
// Addresses of internal routines. // Addresses of internal routines.
// //
asm interp asm interp()#1
DEX DEX
LDA #<IINTERP LDA #<IINTERP
STA ESTKL,X STA ESTKL,X
@ -366,7 +368,7 @@ end
// ^str = len // ^str = len
// return len // return len
//end //end
asm dcitos asm dcitos(dci, str)#1
LDA ESTKL,X LDA ESTKL,X
STA DSTL STA DSTL
LDA ESTKH,X LDA ESTKH,X
@ -406,7 +408,7 @@ end
// loop // loop
// return ^str // return ^str
//end //end
asm stodci asm stodci(str, dci)#1
LDA ESTKL,X LDA ESTKL,X
STA DSTL STA DSTL
LDA ESTKH,X LDA ESTKH,X
@ -434,7 +436,7 @@ asm stodci
STY ESTKH,X STY ESTKH,X
RTS RTS
end end
asm toupper asm toupper(c)#1
LDA ESTKL,X LDA ESTKL,X
TOUPR AND #$7F TOUPR AND #$7F
CMP #'a' CMP #'a'
@ -461,7 +463,7 @@ end
// until !(c & $80) // until !(c & $80)
// return dci // return dci
//end //end
asm modtosym asm modtosym(mod, dci)#1
LDA ESTKL+1,X LDA ESTKL+1,X
STA SRCL STA SRCL
LDA ESTKH+1,X LDA ESTKH+1,X
@ -502,7 +504,7 @@ end
// tbl = tbl + 3 // tbl = tbl + 3
// loop // loop
// return 0 // return 0
asm lookuptbl asm lookuptbl(dci, tbl)#1
LDA ESTKL,X LDA ESTKL,X
STA DSTL STA DSTL
LDA ESTKH,X LDA ESTKH,X
@ -547,13 +549,13 @@ end
// //
// CONSOLE I/O // CONSOLE I/O
// //
asm cout asm cout(c)#0
LDA ESTKL,X LDA ESTKL,X
JSR TOUPR JSR TOUPR
ORA #$80 ORA #$80
JMP $FFEF JMP $FFEF
end end
asm cin asm cin()#1
DEX DEX
- LDA $D011 - LDA $D011
BPL - BPL -
@ -564,10 +566,10 @@ asm cin
STA ESTKH,X STA ESTKH,X
RTS RTS
end end
def crout def crout()#0
return cout($0D) cout($0D)
end end
def prstr(str) def prstr(str)#0
byte i byte i
i = 1 i = 1
while i <= ^str while i <= ^str
@ -575,7 +577,7 @@ def prstr(str)
i = i + 1 i = i + 1
loop loop
end end
def rdstr(prompt) def rdstr(prompt)#1
byte ch, maxlen byte ch, maxlen
maxlen = 0 maxlen = 0
inbuff.0 = 0 inbuff.0 = 0
@ -627,13 +629,13 @@ def rdstr(prompt)
cout($0D) cout($0D)
return inbuff return inbuff
end end
def prbyte(v) def prbyte(v)#0
cout(hexchar[(v >> 4) & $0F]) cout(hexchar[(v >> 4) & $0F])
return cout(hexchar[v & $0F]) cout(hexchar[v & $0F])
end end
def prword(v) def prword(v)#0
prbyte(v >> 8) prbyte(v >> 8)
return prbyte(v) prbyte(v)
end end
// //
// CFFA1 routines // CFFA1 routines
@ -647,12 +649,12 @@ end
// perr = syscall($12) // perr = syscall($12)
// return *CFFAEntryPtr // return *CFFAEntryPtr
//end //end
def finddirentry(filename) def finddirentry(filename)#1
*CFFAFileName = filename *CFFAFileName = filename
perr = syscall($14) perr = syscall($14)
return *CFFAEntryPtr return *CFFAEntryPtr
end end
def readfile(filename, buffer) def readfile(filename, buffer)#1
*CFFADest = buffer *CFFADest = buffer
*CFFAFileName = filename *CFFAFileName = filename
perr = syscall($22) perr = syscall($22)
@ -661,11 +663,11 @@ end
// //
// Heap routines. // Heap routines.
// //
def availheap def availheap()#1
byte fp byte fp
return @fp - heap return @fp - heap
end end
def allocheap(size) def allocheap(size)#1
word addr word addr
addr = heap addr = heap
heap = heap + size heap = heap + size
@ -674,7 +676,7 @@ def allocheap(size)
fin fin
return addr return addr
end end
def allocalignheap(size, pow2, freeaddr) def allocalignheap(size, pow2, freeaddr)#1
word align, addr word align, addr
if freeaddr if freeaddr
*freeaddr = heap *freeaddr = heap
@ -687,20 +689,20 @@ def allocalignheap(size, pow2, freeaddr)
fin fin
return addr return addr
end end
def markheap def markheap()#1
return heap return heap
end end
def releaseheap(newheap) def releaseheap(newheap)#1
heap = newheap heap = newheap
return @newheap - heap return @newheap - heap
end end
// //
// Symbol table routines. // Symbol table routines.
// //
def lookupsym(sym) def lookupsym(sym)#1
return lookuptbl(sym, symtbl) return lookuptbl(sym, symtbl)
end end
def addsym(sym, addr) def addsym(sym, addr)#0
while ^sym & $80 while ^sym & $80
^lastsym = ^sym ^lastsym = ^sym
lastsym = lastsym + 1 lastsym = lastsym + 1
@ -714,20 +716,20 @@ end
// //
// Module routines. // Module routines.
// //
def lookupmod(mod) def lookupmod(mod)#1
byte dci[17] byte dci[17]
return lookuptbl(modtosym(mod, @dci), symtbl) return lookuptbl(modtosym(mod, @dci), symtbl)
end end
def lookupstrmod(str) def lookupstrmod(str)#1
byte mod[17] byte mod[17]
stodci(str, @mod) stodci(str, @mod)
return lookupmod(@mod) return lookupmod(@mod)
end end
def addmod(mod, addr) def addmod(mod, addr)#0
byte dci[17] byte dci[17]
return addsym(modtosym(mod, @dci), addr) addsym(modtosym(mod, @dci), addr)
end end
def lookupextern(esd, index) def lookupextern(esd, index)#1
word sym, addr word sym, addr
byte str[16] byte str[16]
while ^esd while ^esd
@ -747,7 +749,7 @@ def lookupextern(esd, index)
loop loop
return 0 return 0
end end
def adddef(addr, deflast) def adddef(addr, deflast)#1
word defentry word defentry
defentry = *deflast defentry = *deflast
*deflast = defentry + 5 *deflast = defentry + 5
@ -757,7 +759,7 @@ def adddef(addr, deflast)
defentry->5 = 0 // null out next entry defentry->5 = 0 // null out next entry
return defentry return defentry
end end
def lookupdef(addr, deftbl) def lookupdef(addr, deftbl)#1
while deftbl->0 == $20 while deftbl->0 == $20
if deftbl=>3 == addr if deftbl=>3 == addr
return deftbl return deftbl
@ -766,7 +768,7 @@ def lookupdef(addr, deftbl)
loop loop
return 0 return 0
end end
def loadmod(mod) def loadmod(mod)#1
word rdlen, modsize, bytecode, defofst, defcnt, init, fixup word rdlen, modsize, bytecode, defofst, defcnt, init, fixup
word addr, modaddr, modfix, modend word addr, modaddr, modfix, modend
word deftbl, deflast word deftbl, deflast
@ -929,14 +931,14 @@ end
// //
// Command mode // Command mode
// //
def stripchars(strptr) def stripchars(strptr)#1
while ^strptr and ^(strptr + 1) <> ' ' while ^strptr and ^(strptr + 1) <> ' '
memcpy(strptr + 1, strptr + 2, ^strptr) memcpy(strptr + 1, strptr + 2, ^strptr)
^strptr = ^strptr - 1 ^strptr = ^strptr - 1
loop loop
return ^strptr return ^strptr
end end
def stripspaces(strptr) def stripspaces(strptr)#0
while ^strptr and ^(strptr + ^strptr) <= ' ' while ^strptr and ^(strptr + ^strptr) <= ' '
^strptr = ^strptr - 1 ^strptr = ^strptr - 1
loop loop
@ -945,7 +947,7 @@ def stripspaces(strptr)
^strptr = ^strptr - 1 ^strptr = ^strptr - 1
loop loop
end end
def striptrail(strptr) def striptrail(strptr)#0
byte i byte i
for i = 1 to ^strptr for i = 1 to ^strptr
@ -955,7 +957,7 @@ def striptrail(strptr)
fin fin
next next
end end
def parsecmd(strptr) def parsecmd(strptr)#1
byte cmd byte cmd
cmd = 0 cmd = 0
@ -968,7 +970,7 @@ def parsecmd(strptr)
stripspaces(strptr) stripspaces(strptr)
return cmd return cmd
end end
def execmod(modfile) def execmod(modfile)#1
byte moddci[17] byte moddci[17]
word saveheap, savesym, saveflags word saveheap, savesym, saveflags

View File

@ -25,12 +25,12 @@ const O_READ_WRITE = 3
// //
// Pedefined functions. // Pedefined functions.
// //
predef crout, cout, prstr, cin, rdstr predef syscall(cmd,params)#1, call(addr,areg,xreg,yreg,status)#1
predef syscall, call predef crout()#0, cout(c)#0, prstr(s)#0, cin()#1, rdstr(p)#1
predef markheap, allocheap, allocalignheap, releaseheap, availheap predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr), releaseheap(newheap)#1, availheap()#1
predef memset, memcpy predef memset(addr,value,size)#0, memcpy(dst,src,size)#0
predef uword_isgt, uword_isge, uword_islt, uword_isle predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1
predef loadmod, execmod, lookupstrmod predef loadmod(mod)#1, execmod(modfile)#1, lookupstrmod(str)#1
// //
// System variables. // System variables.
// //
@ -113,7 +113,7 @@ word syslibsym = @exports
// CALL SOS // CALL SOS
// SYSCALL(CMD, PARAMS) // SYSCALL(CMD, PARAMS)
// //
asm syscall asm syscall(cmd,params)#1
LDA ESTKL,X LDA ESTKL,X
LDY ESTKH,X LDY ESTKH,X
STA PARAMS STA PARAMS
@ -133,7 +133,7 @@ end
// CALL 6502 ROUTINE // CALL 6502 ROUTINE
// CALL(AREG, XREG, YREG, STATUS, ADDR) // CALL(AREG, XREG, YREG, STATUS, ADDR)
// //
asm call asm call(addr,areg,xreg,yreg,sstatus)#1
REGVALS = SRC REGVALS = SRC
PHP PHP
LDA ESTKL,X LDA ESTKL,X
@ -176,7 +176,7 @@ end
// MEMSET(ADDR, VALUE, SIZE) // MEMSET(ADDR, VALUE, SIZE)
// With optimizations from Peter Ferrie // With optimizations from Peter Ferrie
// //
asm memset asm memset(addr,value,size)#0
LDA ESTKL+2,X LDA ESTKL+2,X
STA DSTL STA DSTL
LDA ESTKH+2,X LDA ESTKH+2,X
@ -203,6 +203,7 @@ SETMLPH STA (DST),Y
++ DEC ESTKH,X ++ DEC ESTKH,X
BNE - BNE -
SETMEX INX SETMEX INX
INX
INX INX
RTS RTS
end end
@ -210,31 +211,32 @@ end
// COPY MEMORY // COPY MEMORY
// MEMCPY(DSTADDR, SRCADDR, SIZE) // MEMCPY(DSTADDR, SRCADDR, SIZE)
// //
asm memcpy asm memcpy(dst,src,size)#0
INX INX
INX INX
LDA ESTKL-2,X INX
ORA ESTKH-2,X LDA ESTKL-3,X
ORA ESTKH-3,X
BEQ CPYMEX BEQ CPYMEX
LDA ESTKL-1,X LDA ESTKL-2,X
CMP ESTKL,X CMP ESTKL-1,X
LDA ESTKH-1,X LDA ESTKH-2,X
SBC ESTKH,X SBC ESTKH-1,X
BCC REVCPY BCC REVCPY
; ;
; FORWARD COPY ; FORWARD COPY
; ;
LDA ESTKL,X LDA ESTKL-2,X
STA DSTL STA DSTL
LDA ESTKH,X LDA ESTKH-2,X
STA DSTH STA DSTH
LDA ESTKL-1,X LDA ESTKL-2,X
STA SRCL STA SRCL
LDA ESTKH-1,X LDA ESTKH-2,X
STA SRCH STA SRCH
LDY ESTKL-2,X LDY ESTKL-3,X
BEQ FORCPYLP BEQ FORCPYLP
INC ESTKH-2,X INC ESTKH-3,X
LDY #$00 LDY #$00
FORCPYLP LDA (SRC),Y FORCPYLP LDA (SRC),Y
STA (DST),Y STA (DST),Y
@ -242,34 +244,34 @@ FORCPYLP LDA (SRC),Y
BNE + BNE +
INC DSTH INC DSTH
INC SRCH INC SRCH
+ DEC ESTKL-2,X + DEC ESTKL-3,X
BNE FORCPYLP BNE FORCPYLP
DEC ESTKH-2,X DEC ESTKH-3,X
BNE FORCPYLP BNE FORCPYLP
RTS RTS
; ;
; REVERSE COPY ; REVERSE COPY
; ;
REVCPY ;CLC REVCPY ;CLC
LDA ESTKL-2,X LDA ESTKL-3,X
ADC ESTKL,X ADC ESTKL-1,X
STA DSTL STA DSTL
LDA ESTKH-2,X LDA ESTKH-3,X
ADC ESTKH,X ADC ESTKH-1,X
STA DSTH STA DSTH
CLC CLC
LDA ESTKL-2,X LDA ESTKL-3,X
ADC ESTKL-1,X ADC ESTKL-2,X
STA SRCL STA SRCL
LDA ESTKH-2,X LDA ESTKH-3,X
ADC ESTKH-1,X ADC ESTKH-2,X
STA SRCH STA SRCH
DEC DSTH DEC DSTH
DEC SRCH DEC SRCH
LDY #$FF LDY #$FF
LDA ESTKL-2,X LDA ESTKL-3,X
BEQ REVCPYLP BEQ REVCPYLP
INC ESTKH-2,X INC ESTKH-3,X
REVCPYLP LDA (SRC),Y REVCPYLP LDA (SRC),Y
STA (DST),Y STA (DST),Y
DEY DEY
@ -277,9 +279,9 @@ REVCPYLP LDA (SRC),Y
BNE + BNE +
DEC DSTH DEC DSTH
DEC SRCH DEC SRCH
+ DEC ESTKL-2,X + DEC ESTKL-3,X
BNE REVCPYLP BNE REVCPYLP
DEC ESTKH-2,X DEC ESTKH-3,X
BNE REVCPYLP BNE REVCPYLP
CPYMEX RTS CPYMEX RTS
end end
@ -288,7 +290,7 @@ end
// //
// MEMXCPY(DSTSEG, SRC, SIZE) // MEMXCPY(DSTSEG, SRC, SIZE)
// //
asm memxcpy asm memxcpy(dst,src,size)#0
LDA ESTKL,X LDA ESTKL,X
ORA ESTKH,X ORA ESTKH,X
BEQ CPYXMEX BEQ CPYXMEX
@ -320,6 +322,7 @@ CPYXLP LDA (SRC),Y
LDA #$00 LDA #$00
STA DSTX STA DSTX
CPYXMEX INX CPYXMEX INX
INX
INX INX
RTS RTS
end end
@ -328,7 +331,7 @@ end
// //
// XPOKEB(SEG, DST, BYTEVAL) // XPOKEB(SEG, DST, BYTEVAL)
// //
asm xpokeb asm xpokeb(seg, dst, byteval)#0
LDA ESTKL+1,X LDA ESTKL+1,X
STA DSTL STA DSTL
LDA ESTKH+1,X LDA ESTKH+1,X
@ -345,12 +348,13 @@ asm xpokeb
STY DSTX STY DSTX
INX INX
INX INX
INX
RTS RTS
end end
// //
// Unsigned word comparisons. // Unsigned word comparisons.
// //
asm uword_isge asm uword_isge(a,b)#1
LDA ESTKL+1,X LDA ESTKL+1,X
CMP ESTKL,X CMP ESTKL,X
LDA ESTKH+1,X LDA ESTKH+1,X
@ -363,7 +367,7 @@ asm uword_isge
INX INX
RTS RTS
end end
asm uword_isle asm uword_isle(a,b)#1
LDA ESTKL,X LDA ESTKL,X
CMP ESTKL+1,X CMP ESTKL+1,X
LDA ESTKH,X LDA ESTKH,X
@ -376,7 +380,7 @@ asm uword_isle
INX INX
RTS RTS
end end
asm uword_isgt asm uword_isgt(a,b)#1
LDA ESTKL,X LDA ESTKL,X
CMP ESTKL+1,X CMP ESTKL+1,X
LDA ESTKH,X LDA ESTKH,X
@ -388,7 +392,7 @@ asm uword_isgt
INX INX
RTS RTS
end end
asm uword_islt asm uword_islt(a,b)#1
LDA ESTKL+1,X LDA ESTKL+1,X
CMP ESTKL,X CMP ESTKL,X
LDA ESTKH+1,X LDA ESTKH+1,X
@ -403,7 +407,7 @@ end
// //
// Addresses of internal routines. // Addresses of internal routines.
// //
asm interp asm interp()#1
DEX DEX
LDA #<XINTERP LDA #<XINTERP
STA ESTKL,X STA ESTKL,X
@ -426,7 +430,7 @@ end
// ^str = len // ^str = len
// return len // return len
//end //end
asm dcitos asm dcitos(dci, str)#1
LDA ESTKL,X LDA ESTKL,X
STA DSTL STA DSTL
LDA ESTKH,X LDA ESTKH,X
@ -466,7 +470,7 @@ end
// loop // loop
// return ^str // return ^str
//end //end
asm stodci asm stodci(str, dci)#1
LDA ESTKL,X LDA ESTKL,X
STA DSTL STA DSTL
LDA ESTKH,X LDA ESTKH,X
@ -494,7 +498,7 @@ asm stodci
STY ESTKH,X STY ESTKH,X
RTS RTS
end end
asm toupper asm toupper(c)#1
LDA ESTKL,X LDA ESTKL,X
TOUPR AND #$7F TOUPR AND #$7F
CMP #'a' CMP #'a'
@ -521,7 +525,7 @@ end
// until !(c & $80) // until !(c & $80)
// return dci // return dci
//end //end
asm modtosym asm modtosym(mod, dci)#1
LDA ESTKL+1,X LDA ESTKL+1,X
STA SRCL STA SRCL
LDA ESTKH+1,X LDA ESTKH+1,X
@ -562,7 +566,7 @@ end
// tbl = tbl + 3 // tbl = tbl + 3
// loop // loop
// return 0 // return 0
asm lookuptbl asm lookuptbl(dci, tbl)#1
LDY #$00 LDY #$00
STY DSTL STY DSTL
LDA ESTKH,X LDA ESTKH,X
@ -615,7 +619,7 @@ end
// SOS routines // SOS routines
// FILE I/O // FILE I/O
// //
def getpfx(path) def getpfx(path)#1
byte params[4] byte params[4]
^path = 0 ^path = 0
@ -625,7 +629,7 @@ def getpfx(path)
perr = syscall($C7, @params) perr = syscall($C7, @params)
return path return path
end end
def setpfx(path) def setpfx(path)#1
byte params[3] byte params[3]
params.0 = 1 params.0 = 1
@ -633,7 +637,7 @@ def setpfx(path)
perr = syscall($C6, @params) perr = syscall($C6, @params)
return path return path
end end
def volume(devname, volname, ttlblks, freblks) def volume(devname, volname, ttlblks, freblks)#1
byte params[9] byte params[9]
params.0 = 4 params.0 = 4
@ -646,7 +650,7 @@ def volume(devname, volname, ttlblks, freblks)
*freblks = params:7 *freblks = params:7
return perr return perr
end end
def open(path, access) def open(path, access)#1
byte params[7] byte params[7]
params.0 = 4 params.0 = 4
@ -657,7 +661,7 @@ def open(path, access)
perr = syscall($C8, @params) perr = syscall($C8, @params)
return params.3 return params.3
end end
def close(refnum) def close(refnum)#1
byte params[2] byte params[2]
params.0 = 1 params.0 = 1
@ -665,7 +669,7 @@ def close(refnum)
perr = syscall($CC, @params) perr = syscall($CC, @params)
return perr return perr
end end
def read(refnum, buff, len) def read(refnum, buff, len)#1
byte params[8] byte params[8]
params.0 = 4 params.0 = 4
@ -676,7 +680,7 @@ def read(refnum, buff, len)
perr = syscall($CA, @params) perr = syscall($CA, @params)
return params:6 return params:6
end end
def write(refnum, buff, len) def write(refnum, buff, len)#1
byte params[6] byte params[6]
params.0 = 3 params.0 = 3
@ -689,7 +693,7 @@ end
// //
// DEVICE I/O // DEVICE I/O
// //
def dev_control(devnum, code, list) def dev_control(devnum, code, list)#1
byte params[5] byte params[5]
params.0 = 3 params.0 = 3
@ -699,7 +703,7 @@ def dev_control(devnum, code, list)
perr = syscall($83, @params) perr = syscall($83, @params)
return perr return perr
end end
def dev_getnum(name) def dev_getnum(name)#1
byte params[4] byte params[4]
params.0 = 2 params.0 = 2
@ -708,7 +712,7 @@ def dev_getnum(name)
perr = syscall($84, @params) perr = syscall($84, @params)
return params.3 return params.3
end end
def dev_info(devnum, name, list, listlen) def dev_info(devnum, name, list, listlen)#1
byte params[7] byte params[7]
params.0 = 4 params.0 = 4
@ -722,7 +726,7 @@ end
// //
// MEMORY CALLS // MEMORY CALLS
// //
def seg_request(base, limit, id) def seg_request(base, limit, id)#1
byte params[7] byte params[7]
params.0 = 4 params.0 = 4
@ -733,7 +737,7 @@ def seg_request(base, limit, id)
perr = syscall($40, @params) perr = syscall($40, @params)
return params.6 return params.6
end end
def seg_find(search, base, limit, pages, id) def seg_find(search, base, limit, pages, id)#1
byte params[10] byte params[10]
params.0 = 6 params.0 = 6
@ -748,7 +752,7 @@ def seg_find(search, base, limit, pages, id)
*limit = params:7 *limit = params:7
return params.9 return params.9
end end
def seg_release(segnum) def seg_release(segnum)#1
byte params[2] byte params[2]
params.0 = 1 params.0 = 1
@ -759,7 +763,7 @@ end
// //
// Other SOS calls. // Other SOS calls.
// //
def quit def quit()#0
byte params[1] byte params[1]
close(0) close(0)
@ -770,7 +774,7 @@ end
// //
// CONSOLE I/O // CONSOLE I/O
// //
def init_cons def init_cons()#0
byte nlmode[2] byte nlmode[2]
if !refcons if !refcons
refcons = open(@console, O_READ_WRITE) refcons = open(@console, O_READ_WRITE)
@ -781,7 +785,7 @@ def init_cons
nlmode.1 = $0D nlmode.1 = $0D
dev_control(devcons, $02, @nlmode) dev_control(devcons, $02, @nlmode)
end end
def cout(ch) def cout(ch)#0
if ch == $0D if ch == $0D
ch = $0A0D ch = $0A0D
write(refcons, @ch, 2) write(refcons, @ch, 2)
@ -789,18 +793,18 @@ def cout(ch)
write(refcons, @ch, 1) write(refcons, @ch, 1)
fin fin
end end
def cin def cin()#1
byte ch byte ch
read(refcons, @ch, 1) read(refcons, @ch, 1)
return ch & $7F return ch & $7F
end end
def prstr(str) def prstr(str)#0
write(refcons, str + 1, ^str) write(refcons, str + 1, ^str)
if str->[^str] == $0D if str->[^str] == $0D
cout($0A) cout($0A)
fin fin
end end
def rdstr(prompt) def rdstr(prompt)#1
cout(prompt) cout(prompt)
^heap = read(refcons, heap + 1, 128) ^heap = read(refcons, heap + 1, 128)
if heap->[^heap] == $0D if heap->[^heap] == $0D
@ -809,25 +813,25 @@ def rdstr(prompt)
cout($0D) cout($0D)
return heap return heap
end end
def crout def crout()#0
return cout($0D) cout($0D)
end end
def prbyte(v) def prbyte(v)#0
cout(hexchar[(v >> 4) & $0F]) cout(hexchar[(v >> 4) & $0F])
return cout(hexchar[v & $0F]) cout(hexchar[v & $0F])
end end
def prword(v) def prword(v)#0
prbyte(v >> 8) prbyte(v >> 8)
return prbyte(v) prbyte(v)
end end
// //
// Heap routines. // Heap routines.
// //
def availheap def availheap()#1
byte fp byte fp
return @fp - heap return @fp - heap
end end
def allocheap(size) def allocheap(size)#1
word addr word addr
addr = heap addr = heap
heap = heap + size heap = heap + size
@ -836,7 +840,7 @@ def allocheap(size)
fin fin
return addr return addr
end end
def allocalignheap(size, pow2, freeaddr) def allocalignheap(size, pow2, freeaddr)#1
word align, addr word align, addr
if freeaddr if freeaddr
*freeaddr = heap *freeaddr = heap
@ -849,20 +853,20 @@ def allocalignheap(size, pow2, freeaddr)
fin fin
return addr return addr
end end
def markheap def markheap()#1
return heap return heap
end end
def releaseheap(newheap) def releaseheap(newheap)#1
heap = newheap heap = newheap
return @newheap - heap return @newheap - heap
end end
// //
// Symbol table routines. // Symbol table routines.
// //
def lookupsym(sym) def lookupsym(sym)#1
return lookuptbl(sym, symtbl) return lookuptbl(sym, symtbl)
end end
def addsym(sym, addr) def addsym(sym, addr)#0
while ^sym & $80 while ^sym & $80
xpokeb(symtbl.0, lastsym, ^sym) xpokeb(symtbl.0, lastsym, ^sym)
lastsym = lastsym + 1 lastsym = lastsym + 1
@ -877,20 +881,20 @@ end
// //
// Module routines. // Module routines.
// //
def lookupmod(mod) def lookupmod(mod)#1
byte dci[17] byte dci[17]
return lookuptbl(modtosym(mod, @dci), symtbl) return lookuptbl(modtosym(mod, @dci), symtbl)
end end
def lookupstrmod(str) def lookupstrmod(str)#1
byte mod[17] byte mod[17]
stodci(str, @mod) stodci(str, @mod)
return lookupmod(@mod) return lookupmod(@mod)
end end
def addmod(mod, addr) def addmod(mod, addr)#0
byte dci[17] byte dci[17]
return addsym(modtosym(mod, @dci), addr) addsym(modtosym(mod, @dci), addr)
end end
def lookupextern(esd, index) def lookupextern(esd, index)#1
word sym, addr word sym, addr
byte str[16] byte str[16]
while ^esd while ^esd
@ -910,7 +914,7 @@ def lookupextern(esd, index)
loop loop
return 0 return 0
end end
def adddef(ext, addr, deflast) def adddef(ext, addr, deflast)#1
word defentry word defentry
defentry = *deflast defentry = *deflast
*deflast = defentry + 6 *deflast = defentry + 6
@ -920,7 +924,7 @@ def adddef(ext, addr, deflast)
defentry=>5 = ext // ext is byte, so this nulls out next entry defentry=>5 = ext // ext is byte, so this nulls out next entry
return defentry return defentry
end end
def lookupdef(addr, deftbl) def lookupdef(addr, deftbl)#1
while deftbl->0 == $20 while deftbl->0 == $20
if deftbl=>3 == addr if deftbl=>3 == addr
return deftbl return deftbl
@ -929,7 +933,7 @@ def lookupdef(addr, deftbl)
loop loop
return 0 return 0
end end
def loadmod(mod) def loadmod(mod)#1
word refnum, rdlen, modsize, bytecode, defofst, defcnt, init, fixup word refnum, rdlen, modsize, bytecode, defofst, defcnt, init, fixup
word addr, defaddr, modaddr, modfix, modend word addr, defaddr, modaddr, modfix, modend
word deftbl, deflast, codeseg word deftbl, deflast, codeseg
@ -1121,7 +1125,7 @@ end
// //
// Command mode // Command mode
// //
def volumes def volumes()#0
byte info[11] byte info[11]
byte devname[17] byte devname[17]
byte volname[17] byte volname[17]
@ -1141,7 +1145,7 @@ def volumes
next next
perr = 0 perr = 0
end end
def catalog(optpath) def catalog(optpath)#1
byte path[64] byte path[64]
byte refnum byte refnum
byte firstblk byte firstblk
@ -1202,14 +1206,14 @@ def catalog(optpath)
crout() crout()
return 0 return 0
end end
def stripchars(strptr) def stripchars(strptr)#1
while ^strptr and ^(strptr + 1) <> ' ' while ^strptr and ^(strptr + 1) <> ' '
memcpy(strptr + 1, strptr + 2, ^strptr) memcpy(strptr + 1, strptr + 2, ^strptr)
^strptr = ^strptr - 1 ^strptr = ^strptr - 1
loop loop
return ^strptr return ^strptr
end end
def stripspaces(strptr) def stripspaces(strptr)#0
while ^strptr and ^(strptr + ^strptr) <= ' ' while ^strptr and ^(strptr + ^strptr) <= ' '
^strptr = ^strptr - 1 ^strptr = ^strptr - 1
loop loop
@ -1218,7 +1222,7 @@ def stripspaces(strptr)
^strptr = ^strptr - 1 ^strptr = ^strptr - 1
loop loop
end end
def striptrail(strptr) def striptrail(strptr)#0
byte i byte i
for i = 1 to ^strptr for i = 1 to ^strptr
@ -1228,7 +1232,7 @@ def striptrail(strptr)
fin fin
next next
end end
def parsecmd(strptr) def parsecmd(strptr)#1
byte cmd byte cmd
cmd = 0 cmd = 0
@ -1241,7 +1245,7 @@ def parsecmd(strptr)
stripspaces(strptr) stripspaces(strptr)
return cmd return cmd
end end
def execmod(modfile) def execmod(modfile)#1
byte moddci[17] byte moddci[17]
word saveheap, savesym, saveflags word saveheap, savesym, saveflags