> Link/s v1.03 15-Feb-2000 D Link BASIC program by removing unused functions and procedures ) v1.00 12-Sep-1999 JGH: Initial code (: v1.01 15-Feb-2000 JGH: Moved code to BASIC workspace 2> v1.02 16-Feb-2000 JGH: general tidying up and optimising <: v1.03 16-Feb-2000 JGH: Removes duplicate definitions F: P assem: Z: dabc:abc:able: n: x ݤxyz(z) ݤxy:=0 : able:"1": able:"2": : assem $ver$="1.03 (16-Feb-2000)":ver%=3 9lptr=&70:loff=&72:dptr=&73:doff=&75:dtmp=&76:otop=&78 +lomem=&00:vartop=&02:top=&12:PageHi=&18 $tknDEF=&DD:tknPROC=&F2:tknFN=&A4 osbyte=&FFF4 :  mcode% &300:load%=&0500  P=0 1:opt%=P*2+4 P%=load%:O%=mcode%  [OPT opt% " .exec% ,5JMP start:BRK:BRK:BRK :\ Header identifies 65EQUB &62 :EQUB copy-exec% :\ this as 6502 code @0EQUB ver%:EQUS "Link" :\ Program name J3EQUB &00 :EQUS ver$ :\ Program version T .copy ^)EQUB &00:EQUS "(C)J.G.Harston":EQUB 0 hEQUD load% r: | .start *TSX:LDY &102,X:INY:CPY #&F9:BCC NoTube @LDA &103,X:STA &EE:STA &F2 :\ Restore caller's environment LDA &104,X:STA &EF:STA &F3  .NoTube CLDA #187 :\ Check BASIC is current language  .ChkBasic 'STX lptr:LDX #0:LDY #255:JSR osbyte  #71:CMP #187:BNE ChkBasic 'TXA: lptr: #63:BEQ RunningInBasic (BRK:EQUB 249:EQUS "Not in BASIC":BRK : .RunningInBasic : 7\ Everything prior to here can be used as workspace :  \ Method: &\ Scan through program 0\ If line starts then: :0\ Scan from here looking for duplicate D=\ If duplicate found, remove definition, jump to loop N0\ Scan through program looking for match X/\ If match not found, remove definition b\ Loop until end of program l: v.ScanProgram DLDA top+0:STA otop+0:LDA top+1:STA otop+1 :\ Remember current P LJSR GetPAGE :\ Point lptr to start of prog .ScanLineNext EJSR ScanForDEF:BCC ScanCheckDone :\ No found, check if finished : #\ found, look for a duplicate %\ ------------------------------- .DefFindDuplicate 3JSR SkipSpaceLPTR :\ Step past DJSR LPTRtoDPTR:STY doff :\ Save pointer and offset of .DefFindLoop 7JSR AddLineLPTR :\ lptr=>next line :JSR ScanForDEF :\ Look for another FBCC CheckIfCalled :\ End of program, look for calls  3JSR SkipSpaceLPTR :\ Step past "\ (lptr),loff=>'/' in search  &\ (dptr),doff=>'/' in definition *9JSR CompareID :\ Compare / names 4CBCS DefFindLoop :\ Doesn't match, keep looking >JBCC RemoveDEF :\ Duplicate found, remove this one H: R.ScanCheckDone \GLDA top+0:CMP otop+0:BNE ScanProgram :\ Keep looping until program fDLDA top+1:CMP otop+1:BNE ScanProgram :\ not reducable any more pRTS z: @\ Any duplicate s removed, check if this is actually called B\ ------------------------------------------------------------ G\ If we've got here, there must be at least one line in the program 6\ So, we can omit the initial end-of-program check .CheckIfCalled CJSR GetPAGE :\ Point lptr to start of prog .SearchLine  LDY #3 .SearchForCall MJSR SkipSpaceLPTR :\ Find next non-space character of line MCMP #tknDEF:BEQ SearchSkipDEF :\ If , skip it so doesn't match itself 1CMP #tknFN:BEQ FoundCall :\ Found a 1CMP #tknPROC:BEQ FoundCall :\ Found a 5CMP #13:BNE SearchForCall :\ Loop until CR 9JSR AddLineLPTR:BNE SearchLine :\ Jump to next line BBEQ RemoveDEF :\ Not found, so remove the $.SearchSkipDEF .!JSR SkipSpaceLPTR:JSR ChkChar 8?BCS SearchSkipDEF :\ Skip to end of / name B>DEY:BCC SearchForCall :\ Look for next / call L: V.FoundCall `"\ (lptr),Y =>'/' in caller j&\ (dptr),doff=>'/' in definition t9JSR CompareID :\ Compare / names ~GBCS SearchForCall :\ Names don't match, keep looking MJSR DPTRtoLPTR :\ Names match, point back to definition 9JSR AddLineLPTR :\ Step to next line ?JMP ScanLineNext :\ Loop to check next line : "\ Remove unused or duplicate $\ ------------------------------ "\ (lptr),loff=>'/' in caller &\ (dptr),doff=>'/' in definition .RemoveDEF 0JSR DPTRtoLPTR :\ lptr=dptr !LDA lptr+1:PHA:LDA lptr+0:PHA 8.FindNextDEF :\ Move to next line ;JSR AddLineLPTR:BEQ RemThisDEF :\ Found end of program  BINY:INY:JSR SkipSpaceLPTR :\ Get first character of line Start of this definition <&\ (lptr)=>Start of next definition F LDY #0 PE.RemoveLine :\ Now chop out from lptr to dptr Z/JSR CopyChar:JSR CopyChar :\ d;CMP #&FF:BEQ RemoveEnd :\ Found end of program n, save x.RemoveText 'JSR CopyChar:CMP #13:BNE RemoveText JSR DPTRtoLPTR :\ lptr=new end of program 6LDA #2:JSR AddAtoLPTR :\ Point to new P 0LDA lptr+0:STA top+0 :\ Update P LDA lptr+1:STA top+1 CPLA:STA lptr+0:PLA:STA lptr+1 :\ Point back to just removed 9JMP ScanLineNext :\ Scan again for a :  .CopyChar %LDA (lptr),Y:STA (dptr),Y:INY:RTS ": ,?.GetPAGE :LDA #0:STA lptr+0:LDA PageHi:STA lptr+1:RTS 6C.LPTRtoDPTR :LDA lptr+0:STA dptr+0:LDA lptr+1:STA dptr+1:RTS @C.DPTRtoLPTR :LDA dptr+0:STA lptr+0:LDA dptr+1:STA lptr+1:RTS JD.SkipSpaceLPTR :INY:LDA (lptr),Y:CMP #" ":BEQ SkipSpaceLPTR:RTS T'.AddLineLPTR :LDY #3:LDA (lptr),Y ^F.AddAtoLPTR :CLC:ADC lptr:STA lptr:LDA #0:ADC lptr+1:STA lptr+1 h4.ChkEndLPTR :LDY #1:LDA (lptr),Y:CMP #&FF:RTS r: |'\ Look for a line starting with a )\ ----------------------------------- .ScanForDEF 5JSR ChkEndLPTR:BEQ ScanDefEnd :\ End of program .ScanDefLine '/' in search &&\ (dptr),doff=>'/' in definition 0.CompareID :STY loff:LDA doff:STA dtmp D.CompareIDlp N;LDY loff:INC loff:LDA (lptr),Y :\ Get search character X;JSR ChkChar:BCC MatchName :\ Found non-valid char b name( '\ dptr-> name( - matching \ or - lptr-> name( .\ dptr-> namesomemore - no match : ELDY dtmp:LDA (dptr),Y :\ Get final char in checked name @LDY loff :\ Fall through into ChkChar J :\ If invalid char, matches, return CC I :\ If valid char, no match, return CS : G.ChkChar :\ CC=Not valid char, CS=valid char  CMP #tknFN:BEQ CharOk CMP #tknPROC:BEQ CharOk  CMP #"z"+1:BCS CharNotOk *CMP #"_":BCS CharOk 4CMP #"Z"+1:BCS CharNotOk >CMP #"A":BCS CharOk HCMP #"9"+1:BCS CharNotOk RCMP #"0":BCS CharOk \.CharNotOk fCLC p .CharOk zRTS : ] >A$="*Save Link "+~mcode%+" "+~O%+" "+~exec%+" "+~load% "Saving: "A$:A$