The Symbol Table Lister can be used to create an Symbol Import List for linking different parts of ACTION! codes together. This Version prints the symbol table to the Screen, however the Tool can be adapted to print the symbol table to Printer or a file.
Usage:
1 compile your program from memory or disk 2 compile the symbol table lister from disk, at the end of compilation it will print out the symbol table
MODULE ; ST.ACT
; Symbol table lister for ACTION!
; compiler. Lists local variables
; per PROC/FUNC and globals at end
; of compilation.
; copyright 1983
; by Action Computer Services
; All Rights Reserved
; version 1.0
; last modified November 6, 1983
; user options:
;
; change Open call in SPLEnd to get
; listing to go to disk
DEFINE STRING = "CHAR ARRAY"
DEFINE JMP = "$4C" ; JMP addr16
TYPE INSTR=~[BYTE op CARD addr]
INSTR Segvec=$4C6, DCLvec=$4D4
INSTR SPLvec=$4DD
TYPE ENTRY =
~[
; STRING name(?)
BYTE vtype
CARD adr
BYTE numargs
; BYTE ARRAY argTypes(8)
]
BYTE oldDevice, curBank=$4C9
BYTE pf, Zop=$8A, tZop
CARD curproc=$8E
ENTRY POINTER e
CHAR ARRAY cmdLine(0)=$590
BYTE ARRAY bank(0)=$D500
BYTE ARRAY zpage(32), temps(16)
PROC PrintH(CARD v)
PrintF("%H", v)
RETURN
PROC BaseType(BYTE et)
et = et & $7
IF et=1 THEN Print("CHAR")
ELSEIF et=2 THEN Print("BYTE")
ELSEIF et=3 THEN Print("INT")
ELSEIF et=4 THEN Print("CARD")
FI
RETURN
BYTE FUNC GetType(BYTE et)
CHAR ch
BYTE pfFlag, t, oldT
ENTRY POINTER next
STRING name
pfFlag = 0
IF et=39 THEN ; user type
Print("TYPE=")
name = e + 3
next = name + name(0) + 1
ch = '~[
oldT = 0
WHILE next.vtype<128 DO
et = next.vtype & $7
If et=0 THEN EXIT FI
IF et=oldT THEN
Print(", ")
ELSE
Put(ch)
BaseType(et)
Put(' )
FI
oldT = et
Print(name)
ch = '
name = next + 3
next = name + name(0) + 1
OD
IF ch='~[ THEN Put('~[) FI
Put('])
RETURN(0)
FI
IF et=27 THEN ; DEFINE
PrintF("DEFINE = ""%S""", e+3)
RETURN(0)
FI
; get basic type
BaseType(et)
; only record vars less than 128
IF et<128 THEN ; record
IF (et&7)=0 THEN
Print("RECORD")
IF (et&8)=8 THEN
Print(" POINTER")
FI
ELSE
Print(" record field")
FI
RETURN(0)
FI
IF et&$10 THEN ; ARRAY
Print(" ARRAY")
ELSEIF et&$40 THEN ; PROC or FUNC
pfFlag = 1
IF (et&$F7)=$C0 THEN ; PROC
Print("PROC")
ELSE ; FUNC
Print(" FUNC")
FI
FI
RETURN(pfFlag)
PROC PrintEntry(STRING n)
DEFINE MAX = "15"
BYTE i, et
STRING name(MAX+1), t
BYTE ARRAY argTypes
; get the name
SetBlock(name+1, MAX, '.)
SCopyS(name, n, 1, MAX)
name(0) = MAX
; get address of entry info
e = n + n(0) + 1
et = e.vtype
IF et=$88 THEN RETURN FI ; undeclared
PrintF("%S ",name)
IF et=27 THEN ; DEFINE
Print(" ")
ELSE
PrintH(e.adr)
FI
Put(' )
IF GetType(et) THEN ; PROC or FUNC
Put('()
argTypes = e + 3
t=""
FOR i = 1 TO e.numargs DO
Print(t)
GetType(argTypes(i)%$80)
t = ", "
OD
Put('))
FI
PutE()
RETURN
PROC DumpST(CARD POINTER base)
CARD loc, i
BYTE low=loc, high=loc+1, ibest
BYTE ARRAY stLow, stHigh, flags(256)
STRING best, worst(0)="|"
Zero(flags, 256)
stHigh = base^
stLow = stHigh + 256
DO
best = worst
FOR i = 0 TO 255 DO
high = stHigh(i)
IF high#0 AND flags(i)=0 THEN
low = stLow(i)
IF SCompare(loc, best)<0 THEN
best = loc
ibest = i
FI
FI
OD
IF best=worst THEN EXIT FI
flags(ibest) = 1
PrintEntry(best)
OD
RETURN
PROC Save()
; save state of variables used by
; both compiler and library routines
bank(0) = 0 ; init library routines
tZop = Zop
MoveBlock(zpage, $B0, $1B) ; to $CA
MoveBlock(temps, $5F0, 16)
device = 5
RETURN
PROC Restore()
; restore state of variables used by
; both compiler and library routines
Zop = tZop
MoveBlock($B0, zpage, $1B) ; to $CA
MoveBlock($5F0, temps, 16)
; device = oldDevice
bank(curBank) = 0
RETURN
PROC SegEnd()
Save()
IF pf THEN ; print locals
PrintF("%ELocal declarations for %S:%E", curproc)
DumpST($B3)
ELSE
pf = 1
FI
Restore()
RETURN
BYTE FUNC DclEnd()
BYTE token=$C2
CARD addr1, addr2
DEFINE PLA = "$68",
STA = "$8D",
LDA = "$AD",
PHA = "$48"
; find out where we came from
~[
PLA
STA addr1
PLA
STA addr1+1
PLA
STA addr2
PLA
STA addr2+1
PHA
LDA addr2
PHA
LDA addr1+1
PHA
LDA addr1
PHA
]
IF addr2<$B000 THEN ; new MODULE
SegEnd()
pf = 0
FI
RETURN(token)
PROC SPL() ; dummy proc for call below
PROC SPLEnd()
BYTE nxttoken=$D3
CARD codeBase=$491, codeSize=$493
CARD nxtaddr=$C9
STRING inbuf(0)=$5C8, name
DEFINE PLA = "$68",
STA = "$8D"
; oldDevice = device
Save()
Close(5) Open(5, "P:", 8)
IF nxttoken=30 THEN ; command line
name = nxtaddr
ELSE ; editor buffer
name = inbuf
FI
PrintF("%E%ESymbol Table for %S%E%E", name)
pf = 0 ; no proc decl yet
; JSR for return so that we come
; back here after compilation
~[
PLA
STA SPL+1
PLA
STA SPL+2
]
SPL = SPL + 1 ; get right address
Restore()
SPL()
Save()
IF pf THEN ; print locals
PrintF("%ELocal declarations for %S:%E", curproc)
DumpST($B3)
FI
PrintF("%E%EGlobal declarations:%E%E")
DumpST($B1)
PrintF("%E%ECode base = %H, code size = %U%E",
codeBase, codeSize)
Close(5)
Restore()
RETURN
; only code generated before Init is
; allocated space. Init will be
; garbage collected (well kind of).
PROC Init()
CARD codeBlock, bsize, csize, nBlock
CARD POINTER cur, next
CARD ARRAY codeBase=$491
; link in our routines
Segvec.op = JMP
Segvec.addr = SegEnd
Dclvec.op = JMP
Dclvec.addr = DclEnd
SPLvec.op = JMP
SPLvec.addr = SPLEnd
; allocate our routine so it won't
; go away.
codeBlock = codeBase^ - 4
next = $80 ; AFbase
DO
cur = next
next = next^
UNTIL next=0 OR next=codeBlock OD
IF next=0 THEN
PutE() Put($FD)
PrintE("I can't allocate space for your code")
PrintE("You better Boot and try again!")
RETURN
FI
; assume we can split block
csize = @codeBlock-codeBlock
nBlock = next^
bsize = next(1) - csize
next = @codeBlock
cur^ = next
next^ = nBlock
next(1) = bsize
codeBase^ = @codeBlock
RETURN
MODULE ; SYS.ACT PROC Clos=$2221 (BYTE d) PROC Output=$2229 (BYTE d, BYTE ARRAY s) PROC In=$222F (BYTE d, BYTE ARRAY s) PROC XIOstr=$2239 (BYTE d,x,c,a1,a2,BYTE ARRAY s) PROC Opn=$226E (BYTE d,BYTE ARRAY s,BYTE m,o) PROC Prt=$2277 (BYTE d,BYTE ARRAY s) PROC Error=$2292 (BYTE err) PROC Break=$229F () SET $4E4=$22A9 ;LShift SET $4E6=$22B8 ;RShift SET $4E8=$2322 ;MultI SET $4EA=$2357 ;DivI SET $4EC=$23A5 ;RemI SET $4EE=$23AD ;SArgs PROC ChkErr=$23ED (BYTE r,b,eC) PROC Break1=$2406 (BYTE err) PROC Open=$2411 (BYTE d,BYTE ARRAY f,BYTE m,a2) PROC PrintE=$243B (BYTE ARRAY s) PROC PrintDE=$2442 (BYTE d,BYTE ARRAY s) PROC Close=$2448 (BYTE d) PROC Print=$244E (BYTE ARRAY s) PROC PrintD=$2455 (BYTE d,BYTE ARRAY s) PROC InS=$245B () PROC InputS=$246F (BYTE ARRAY s) PROC InputSD=$2476 (BYTE d,BYTE ARRAY s) PROC InputMD=$247C (BYTE d,BYTE ARRAY s,BYTE m) PROC InputD=$248A (BYTE d,BYTE ARRAY s) CHAR FUNC GetD=$2490 (BYTE d) PROC CCIO=$2492 () PROC PutE=$24AF () PROC Put=$24B1 (CHAR c) PROC PutD=$24B4 (BYTE d,CHAR c) PROC PutD1=$24B8 () PROC PutDE=$24BD (BYTE dev) PROC XIO=$24C1 (BYTE d,f,c,a1,a2,BYTE ARRAY s) PROC CToStr=$24C7 () PROC PrintB=$24E7 (BYTE n) PROC PrintC=$24E9 (CARD n) PROC PNum=$24EE () PROC PrintBE=$24F8 (BYTE n) PROC PrintCE=$24FA (CARD n) PROC PrintBD=$2500 (BYTE d, n) PROC PrintCD=$2502 (BYTE d, CARD n) PROC PrintBDE=$2511 (BYTE d,n) PROC PrintCDE=$2513 (BYTE d,CARD n) PROC PrintI=$251B (INT n) PROC PrintID=$2522 (BYTE d,INT n) PROC PrintIE=$253F (INT n) PROC PrintIDE=$2545 (BYTE d,INT n) PROC StrB=$254D (BYTE n, BYTE ARRAY s) PROC StrC=$2555 (CARD n, BYTE ARRAY s) PROC StrI=$2564 (INT n, BYTE ARRAY s) BYTE FUNC InputB=$2591 () CARD FUNC InputC=$2591 () INT FUNC InputI=$2591 () BYTE FUNC InputBD=$2593 (BYTE d) CARD FUNC InputCD=$2593 (BYTE d) INT FUNC InputID=$2593 (BYTE d) BYTE FUNC ValB=$25A3 (BYTE ARRAY s) CARD FUNC ValC=$25A3 (BYTE ARRAY s) INT FUNC ValI=$25A3 (BYTE ARRAY s) PROC PrintH=$2616 (CARD n) PROC PrintF=$263F (BYTE ARRAY f, CARD a1,a2,a3,a4,a5) PROC PF2=$265C () PROC Note=$26B7 (BYTE d,CARD POINTER s,BYTE POINTER o) PROC Point=$26DE (BYTE d,CARD s,BYTE o) PROC Graphics=$2708 (BYTE m) PROC Position=$2736 (CARD c,BYTE r) PROC Pos1=$273C () PROC GrIO=$2743 () PROC DrawTo=$27BF (CARD c,BYTE r) BYTE FUNC Locate=$2767 (CARD c,BYTE r) PROC Plot=$276F (CARD c,BYTE r) PROC SetColor=$277A (BYTE reg,hue,lum) PROC Fill=$2795 (CARD c,BYTE r) BYTE FUNC Rand=$279D (BYTE r) PROC Sound=$27B0 (BYTE v, p, d, vol) PROC SndRst=$27DC () BYTE FUNC Paddle=$27E3 (BYTE p) BYTE FUNC PTrig=$27EA (BYTE p) BYTE FUNC Stick=$2801 (BYTE p) BYTE FUNC STrig=$281A (BYTE p) BYTE FUNC Peek=$2821 (CARD a) CARD FUNC PeekC=$2821 (CARD a) PROC Poke=$2831 (CARD a,BYTE v) PROC PokeC=$283B (CARD a,v) PROC Zero=$2844 (BYTE POINTER a,CARD s) PROC SetBlock=$284A (BYTE POINTER a,CARD s,BYTE v) PROC MoveBlock=$286D (BYTE POINTER d,s,CARD sz) INT FUNC SCompare=$2894 (BYTE ARRAY a,b) PROC SCopy=$28C8 (BYTE ARRAY d,s) PROC SCopyS=$28DF (BYTE ARRAY d,s,BYTE b,e) PROC SAssign=$2908 (BYTE ARRAY d,s,BYTE b,e) MODULE ; for user