* * цHEAPASS LINKER * * лINKER (RELOCATABLE) FILES ARE STORED AS * [цODE] * [LOCAL ADDRESSES] * [ENTRY POINTS] * [EXTERNALS] * * [EXTERNALS]: * NAME * OFFSET 2 BYTES * SIZE/OFFSET 1 BYTE * * [ENTRY POINTS]: * NAME * VALUE 2 BYTES (3RD BYTE ADDED AT LINK TIME) * * [LABELS]: * OFFSET 2 BYTES * # OF RELS 1 BYTE * IF HIGH BIT SET THEN * VALUE 3 BYTES * SIZE/OFFSET 1 BYTE * * нOTE: USES орг $020000 TO FORCE 16-BITS DURING ASSEMBLY * * слй 9/99-12/99 * * орг $8000 ═рел * дск '@0:LINK' теьтп═=═$ф9Ю;POINTER TO TEXT неьтцхар═еьт дорг═еьт цоделен═еьт гетерр═еьт прхеь═еьт ластдеж═еьт строут═еьт цхроут═=═$ффд2 сетлфс═=═$ффба сетнам═=═$ффбд лоад═=═$ффд5 поинт═=═$8д темп═=═$фц жарпнт═=═$ф7 цоунт═=═$фф буфф═=═$0200 лоададдр═=═$020000 енттаб═=═$8000 маьент═=═$9800 еьттаб═=═$9800Ю;басиц SWITCHED OUT маьеьт═=═$д000 линкид═ент ═да═$ц64 линк═ент ═лда═#00 ═ста═енттаб ═ста═еррфлаг ═лда═#<еьттаб ═ста═еьттабтоп ═лда═#>еьттаб ═ста═еьттабтоп+1 ═лда═дорг ═ста═линкаддр ═лда═дорг+1 ═ста═линкаддр+1 ═лда═дорг+2 ═ста═линкаддр+2 ═лда═#<лоададдр ═ста═филеаддр ═лда═#>лоададдрЮ;$020000 ═ста═филеаддр+1 ═лда═#^лоададдр :лооп═ста филеаддр+2 ═йср неьтфиле ═бне═:ц0 ═ймп═:доне :ц0═лда═еррфлаг ═бея═:цонт :йсец═ймп═:сец :цонт ═йср═строут ═тьт═' $',00 ═лда═линкаддр+1 ═йср═прхеь ═лда═линкаддр ═йср═прхеь ═лда═#13 ═йср цхроут ═лда бинфлаг ═бне :цонт1 ═йср═цхецкид ═лда═еррфлаг ═бне═:йсец ═йср═строут ═тьт═' ADDEXT:',00 ═йср═аддеьт ═лда═еррфлаг ═бне═:йсец ═йср═строут ═дфб═13 ═тьт═' ADDENT:',00 ═йср═аддент ═лда═еррфлаг ═бне═:йсец ═йср═строут ═дфб═13 ═тьт═' FIXLOC:',00 ═йср═фиьлоцалс ═лда═еррфлаг ═бне═:сец :цонт1 ═лда═ластлинк ═сец ═сбц═филеаддр ═ста═темп ═лда═ластлинк+1 ═сбц═филеаддр+1 ═ста═темп+1Ю;SIZE ═лда═линкаддрЮ;ADVANCE POINTER ═цлц ═адц═темп ═ста═линкаддр ═лда═линкаддр+1 ═адц═темп+1 ═ста═линкаддр+1 ═бцц═:цонт2 ═инц═линкаддр+2 :цонт2 ═лда═ластлинк ═ста═филеаддр ═лда═ластлинк+1 ═ста═филеаддр+1 ═лда═ластлинк+2 ═лды═#00Ю;цLEARED IN неьтфиле ═ймп═:лооп :доне═лда═филеаддр ═сец ═сбц═#<лоададдр ═ста═цоделен ═лда═филеаддр+1 ═сец ═сбц═#>лоададдрЮ;сTARTS AT $1000 ═ста═цоделен+1 ═йср═строут ═дфб═$0д ═тьт═'RESOLVING EXTERNALS...' ═дфб═$0д,00 ═йср═ресолже ═до═0 ═сеи ═цлцЮ;цOPY TO $020000 ═дфб═$фбЮ;XCE ═дфб═$ц2,$30Ю;REP #$30 ═дфб═$а2 ═да═лоададдрЮ;LDX #лоададдр ═дфб═$а0,00,00Ю;LDY #0000 ═лда═цоделен ═дфб═$54,$02,$00Ю;MVN $00,$02 ═сец ═дфб═$фб ═лда═#00 ═пха ═дфб═$абЮ;плб ═цли ═фин ═лда═еррфлаг :сец═цмп═#1 ═ртс еррфлаг═дфб═00 линкаддр═дс═3Ю;сUPPOSED MODULE START ADDRESS филеаддр═дла═$010000Ю;аCTUAL START ADDRESS * рEAD NEXT FILE бинфлаг═дфб 00 неьтфиле ═йср═неьтцхар ═бея :еьит ═бцц═неьтфилеЮ;ц SET -> END OF LINE ═лдь #00 ═стз бинфлаг ═лда [теьтп],ыЮ;BINARY CHECK ═цмп #'^' ═бне :цопы ═ста бинфлаг ═ины :цопы═лда═[теьтп],ы ═бея :доне ═ста═буфф,ь ═цмп═#224 ═бея═:доне ═анд═#$7ф ═цмп #32 ═бея═:доне ═цмп═#13 ═бея═:доне * йср цхроут ═инь ═ины ═бне═:цопы :доне ═тыа ═цлц ═адц═теьтп ═ста═теьтп ═бцц═:ц0 ═инц═теьтп+1 ═бне═:ц0 ═инц═теьтп+2 :ц0 ═тьаЮ;LENGTH ═лдь═#<буфф ═лды═#>буфф ═йср═сетнам ═лда═#7 ═лдь═ластдеж ═лды═#$фф ═йср═сетлфс ═лдь═филеаддр ═лды═филеаддр+1 ═лда═филеаддр+2 ═ста═$б0 ═лда═#0 ═йср═лоад ═бцс═:ерр ═лдь═$ае ═лды═$аф ═лда═$б0 ═сть═ластлинк ═сты═ластлинк+1 ═ста═ластлинк+2 ═лда═#$фф :еьит═ртс :ерр═йср═$ффццЮ;CLRCHN ═йср═гетерр ═инц═еррфлаг ═ртс * * цHECK ID * цхецкид ═лда═ластлинк ═сец ═сбц═#2 ═ста═поинт ═ста═ластлинк ═лда═ластлинк+1 ═сбц═#00 ═ста═поинт+1 ═ста═ластлинк+1 ═лда═ластлинк+2 ═сбц═#00 ═ста═поинт+2 ═ста═ластлинк+2 ═лды═#00 ═лда═[поинт],ы ═цмп═линкид ═бне═:ерр ═ины ═лда═[поинт],ы ═цмп═линкид+1 ═бне═:ерр ═ртс :ерр═инц═еррфлаг ═йср═строут ═тьт═'NOT A LINK MODULE' ═дфб═13,00 * пла * пла ═ртс * * гетлинк -- гETLINK READS THE BACKWARDS LINK FROM THE FILE * JUST READ IN AND STORES IT IN поинт AND ластлинк. * * оN ENTRY: ластлинк POINTS TO THE CURRENT DATA BLOCK * оN EXIT: поинт AND ластлинк POINT TO THE NEXT DATA BLOCK * ластлинк═дс═3 блоцксизе дс═2 гетлинк ═лда═ластлинкЮ;сTART OF LAST BLOCK ═сец ═сбц═#2 ═ста═поинт ═лда═ластлинк+1 ═сбц═#00 ═ста═поинт+1 ═лда═ластлинк+2 ═сбц═#00 ═ста═поинт+2 ═лды═#0 ═лда═[поинт],ы ═ста═блоцксизе ═ины ═лда═[поинт],ы ═ста═блоцксизе+1 ═лда═поинт ═сец ═сбц═блоцксизе ═ста═поинт ═ста═ластлинк ═лда═поинт+1 ═сбц═блоцксизе+1 ═ста═ластлинк+1 ═ста═поинт+1 ═лда═поинт+2 ═сбц═#00 ═ста═ластлинк+2 ═ста═поинт+2 ═ртс * * аджанце -- гO TO NEXT CHUNK WITHIN DATA BLOCK * AND UPDATE блоцксизе * * оN ENTRY: .ы = SIZE OF CHUNK, поинт -> BLOCK * оN EXIT: з SET IF AT END OF BLOCK * аджанце ═тыа ═цлц ═адц═поинт ═ста═поинт ═бцц═:ц1 ═инц═поинт+1 ═бне═:ц1 ═инц═поинт+2 :ц1 ═сты═цоунт ═лда═блоцксизе ═сец ═сбц═цоунт ═ста═блоцксизе ═бцс═атенд ═дец═блоцксизе+1 ═бпл═атенд ═инц═еррфлаг ═йср═строут ═тьт═'BLOCK SIZE ERROR' ═дфб═13,00 ═пла ═пла ═ртс атенд ═лда═блоцксизе ═ора═блоцксизе+1 ═ртс * * финджар -- лOCATE VARIABLE IN (POINT) IN TABLE * * ц SET -> VAR FOUND; ц CLEAR -> NOT FOUND * финджар ═лда═#<енттаб ═ста═жарпнт ═лда═#>енттаб ═ста═жарпнт+1 :лооп1═лды═#$фф :л2═ины ═лда═(жарпнт),ы ═бея═:нопе ═бми═:тест ═цмп═(поинт),ы ═бея═:л2 :неьт═лда═(жарпнт),ы ═бми═:адд ═ины ═бне═:неьт :адд═ины ═ины ═тыа ═сецЮ;+3 ═адц═жарпнт ═ста═жарпнт ═бцц═:лооп1 ═инц═жарпнт+1 ═бне═:лооп1 :тест═цмп═(поинт),ы ═бне═:неьт ═ртс :нопе═цлц ═ртс * * аDD ALL ENTRY POINTS/LABELS TO THE ENTRY LIST * * фORMAT OF ENTRIES IS SIMPLY NAME,ADDR (16-BIT OFFSET) * нAME IS TERMINATED BY LASTCHAR+$80 * аддент ═йср═гетлинкЮ;гET LINK POINTER ═йср═атендЮ;цHECK IF AT END OF BLOCK ═бея═:ртс :лооп═йср═финджарЮ;цHECK IF LABEL ALREADY EXISTS ═бцс═:еррор :л1═лда═[поинт],ыЮ;аDD TO TABLE ═ста═(жарпнт),ы ═ины ═анд═#$фф ═бпл═:л1 ═лда═[поинт],ыЮ;аDDRESS VALUE ═цлц ═адц═линкаддрЮ;аCTUAL LOCATION ═ста═(жарпнт),ы ═ины ═лда═[поинт],ы ═адц═линкаддр+1 ═ста═(жарпнт),ы ═ины ═лда═#00 ═ста═(жарпнт),ы ═тыа ═цлц ═адц═жарпнт ═лда═жарпнт+1 ═адц═#00 ═цмп═#>маьент ═бцс═:ерр2 ═йср═аджанце ═бне═:лооп :ртс═ртс :еррор ═инц═еррфлаг ═йср═строут ═тьт═'дUPLICATE ент LABEL:',00 ═лды═#00 :лп═лда═[поинт],ы ═бми═:дп ═йср═цхроут ═ины ═бне═:лп :дп═анд═#$7ф ═йср═цхроут * пла * пла ═лда═#13 ═ймп═цхроут :ерр2═инц═еррфлаг ═йср═строут ═тьт═'тABLE OVERFLOW: TOO MANY ентS.',0D,00 * пла * пла ═ртс * * аддеьт -- аDD EXTERNAL LABELS TO TABLE, TO BE FIXED UP * LATER. дATA BLOCK IS TERMINATED BY 00. * еьттабтоп да═$8000Ю;еND OF TABLE аддеьт ═йср═гетлинк ═лда═еьттабтоп ═ста═темп ═лда═еьттабтоп+1 ═ста═темп+1 :лооп═лды═#00 ═лда═блоцксизе ═ора═блоцксизе+1 ═бея═:доне :л1 ═лда═[поинт],ы ═ста═(темп),ы ═бми═:фиь ═ины ═бне═:л1 :фиь═ины ═лда═[поинт],ы ═цлц ═адц═филеаддрЮ;ACTUAL OFFSET ═ста═(темп),ы ═ины ═лда═[поинт],ы ═адц═филеаддр+1 ═ста═(темп),ы ═ины ═лда═[поинт],ы ═ста═(темп),ыЮ;SIZE/OFF ═ины ═тыа ═цлц ═адц═темп ═ста═темп ═бцц═:ц2 ═инц═темп+1 ═лда═темп+1 ═цмп═#>маьеьт ═бцс═:еррор :ц2 ═йср═аджанце ═бне═:лооп :доне═лда═#00 ═таы ═ста (темп),ы ═лда═темп ═ста═еьттабтоп ═лда═темп+1 ═ста═еьттабтоп+1 ═ртс :еррор═инц═еррфлаг ═йср═строут ═тьт═'тABLE OVERFLOW: TOO MANY еьтS!',0D,00 * пла * пла ═ртс * * фиьлоцалс -- фIX UP ALL "LOCAL" RELATIVE LABELS. * * тHE DATA FORMAT IS PREDICATED ON THE IDEA THAT MOST OF * THE LABELS TO BE RESOLVED WILL BE PLAIN 16-BIT LABELS. * * мOST ENTRIES ARE THREE BYTES: OFFSET AND NUMBER OF * TIMES TO ADD OFFSET. * * иF NUMBER OF OFFSETS IS >= $80, THEN THE NEXT THREE * BYTES ARE ADDRLO ADDRHI SIZE/OFFSET -- A 16-BIT VALUE * (BANK = LINK BANK) WITH SIZE/OFFSET DETERMINING THE SIZE * OF THE NUMBER (NUMBER OF BYTES) STARTING AT BYTE * "OFFSET". * * тHE LATTER METHOD MAKES INSTRUCTIONS LIKE лда #<табле * AND лда ^лабел POSSIBLE. * * иF # OF OFFSETS > $C0, THEN IT IS A NEGATIVE NUMBER OF * OFFSETS, E.G. да -старт * * сINCE рел FILES HAVE орг = $010000, 24-BIT ADDRESSES ARE * FIXED UP AT LINK TIME. * жал═дс═5Ю;+2 FOR STRANGE OFFSETS сизе═дфб═00Ю;сIZE бытеофф═дфб═00Ю;бYTE OFFSET фиьлоцалс ═йср═гетлинк ═йср═атенд ═бея═:ртс :лооп═лды═#00 ═лда═[поинт],ыЮ;рELATIVE LOCATION ═цлц ═адц═филеаддрЮ;PHYSICAL LOCATION ═ста═темп ═ины ═лда═[поинт],ы ═адц═филеаддр+1 ═ста═темп+1 ═лда═филеаддр+2 ═адц═#00 ═ста═темп+2 ═иныЮ;.ы = 2 ═лда═[поинт],ы ═ста═цоунтЮ;нUMBER OF OFFSETS ═бея═:неьт ═бпл═:адд ═цмп═#$ц0 ═бцц═:специал * йср дебуг :суб═лды═#00 ═лда═[темп],ы ═сец ═сбц═линкаддрЮ;LINK LOCATION ═ста═[темп],ы ═ины ═лда═[темп],ы ═сбц═линкаддр+1 ═ста═[темп],ы ═инц═цоунтЮ;NEGATIVE ═бне═:суб ═бея═:лды :адд═лды═#00 ═лда═[темп],ы ═цлц ═адц═линкаддрЮ;LINK LOCATION ═ста═[темп],ы ═ины ═лда═[темп],ы ═адц═линкаддр+1 ═ста═[темп],ы ═дец═цоунт ═бне═:адд :лды═лды═#2Ю;RESTORE .ы :неьт═ины ═йср═аджанце ═бне═:лооп :ртс═ртс :специал═анд═#$7ф ═ста═цоунт ═ины ═лда═[поинт],ы ═ста═жал ═ины ═лда═[поинт],ы ═ста═жал+1 ═лда #00 ═ста═жал+2 ═иныЮ;.ы=5 ═лда═[поинт],ы ═анд═#$0ф ═ста═бытеофф ═лда═[поинт],ы ═лср ═лср ═лср ═лср ═ста═сизе ═лда═цоунт ═бея :адйустЮ;сHOULD нот HAPPEN ═лда сизе ═цмп #3Ю;сериоус клудге ═бне :л2Ю;аVERT THINE EYES! ═лды #2Ю;LOOK AWAY, FOOL!! ═лда [темп],ы ═ста жал+2Ю;тO MAKE лда $030000+LABEL WORK CORRECTLY :л2═лда═линкаддр ═цлц ═адц═жал ═ста═жал ═лда═линкаддр+1 ═адц═жал+1 ═ста═жал+1 ═лда═линкаддр+2 ═адц═жал+2 ═ста жал+2 ═лда жал+2Ю;орг=$010000 FIX ═бне :ц0Ю;-$010000 FOR EVERY OFFSET ═лда жал+3 ═бне :ц1 ═дец жал+4 :ц1═дец жал+3 :ц0═дец жал+2 ═дец цоунт ═бне═:л2 :адйуст ═лды═#00 ═лдь═бытеофф :л3═лда═жал,ь ═ста═[темп],ы ═инь ═ины ═дец═сизе ═бне═:л3 ═лды═#5Ю;RESTORE .ы ═ймп═:неьт ═DO═0 дебуг ═йср═прхеь ═лда═#'@' ═йср═$ффд2 ═лда═темп+1 ═йср═прхеь ═лда═темп ═йср═прхеь ═лда═#'(' ═йср═$ффд2 ═лды═#00 ═лда═(темп),ы ═йср═прхеь ═лда═#' ' ═йср═$ффд2 ═ины ═лда═(темп),ы ═йср═прхеь ═лда═#')' ═йср═$ффд2 ═лда═#' ' ═ймп $ффд2 ═FIN * рESOLVE EXTERNAL LABELS ресолже ═лда═#<еьттаб ═ста═поинт ═лда═#>еьттаб ═ста═поинт+1 :лооп═лды═#00 ═лда═(поинт),ы ═бея═:ртс ═йср═финджар ═бцц═:ерр ═ины ═лда═(жарпнт),ы ═ста═жал ═ины ═лда═(жарпнт),ы ═ста═жал+1 ═лда═линкаддр+2 ═ста═жал+2 ═деы ═лда═(поинт),ыЮ;лOCATION ═ста═темп ═ины ═лда═(поинт),ы ═ста═темп+1 ═лда═#^лоададдр ═ста═темп+2 ═ины ═сты═цоунтЮ;TEMP ═лда═(поинт),ы ═бми═:специал ═анд═#$0ф ═ста═бытеофф ═лда═(поинт),ы ═лср ═лср ═лср ═лср ═бея═:неьт ═ста═сизе ═лды═#00 ═лдь═бытеофф :л3═лда═жал,ь ═ста═[темп],ы ═инь ═ины ═дец═сизе ═бне═:л3 :неьт═лда═цоунт ═сецЮ;ADVANCE ═адц═поинт ═ста поинт ═бцц═:лооп ═инц═поинт+1 ═бне═:лооп :ртс═ртс :специал═лды═#00 ═лдь═#2 ═цмп═#$ц0 ═бея═:лсуб ═цмп═#$80 ═бне═:ерр ═цлц :ладд═лда═[темп],ы ═адц жал,ы ═ста═[темп],ы ═ины ═деь ═бне═:ладд ═бея═:неьт :лсуб═лда═[темп],ыЮ;ц STARTS SET ═сбц═жал,ы ═ста═[темп],ы ═ины ═деь ═бне═:лсуб ═бея═:неьт :ерр═инц еррфлаг ═йср строут ═тьт═'UNRESOLVED еьт:',00 ═лды═#00 :л2═лда═(поинт),ы ═бми═:ц2 ═йср═цхроут ═ины ═бпл═:л2 :ц2═анд═#$7ф ═йср═цхроут * пла * пла ═лда═#13 ═ймп═цхроут ═до═0 строут ═пла ═таь ═пла ═ста═:лооп+2 :лооп═лда═$ц000,ь ═бея═:доне ═йср═$ффд2 ═инь ═бне═:лооп ═инц═:лооп+2 ═бне═:лооп :доне═лда═:лооп+2 ═пха ═тьа ═пха ═ртс ═фин