Ю3* * еL цHEAPO аSSEMBLER * * а SIMPLE AND STRAIGHTFORWARD ASSEMBLER BY * ONE S. JUDD 1998 * ═рел * дск '@0:CHEAPO' теьт═еьт теьтенд═еьт цодефлаг═еьт принтнум═еьт строут═еьт гетерр═еьт гетерр2═еьт опенерр═еьт свапбанк═еьт линк═еьт линкид═еьт ; орг $1000 жартаб═=═$ц000 филебуф═=═$00бф00 буффер═=═$0200Ю;тEXT BUFFER еьттаб═=═$03ц000 поинт═=═$фе жарпнт═=═$фц теьтп═=═$ф9 цодеп═=═$5д цод═=═$50 релп═=═$57 еьтп═=═$5а темпы═=═$ц0 темп═=═$ц1 темпь═=═$ц2 фац1═=═$60 фац2═=═$69 сетлфс═=═$ффба сетнам═=═$ффбд опен═=═$ффц0 цлосе═=═$ффц3 цхкин═=═$ффц6 цхкоут═=═$ффц9 цлрцхн═=═$ффцц цхроут═=═$ффд2 лоад═=═$ффд5 стоп═=═$ффе1 гетин═=═$ффе4 цлалл═=═$ффе7 * еRRORS бадлине═=═1 бадоп═=═2 бадмоде═=═3 баднум═=═4 баджар═=═5 баджмем═=═6Ю;тOO MANY VARIABLES сынерр═=═7 бадфиь═=═8 пхасерр═=═9 дупжар═=═10 бадбран═=═11 бадарг═=═12 илжар═=═13 нояуоте═=═14 дискерр═=═15 путон═=═16 путмем═=═17 нотрел═=═18 рел1═=═19 еьтерр═=═20 линкерр═=═$фф ассембле═ент инит ═лда═#1 ═ста═пасс ═лда═$ба ═цмп═#8 ═бцс═:ц1 ═лда═#8 :ц1═ста═ластдеж ═лда═#00 ═ста $9д ═ста═еррор ═ста═жартаб ═ста═дфбфлаг ═ста═цодефлаг * ста прфлаг ═ста═еьтблах ═лда═#$фф ═ста═срег ═ста═дофлаг ═ста═филеопен ═ста═атеоф ═ста═релфлаг ═лда═#4Ю;фILE 4 = OUTPUT ═лдь═#3Ю;SCREEN ═йср═сетлфс ═йср═опен ═лда═#<еьттаб ═ста═еьтп ═лда═#>еьттаб ═ста═еьтп+1 ═лда═#^еьттаб ═ста═еьтп+2 инит2 ═лдь═#2 :л0═лда═цод,ь ═ста═релп,ь ═ста═цодеенд,ь ═деь ═бпл═:л0 ═лда═#00Ю;дEFAULT $ц000 ═ста═цурлине ═ста═цурлине+1 ═ста═нбытес ═ста═нбытес+1 ═ста═цодеп ═ста цодеп+2 ═ста═дорг ═ста═дорг+2 ═ста═регфлаг ═ста═линкфлаг ═лда═#$ц0 ═ста═цодеп+1 ═ста═дорг+1 ═ста═$9дЮ;кERNAL MESSAGES ON ═лда═#00Ю;аLWAYS $020000 ═ста═цод ═ста═цод+1 ═лда═#02 ═ста═цод+2 ═лда═#01 ═ста═ьлен ═ста═млен ═лда═#$фф ═ста═срег ═лда═теьт ═ста═теьтп ═лда═теьт+1 ═ста═теьтп+1 ═лда═теьт+2 ═ста═теьтп+2 ═лда═#<жартаб ═ста═ластглоб ═лда═#>жартаб ═ста═ластглоб+1 невреад═стз невфиле реад═лда═$91Ю;стоп KEY ═бми═:ц00 ═ймп═фиьфилес :ц00═цмп═дебоунце ═бея═:ц0 ═ста═дебоунце ═цмп═#$фдЮ;_ KEY ═бне═:ц0 ═еор═прфлаг ═ста═прфлаг :ц0 ═инц═цурлине ═бне═:ц1 ═инц═цурлине+1 :ц1═лда═пасс ═бне═:цонт ═йср═праддр :цонт═лды═#00 ═лда═дофлаг ═бне═:цонт2 ═йср═доремеЮ;ц SET MEANS елсе OR фин FOUND. ═бцс═:неьт ═бцц═:прлине :цонт2 ═сты═ноут ═лда═[теьтп],ы ═цмп #224 ═бея═:гетоп ═анд═#$7ф ═бея═:цхецкф ═цмп═#32 ═бея═:гетоп ═цмп═#'*' ═бея═:цом ═цмп═#';' ═бея═:цом ═цмп═#13 ═бея═:црЮ;ц IS *SET* ═йср═адджар ═лдь═еррор ═бне═прерр :гетоп═йср═неьтцхар ═бцц═:прлине ═йср═гетоп ═лдь═еррор ═бне прерр ═лда невфилеЮ;пут OPENED A FILE ═бне невреад ═лда═линкфлаг ═бея═:неьт ═ймп еьит :неьт═йср неьтцхар ═бцс :еррЮ;сHOULD BE NO MORE VALID CHARS ═бне :прлине :цхецкф═лда═филеопен ═бне :доне ═йср═филедоне ═дец филеопен ═бне═:неьт :прлине═лда═пасс ═бне═:адд ═йср═прлине :цлц═цлц :адд═тыа ═адц═теьтпЮ;аND ADVANCE... ═ста═теьтп ═бцц═:йр ═инц═теьтп+1 ═бне═:йр ═инц═теьтп+2 :йр═ймп═реад :доне═дец═пасс ═бми═еьит ═ймп═инит2 :цр═ины ═цлц ═бцц═:прлине :цом═йср═неьтлине ═бцц═:прлине :ерр═лдь═#бадлинеЮ;гARBAGE IN THE LINE прерр ═тьа ═бми═:ймпЮ;E.G. LINKER ERRORS ═асл ═таь ═лда═ерртаб,ь ═ста═поинт ═лда ерртаб+1,ь ═ста═поинт+1 ═йср═цлрцхн ═йср═строут ═дфб 13 ═тьт═'лINE ',00 ═лда═цурлинеЮ;лINE NUMBER ═лдь═цурлине+1 ═лды═#10Ю;бASE ═йср═принтнум ═йср═строут ═тьт═': ',00 ═лды═#00 :л1═лда═[теьтп],ыЮ;лINE ═йср═цхроут ═цмп═#13 ═бея═:ц1 ═иныЮ;хORRIBLY MANGLED LINES WON'T ═бне═:л1Ю;ERROR :ц1═йср═цхроутЮ;еXTRA цр ═лды═#00 :л2═лда═(поинт),ыЮ;еRROR ═йср═цхроут ═ины ═цмп═#13 ═бне═:л2 :ймп═ймп═фиьфилес еьит ═лда═релфлаг ═бне═:цонт ═инц═пасс ═йср═релоут ═йср═ентоут ═йср═еьтоут ═лда═линкид ═йср═цодеоут ═лда═линкид+1 ═йср цодеоут * лда нбытес ;WORKS NORMAL AND LINK * ста цодеенд * лда нбытес+1 * ста цодеенд+1 * лда #$02 * ста цодеенд+2 :цонт═йср═фиьфилес ═йср═строут ═дфб═13 ═тьт═'ASSEMBLY SUCESSFUL -- ',00 ═лда═нбытес ═лдь═нбытес+1 ═лды═#10 ═йср═принтнум ═йср═строут ═тьт═' BYTES',0D ═тьт═'$',00 ═лда═дорг ═лдь═дорг+1 ═лды═#16 ═йср═принтнум ═йср═строут ═тьт═'-$',00 ═лда═дорг ═цлц ═адц═нбытес ═пха ═лда═дорг+1 ═адц═нбытес+1 ═таь ═пла ═лды═#16 ═йср═принтнум ═лда нбытес ═ора нбытес+1Ю;0 CHECK ═ста цодефлагЮ;сUCCESSFUL ASSEMBLE ═ртс ═тьт═'HOLA D00D' ассерр═ент еррор═дфб═00 пасс═дфб═00 ноут═дфб 00Ю;нUMBER OF BYTES OUTPUTTED срег═дфб═$ффЮ;сTATUS REGISTER линкфлаг═дфб═00 регфлаг═дфб═00 ьлен═дфб═01Ю;LENGTH OF лдь # млен═дфб═01Ю;LENGTH OF лда # асслине═ент цурлине═да═00Ю;цURRENT LINE дорг═ент ═дс═3Ю;"мASTER" орг цоделен═ент нбытес═да═00 цодеенд═ент ═дла═00 ластдеж═ент ═дфб═08Ю;лAST DEVICE (INPUT) прфлаг═дфб═00Ю;тO PRINT, OR NOT TO PRINT... дофлаг═дфб═$ффЮ;дO BE DO BE DO (0=офф) релфлаг═ент ═дфб═$ффЮ;0 -> рел ASSEMBLY филеопен═дфб═$фф атеоф═дфб═$фф сетстуфф═дфб $фф ластлине═да═00 дебоунце═дфб═00 филедоне ═лда олдтеьтп ═ста теьтп ═лда олдтеьтп+1 ═ста теьтп+1 ═лда олдтеьтп+2 ═ста теьтп+2 ═лда олдцурлине ═ста цурлине ═лда олдцурлине+1 ═ста цурлине+1 ═лды #00 ═ртс фиьфилес ═лда═#00 ═ста═$ц6 * йср цлосефиле ═лда═#15 ═йср═цлосе ═йср═цлрцхн цлосепрт═лда═#4 ═йср═цлосе ═лда═ластдеж ═ста═$ба ═ртс * ймп цлалл * * пRINT OUT THE JUST-ASSEMBLED LINE * прлине ═сты═темпы ═лды═прфлаг ═бне═:доне * лды #00 ═лдь #4 ═йср цхкоут ═лда #32 ═лдь═ноутЮ;лINE UP SPACES ═цпь═#4 ═бея═:цонт :л2═йср═цхроут ═йср═цхроут ═йср═цхроут ═инь ═цпь═#4 ═бцц═:л2 :цонт ═лда═[теьтп],ы ═цмп═#';' ═бея═:рест ═цмп═#'*' ═бея═:рест ═лдь═#9Ю;цOLUMNS ═йср═:принт ═бцц═:доне ═лдь═#4 ═йср═:принтЮ;пRINT OPCODE ═бцц═:доне :рест═лда═[теьтп],ыЮ;пRINT REST OF LINE ═йср═цхроут ═ины ═цпы═темпы ═бцц═:рест ═до═0 :доне═лда═$0277Ю;гетин MAY FETCH FROM FILE ═цмп═#'_' ═бне═:доне2 ═еор═прфлаг ═ста═прфлаг ═фин :доне═лды═темпы ═ртс :принт :лооп═лда═[теьтп],ыЮ;пRINT LABEL ═йср═цхроут ═ины ═деь ═анд═#$7ф ═цмп═#32 ═бцц═:ртсЮ;сPACE OR цр TERMINATES ═бне═:лооп :лооп2═деьЮ;мOVE TO NEXT COLUMN ═бми═:ртс ═йср═цхроут ═сец ═бцс═:лооп2 :ртс═ртсЮ;ц CLEAR -> цр * * цодеоут * * тHIS LITTLE GUY OUTPUTS THE BYTE IN а INTO THE CODE * POINTED TO BY цодеп, AND INCREMENTS цодеп. * * цодеп = CODE ADDRESS, цод = PHYSICAL ADDRESS * * ь ы AND а ARE PRESERVED (BUT темпY IS HOSED :) * цодеоут ═сты═темпы ═инц═нбытес ═бне═:ц0 ═инц═нбытес+1 :ц0═инц═цодеп ═бне═:ц1 ═инц═цодеп+1 :ц1═лды═пасс ═бне═:инц2Ю;FOR релп, цодеенд ═пха ═лда═ноут ═цмп═#4 ═бцц═:цонт ═сты═ноутЮ;нEW LINE ═лды═прфлаг ═бне═:цонт ═лда═#13 ═йср═цхроут ═йср═праддр :цонт═пла ; ста (цод),ы ;.ы = 0 ═ста [цод] ═лды═прфлаг ═бне═:инц ═пха ═йср═прхеь ═лда═#32 ═йср═цхроут ═пла :инц═инц═ноут :инц2═инц═цод ═бне═:доне ═инц═цод+1Ю;нO MORE THAN 64K OF CODE :доне═лды═темпы ═ртс прхеь═ент ═пха ═лср ═лср ═лср ═лср ═йср═:пр ═пла ═анд═#$0ф :пр═цмп═#10 ═сед ═адц═#00 ═цлд ═адц═#48 ═ймп═цхроут * * гET A CHARACTER AND CONVERT TO LOWER-CASE * гетцхар═лда═[теьтп],ы ═анд═#$7ф ═цмп═#96 ═бцц═:скип ═анд═#$5фЮ;цONVERT TO LOWER-CASE :скип═ртс * * термцхар * * цHECK FOR A CHARACTER WHICH CAN LEGALLY TERMINATE * A VARIABLE. * термцхар ═лда═[теьтп],ы ═цмп═#224 ═бея═:доне ═анд═#$7ф ═цмп═#13 ═бея═:доне ═цмп═#' ' ═бея═:доне ═цмп═#','Ю;иNDEXED MODE ═бея═:доне ═цмп═#')'Ю;ZP ═бея═:доне ═цмп═#']'Ю;ZP LONG ═бея═:доне ═цмп═#'+' ═бея═:доне ═цмп═#'-' :доне═ртс * * гетоп * * гетоп IS THE OPCODE PARSER. иT JUST SEARCHES THE * OPCODE TABLE AND CALLS THE APPROPRIATE PARSE ROUTINE. * * тHE OPCODES MUST BE STORED IN ALPHABETICAL ORDER, * 5 BYTES PER ENTRY: * * 3 BYTE MNEMONIC, 2 BYTE ADDRESS * мнем═дфб═0,0,0 йумпадр═да═0 опцоде═дфб═00 гетоп ═лда═[теьтп],ы ═цмп═#'=' ═бне═:стар ═ины ═ймп═иеяу :стар═цмп═#'*' ═бне═:нопе ═ймп═иорг2 :нопе═лда═#<оптаб ═ста═поинт ═лда═#>оптаб ═ста═поинт+1 ═лдь═#$00 :л1═йср═гетцхар ═ста═мнем,ь ═ины ═инь ═цпь═#3 ═бне═:л1 ═сты═темпы ═лды═#$00 ═лдь═#00 :лооп═лда═мнем,ьЮ;гET CHARACTER :лооп2═цмп═(поинт),ыЮ;сEE IF MATCHES A VALID KEYWORD ═бцц═:еррЮ;иF LESS THAN, THEN WE HAVE A Ю;SYNTAX ERROR ═бея═:цонтЮ;а-HA! а MATCH! ═лда═поинтЮ;оTHERWISE, MOVE FORWARDS ═адц═#5Ю;CARRY IS SET ═ста═поинт ═бцц═:лооп ═инц═поинт+1 ═бне═:лооп :ерр═лда═#бадопЮ;бAD OPCODE ═ста═еррор ═ртс :цонтЮ;а SUCCESSFUL MATCH ═иньЮ;MATCH NEXT CHARACTER ═ины ═цпь═#3 ═бне═:лооп ═лда═(поинт),ыЮ;оTHERWISE, GET ADDRESS ═ста═йумпадр ═ины ═лда═(поинт),ы ═ста═йумпадр+1 ═ины ═лда═(поинт),ыЮ;оPCODE ═лды═темпы ═ймп═(йумпадр)Ю;оFF WE GO! * * оUTPUT OPCODE AND ARGUMENT * * оN ENTRY, .а = OPCODE AND темп=ARG LENGTH * пцоде ═йср═цодеоут жароут ═лда═темп ═бея═ртс1 ═лда═пасс ═бне═:цонт ═лда═релфлаг ═бне═:цонт ═лда═ислаб ═бея═:ц1 ═йср═аддрел :ц1═лда═исеьт ═бея═:цонт ═йср═аддеьт :цонт ═лдь═аргофф :лооп═лда═арг1,ь ═йср═цодеоут ═инь ═дец═темп ═бне═:лооп ртс1═ртс праддр ═лда═прфлаг ═бне═ртс1 ═лда═филеопен ═бне═:ц1 ═лда═#'>' ═йср═цхроут :ц1═лда═#':' ═йср═цхроут ═лда═цодеп+1 ═йср═прхеь ═лда═цодеп ═йср═прхеь ═лда═#32 ═ймп═цхроут * рел ROUTINES аддрелЮ;аRGUMENT TO BE FIXED UP ═лда═нумрелс ═бея═сртсЮ;# OF OFFSETS ═лда═темпЮ;LEN ═цмп═#2 ═бне═:специал ═лда═аргофф ═бея═:нормал :специал═лда═нумрелс ═ора═#$80 ═ста═нумрелс ═йср═:нормал ═лда═арг1 ═йср═старелп ═лда═арг1+1 ═йср═старелп ═лда═темпЮ;LEN ═асл ═асл ═асл ═асл ═ора═аргофф ═ймп═старелп :нормал ═лда═нбытес ═йср═старелп ═лда═нбытес+1 ═йср═старелп ═лда═нумрелс старелп═дфб═$87,релпЮ;STA [RELP] ═инц═релп ═бне═сртс ═инц═релп+1 ═бне═сртс ═инц═релп+2 сртс═ртс релоутЮ;оUTPUT рел LABEL TABLE ═лда═релп ═сец ═сбц═цод ═ста═фац1Ю;TEMP ═лда═релп+1 ═сбц═цод+1 ═ста═фац1+1Ю;LENGTH ═ора═фац1 ═бея═:зип :л1═дфб═$а7,цод ═йср═цодеоут ═лда═цод ═цмп═релп ═лда═цод+1 ═сбц═релп+1 ═бцц═:л1 :зип═лда═фац1 ═йср═цодеоут ═лда═фац1+1 ═ймп═цодеоут ентоут ═лда═цод ═ста═фац1 ═лда═цод+1 ═ста═фац1+1 ═лда═#<жартаб ═ста═жарпнт ═лда═#>жартаб ═ста═жарпнт+1 :л1═лда═жарпнт ═ста═поинт ═лда═жарпнт+1 ═ста═поинт+1 ═лды═#00 :л2═лда═(жарпнт),ы ═бея═:доне ═бми═:цхк ═ины ═бне═:л2 :цхк═сты═темп ═цмп═#$е0 ═бне═:неьт ═лды═#00 :л3═лда═(жарпнт),ы ═ины ═цпы═темп ═бея═:ц1 ═йср═цодеоут ═ймп═:л3 :ц1═ора═#$80Ю;дци ═йср═цодеоут ═ины ═лда═(жарпнт),ы ═йср═цодеоутЮ;VALUE ═ины ═лда═(жарпнт),ы ═йср═цодеоут :неьт═лда═темп ═цлц ═адц═#4 ═адц═жарпнт ═ста═жарпнт ═бцц═:л1 ═инц═жарпнт+1 ═бне═:л1 :доне═лда═цод ═сец ═сбц═фац1Ю;BLOCK LEN ═пхп ═йср═цодеоут ═плп ═лда═цод+1 ═сбц═фац1+1 ═ймп═цодеоут еьтблах═дфб═00 аддеьт ═лда═пасс ═бне═:ртс ═сты═темпы ═лда═ластжар ═ста═поинт ═лда═ластжар+1 ═ста═поинт+1 ═лды═#00 :лооп═лда═(поинт),ыЮ;NAME (дци) ═бми═:ц0 ═дфб═$97,еьтпЮ;STA [EXTP],Y ═ины ═бне═:лооп :ц0═деы ═лда═(поинт),ы ═ора═#$80 ═дфб═$97,еьтп ═ины ═лда═нбытесЮ;OFFSET ═цлц ═адц═еьтблахЮ;лда еьт1+... OUTPUTS еьт1 BEFORE ═дфб═$97,еьтпЮ;OPCODE, SO INC NBYTES ═ины ═лда═нбытес+1 ═адц═#00 ═дфб═$97,еьтп ═ины ═лда═еьтцодеЮ;16-BIT ADD/SUB ═бми═:стаЮ;ADD/SUB DOES ERROR CHECK ═лда═темпЮ;SIZE ═асл ═асл ═асл ═асл ═ора═аргофф :ста═дфб═$97,еьтп ═тыа ═сецЮ;+1 ═адц═еьтп ═ста═еьтп ═бцц═:ц1 ═инц═еьтп+1 ═бне═:ц1 ═инц═еьтп+2 :ц1═лды═темпы :ртс═ртс еьтоут ═лда═еьтп ═сец ═сбц═#<еьттаб ═ста═фац1 ═ста═фац2 ═лда═еьтп+1 ═сбц═#>еьттаб ═ста═фац1+1Ю;LEN ═ста═фац2+1 ═лда═#<еьттаб ═ста═еьтп ═лда═#>еьттаб ═ста═еьтп+1Ю;ASSUME BANK OK :лооп═лда═фац2 ═бне═:дец ═дец═фац2+1 ═бми═:еьит :дец═дец═фац2 ═дфб═$а7,еьтп ═йср═цодеоут ═инц═еьтп ═бне═:лооп ═инц═еьтп+1 ═бне═:лооп :еьит═лда═фац1 ═йср═цодеоут ═лда═фац1+1 ═ймп═цодеоут *------------------------------- * * жARIABLE PROCESSING ROUTINES * *------------------------------- * * ромоут AND ромин -- жARTAB CAN LIE UNDER ROMS * ромоут═пха ═сеи ═лда═#$38 ═ста═$01 ═пла ═ртс ромин2═лды темпы ромин═пха ═лда═#$36 ═ста═$01 ═пла ═цли ═ртс * * адджар IS USED TO ADD VARIABLES TO THE VARIABLE TABLE. * жARIABLES HAVE THE FORM * * NAME TYPE LO MED HI * * WHERE TYPE HAS HIGH BIT SET. тHE LIST IS * TERMINATED WITH A NULL BYTE. цURRENT TYPES ARE: * * $фф нORMAL LABEL * $фе еяуATED LABEL * $фд лABEL еяуATED TO A NORMAL LABEL (FOR рел) * $е1 еьтERNAL LABEL * $е0 ентRY POINT * лоцфлаг═дфб═00 ластглоб═да═00Ю;POINTER адджар ═йср═ромоут ═лда═пасс ═бея═:пасс2 ═йср═финджар ═бцс═:еррор ═йср═цопыжар ═бцц═:еррор ═сты═темпы ═лда═#$фф ═лды═#$00 ═ста═(жарпнт),ы :лооп═лда═цодеп,ы ═ины ═ста═(жарпнт),ы ═цпы═#3 ═бне═:лооп ═ины ═лда═#00 ═ста═(жарпнт),ыЮ;END OF VARIABLES ═бея═:сажелоц :еррор═лда═еррор ═бне═:ртсЮ;оUT OF MEM ═лда═#дупжар ═дфб═$2ц :ерр2═лда═#пхасерр ═дфб═$2ц :ерр3═лда═#баджар ═ста═еррор :ртс═ймп═ромин :пасс2Ю;цOMPARE WITH EARLIER VALUE TO Ю;CHECK FOR PHASE ERRORS ═йср═финджарЮ;финджар SETS лоцфлаг ═бцц═:ерр3 ═сты═темпы ═лды═#00 ═лда═(жарпнт),ы ═цмп═#$ффЮ;оNLY CARE ABOUT LABELS ═бея═:цхецкЮ;NOT еяуATES ETC. ═цмп═#$е0 ═бне═:лды :цхецк═лды═#3 :л2═лда═цодеп-1,ы ═цмп═(жарпнт),ы ═бне═:ерр2 ═деы ═бне═:л2 :сажелоц ═лда═лоцфлагЮ;иF GLOBAL, THEN SAVE ADDRESS ═бея═:лдыЮ;OF NEXT VAR. ═лда═жарпнт ═цлц ═адц═#4 ═ста═ластглоб ═лда═жарпнт+1 ═адц═#00 ═ста═ластглоб+1 :лды═ймп═ромин2 цопыжар ═лдь═#00 ═лды═темпы ═лда═[теьтп],ы ═цмп═#':'Ю;мUST START WITH : OR LETTER ═бея═:ста :л1═лда═[теьтп],ы ═цмп═#224Ю;TAB ═бея═:доне ═анд═#$7ф ═цмп═#96Ю;LCASE ═бцц═:ц1 ═сбц═#32 :ц1═цмп═#32 ═бея═:донеЮ;оNLY SPACE OR цр TERMINATES VAR ═цмп═#$0д ═бея═:доне ═цмп═#48 ═бцц═:еррор ═цмп═#58 ═бцц═:ста :цмп═цмп═#65 ═бцц═:еррор * анд #$5ф ;жALID CHARS ARE 0-9, A-Z ] [ ETC. :ста═ста═(жарпнт,ь) ═ины ═инц═жарпнт ═бне═:л1 ═инц═жарпнт+1 ═бне═:л1 ═лда═#баджмемЮ;ваы TOO MANY VARS ═дфб═$2ц :еррор═лда═#илжар ═ста═еррор ═цлц ═ртс :доне═сец ═ртс * * фIND A VARIABLE IN THE VARIABLE LIST. иF FOUND, * * оN EXIT: * ц SET -> жARIABLE FOUND, жарпнт POINTS TO LAST CHAR * ц CLR -> жARIABLE NOT FOUND, жарпнт POINTS TO END * OF VARIABLE LIST. * * иN BOTH CASES, .ы IS ADVANCED TO THE CHARACTER * IMMEDIATELY FOLLOWING THE VARIABLE, AND темпы * CONTAINS THE FIRST CHARACTER OF THE VARIABLE. * тHIS WAY, EXPRESSIONS LIKE блах+12 MAY BE * CORRECTLY EVALUATED EVEN IF блах HAS NOT YET * BEEN DEFINED. * * тHE LIST IS TERMINATED WITH A NULL BYTE. * финджар ═лда═#<жартабЮ;сTART AT BEGINNING OF LIST ═ста═жарпнт ═лда═#>жартаб ═ста═жарпнт+1 ═сты═темпы ═лда═[теьтп],ы ═сец ═сбц═#':' ═ста═лоцфлаг ═бне═:глобал ═лда═ластглобЮ;сTART SEARCH FROM LAST GLOBAL ═ста═жарпнт ═лда═ластглоб+1 ═ста═жарпнт+1 :глобал ═лдь═#00 :лооп2═лды═темпы ═лда═жарпнт ═ста═ластжар ═лда═жарпнт+1 ═ста═ластжар+1 ═лда═(жарпнт,ь) ═бея═:еьит ═цмп═#':'Ю;лOCAL VARIABLE CHECK ═бея═:лооп ═лда═лоцфлагЮ;еXIT IF NEXT GLOBAL REACHED ═бея═:еьит :лооп═лда═(жарпнт,ь) ═бми═:матцхЮ;MATCHED ALL CHARS ═цмп═[теьтп],ы ═бея═:неьт ═цмп═#65Ю;уPPER-CASE PERHAPS? ═бцц═:неьтжар ═лда═[теьтп],ы ═анд═#$5фЮ;LOWER-CASE ═цмп═(жарпнт,ь) ═бея═:неьтЮ;MINOR KLUDGE :неьтжар═лды═#$ффЮ;OTHERWISE ADVANCE TO NEXT VARIABLE :л3═ины ═лда═(жарпнт),ы ═бпл═:л3 ═тыа ═цлц ═адц═#4Ю;хOPEFULLY NO 250-CHARACTER ═адц═жарпнтЮ;VARIABLES :) ═ста═жарпнт ═бцц═:лооп2 ═инц═жарпнт+1 ═бцс═:лооп2 :неьт═иныЮ;аDVANCE TO NEXT CHAR ═инц═жарпнт ═бне═:лооп ═инц═жарпнт+1 ═бне═:лооп :матцхЮ;мAKE SURE REALLY AT THE ═йср═термцхарЮ;LAST CHAR ═бне═:неьтжар ═сецЮ;тHAR SHE IS ═ртс :еьит═йср═термцхарЮ;аDVANCE TO NEXT CHAR ═бея═:цлц ═ины ═бне═:еьит :цлц═цлц ═ртс * * неьтцхар: аDVANCE TO NEXT RELEVANT CHARACTER IN THE * TEXT. еITHER SKIPS SPACE OR ADVANCES TO THE NEXT LINE. * * сTRATEGY: ADVANCE THROUGH THE TEXT UNTIL A NON-SPACE * CHARACTER IS FOUND. иF CHARACTER IS 00 THEN WE ARE AT * еоф. иF CHAR IS ; THEN ADVANCE TO END OF LINE. иF CHARACTER * IS цхр$(13) THEN ADD ONE TO POINTER AND EXIT. * * оN ENTRY: * ы IS SET TO THE CURRENT POSITION WITHIN теьтп * * оN EXIT: * з SET -> аT еоф * ц CLEAR -> аT END OF LINE * ы CONTAINS INDEX INTO NEXT RELEVANT CHARACTER * неьтцхар═ент :лооп═лда═[теьтп],ы ═цмп═#224 ═бея═:ины ═анд═#$7ф ═цмп═#32 ═бне═:оут :ины═ины ═бне═:лооп :оут ═цмп═#00 ═бея═:цлц :цом═цмп═#';' ═бея═неьтлине :неьт═цмп═#13Ю;иF цхр$(13) THEN ADVANCE ═бея═:ины2 ═сец ═ртс :ины2═ины :цлц═цлц ═таьЮ;сET з CORRECTLY ═ртс * мOVE TO THE END OF THE LINE + 1 неьтлине═ины ═лда═[теьтп],ы ═анд═#$7ф ═цмп═#13 ═бне═неьтлине ═цлц ═иныЮ;бETTER NOT BE ZERO! ═ртс * * реадарг * * реадарг PARSES THE OPERAND. иT FIRST CHECKS FOR ANY * LEADING CHARACTER, AND IF IT DOESN'T FIND ONE ASSUMES * THAT THE DATA IS AN ABSOLUTE ADDRESS OR VARIABLE. * * бASIC MATHEMATICAL OPERATIONS (+ - / *) ARE SUPPORTED * IN A FIRST-COME FIRST-SERVE BASIS. * * аRGUMENT TYPES: * 0 = NO ARG 1 = IMMEDIATE 2 = ABSOLUTE * 3 = ABS,X 4 = ABS,Y 5 = ABS,S * 6 = ABS,ABS * 7 = (ZP) 8 = (ZP),Y 9 = (ZP,X) * 10 = (ZP,S),Y 11= [ZP] 12 = [ZP],Y * арглен═дфб═00 аргофф═дфб═00Ю;аRGUMENT OFFSET аргтыпе═дфб═00Ю;аRGUMENT TYPE (ABS, ZP, ETC.) арг1═дфб═0,0,0,0Ю;мAIN ARGUMENT ═дфб═0,0Ю;PADDING FOR пцоде арг2═дфб═0,0,0,0Ю;мжн/мжп ARGUMENTS префиь═дфб═00Ю;пREFIX CHAR < > ! ^ реадарг ═лда═#00 ═ста═аргофф ═ста═аргтыпе ═ста═арглен ═ста═исент ═ста═исеьт ═ста═ислаб ═ста═ноеьт ═ста еьтцоде ═ста ндигитсЮ;нUMERIC FLAG ═йср═неьтцхар ═бцц═:деы * лда (теьтп),ы ═цмп═#'#'Ю;иS IT IMMEDIATE MODE? ═бея═иммед ═цмп═#'(' ═бея═:зп ═цмп═#'[' ═бея═:зплонг ═цмп═#'A'Ю;цHECK FOR ACCUMULATOR ═бея═:цхецк ═цмп═#'а' ═бне═аддресс :цхецк═сты═темпы ═ины ═йср═неьтцхар ═бцс═аддр2 :деы═деыЮ;ы AT еол+1 :емпты ═ртс :зп═ймп═зп :зплонг═ймп═зплонг иммед2═деыЮ;уSED TO FAKE OUT дфб иммед═лда═#01 ═ста═аргтыпе ═ста═арглен ═ины ═йср═гетарг ═лда═префиь ═бея═:ртс ═цмп═#'>' ═бея═:с1 ═цмп═#'^' ═бея═:с2 ═цмп═#'<' ═бея═:ртс ═лдь═#бадфиь ═сть═еррор :ртс═ртс :с1═лда═#1 ═дфб═$2ц :с2═лда═#2 ═ста═аргофф ═ртс аддр2═лды темпы аддресс ═лда дфбфлаг ═бне иммед2 ═лда #2 ═ста═аргтыпе ═лда #1 ═ста═аргленЮ;аSSUME зп ═йср гетарг ═йср═цхкцомЮ;цHECK FOR , ═бне═:доне ═лда═дфбфлагЮ;дфб HANDLES COMMAS SPECIAL ═бне═:доне ═йср═цомьЮ;цHECK FOR ,ь ═бея═:инц1 ═йср═цомы ═бея═:инц2 ═йср═цомс ═бея═:инц3 ═ины ═йср═арг2арг ═йср═гетаргЮ;мжп AND мжн PERHAPS ═деыЮ;фOR ины BELOW ═инц═аргтыпе :инц3═инц═аргтыпе :инц2═инц═аргтыпе :инц1═инц═аргтыпе ═ины :доне цалцлен═лдь═#1Ю;LEN ═лда═еьтцоде ═бми═:иньЮ;FORCE 16-BITS FOR +/-еьт ═лда═префиь ═бне :фиь ═лда исеьт ═бне :иньЮ;FORCE 16-BITS FOR NON-PREFIXED еьт ═лда арг1+2Ю;8-BITS IF $0000XX ═ора арг1+1 ═бея═:ц2 ═инь ═лда═арг1+2Ю;16-BITS IF $00XXXX OR ═бея═:ц2Ю;IN SAME BANK ═цмп цодеп+2 ═бея═:ц2 :инь═инь :ц2═сть═арглен ═лда ндигитсЮ;CHECK FOR LONG NUMERICS LIKE $001234 ═бея :ртс ═лсрЮ;1-2 DIGITS PER BYTE ═адц #00 ═цмп аргленЮ;IF NUMERIC AND NDIGITS > ARG LEN ═бцц :ртс ═ста арглен :ртс═ртс :таб═тьт═'' :фиь═лдь═#3 :л1═цмп═:таб-1,ь ═бея═:ц2 ═деь ═бне═:л1 ═лдь═#бадфиь ═сть═еррор ═ртс зплонг═инц═ноеьт ═лда═#11 ═ста═аргтыпе ═лда═#1 ═ста═арглен ═ины ═йср═гетарг ═йср═цхксяр ═бне═:ерр ═ины ═йср═цхкцом ═бне═:доне ═йср═цомы ═бне═:ерр ═инц═аргтыпе ═ины :доне═ймп═цалцлен :ерр═ймп═линерр зп═лда═#7 ═ста═аргтыпе ═лда═#1 ═ста═арглен ═инц═ноеьт ═ины ═йср═гетарг ═йср═цхкпар ═бне═:ц1 :цхецкы═ины ═йср═цхкцом ═бне═:доне ═йср═цомыЮ;(ZP),Y ? ═бне═:ерр ═инц═аргтыпе :ины═ины :доне═ймп═цалцлен :ц1═лда═#9 ═ста═аргтыпе ═йср═цхкцомЮ;(ZP,.) INSTRUCTIONS ═бне═:ерр ═йср═цомь ═бне═:цомс ═ины ═йср═цхкпарЮ;(ZP,X) ═бея═:ины :ерр═ймп═линерр :цомс═йср═цомс ═бне═:ерр ═инц═аргтыпеЮ;(ZP,S),Y ═ины ═йср═цхкпар ═бне═:ерр ═бея═:цхецкы линерр═лда═#сынерр ═ста═еррор ═ртс цхксяр═лда═#']' ═дфб═$2ц цхкпар═лда═#')' ═дфб═$2ц цхкцом═лда═#',' ═цмп═[теьтп],ы ═ртс цомь═ины ═лда═[теьтп],ы ═анд═#$5ф ═цмп═#'X' ═бея═:доне ═деы ═лда═#$фф :доне═ртс цомы═ины ═лда═[теьтп],ы ═анд═#$5ф ═цмп═#'Y' ═бея═:доне ═деы ═лда═#$фф :доне═ртс цомс═ины ═лда═[теьтп],ы ═цмп═#'S' ═бея═:доне ═цмп═#'с' ═бея═:доне ═деы ═лда═#$фф :доне═ртс арг2арг═лдь═#2 :лооп═лда═арг1,ь ═ста═арг2,ь ═деь ═бпл═:лооп ═ртс арг1арг═лдь═#2 :лооп═лда═арг2,ь ═ста═арг1,ь ═деь ═бпл═:лооп ═ртс * аDJUST CHARACTERS WITHIN QUOTES * " -> SPACE=160, CAPS=192-223 * ' -> SPACE=32, CAPS=96-127 фиьцхар ═лдь═темп ═лда═[теьтп],ы ═бпл═:пос ═цпь═#34 ═бея═:еьит ═цмп═#160 ═бея═:анд ═цмп═#224 ═бцс═:еьит ═цмп═#192 ═бцц═:еьит ═еор═#32 :анд═анд═#$7ф :еьит═ртс :пос ═цпь═#34 ═бне═:еьит ═цмп═#32 ═бея═:ора ═цмп═#96 ═бцц═:еьит ═еор═#32 :ора═ора═#$80 ═ртс * рEAD IN AN ADDRESS, IMMEDIATE OR VARIABLE нумрелс═дфб═00Ю;нUMBER OF TIMES TO рел аддофф═дфб═00Ю;ADD OR SUB OFFSET гетарг ═лда═#00 ═ста фац1 ═ста═фац1+1 ═ста═фац2+1 ═ста═еьтцоде ═ста═нумрелс ═ста═аддоффЮ;ALWAYS START + ═лда═[теьтп],ы ═лдь═#3Ю;цHECK FOR PREFIX CHARS :цт═цмп═:таб1,ь ═бея═:ста ═деь ═бпл═:цт ═лда═#00 ═деы :ста═ста═префиь ═ины ═йср═:гет :еьтра═йср═гетцхарЮ;цHECK FOR + - * / ═цмп═#32 ═бея═:ртс ═цмп═#'+' ═бея═:адд ═цмп═#'-' ═бея═:суб ═цмп═#'*' ═бея═:тимес ═цмп═#'/' ═бея═:диж :ртс═ймп═фац2арг :гет═йср═гетцхар ═йср═иснум ═бцс═:аддр ═цмп═#'%' ═бея═:аддр ═цмп═#'$' ═бея═:аддр ═цмп═#'*' ═бея═:стар ═цмп═#34 ═бея═:асции ═цмп═#39 ═бея═:асции ═цмп═#'-' ═бея═:суб ═ймп реаджар :аддр═ймп реаднум :стар═лдь═#02 :сл1═лда═цодеп,ь ═ста═фац1,ь ═деь ═бпл═:сл1 ═ины ═ртс :асции═ста═темп ═ины ═лда═#00 ═ста═фац1+1 ═ста═фац1+2 ═йср═фиьцхар ═ста═фац1 ═ины ═лда═[теьтп],ы ═цмп═темп ═бне═:ерр1 ═ины ═ртс :ерр1═лда═#бадарг ═ста═еррор ═ртс :тимес :диж ═ймп═:еьтра :адд ═лда═#01 ═ста═аддофф ═лда═#$80 ═йср :фиьфац ═цлц ═лда═фац2 ═адц═фац1 ═ста═фац1 ═лда═фац2+1 ═адц═фац1+1 ═ста═фац1+1 ═лда═фац2+2 ═адц═фац1+2 ═ста═фац1+2 ═ймп═:еьтра :суб ═лда═#$фф ═ста═аддофф ═лда═#$ц0 ═йср═:фиьфац ═сец ═лда═фац2 ═сбц═фац1 ═ста═фац1 ═лда═фац2+1 ═сбц═фац1+1 ═ста═фац1+1 ═лда фац2+2 ═сбц═фац1+2 ═ста═фац1+2 ═ймп═:еьтра :фиьфац═пха ═лда═#$80 ═йср═еьтцхецк ═йср═фац2фац ═ины ═йср═:гет ═пла ═ймп═еьтцхецк :таб1═тьт═'<>!^' фац2арг═лдь═#3 :л1═лда═фац1,ь ═ста═арг1,ь ═деь ═бпл═:л1 ═ртс фац2фац═лдь═#3 :л═лда═фац1,ь ═ста═фац2,ь ═деь ═бпл═:л ═ртс * иF 1ST ARG IS AN еьт THEN OUTPUT AS SPECIAL CODE #$80 * (16-BIT ADD), SO THAT E.G. еьт1-1 WILL WORK CORRECTLY. * мOREOVER, WHEN еьт IS USED IN ADD OR SUB THE HIGH BYTE * MUST BE SET TO ZERO, SO THAT E.G. рел1+еьт1 WILL NOT * INDICATE TWO RELATIVE OFFSETS, AND рел1-еьт1 WILL NOT * INDICATE ZERO! (сAME FOR еьт1+рел1). еьтцхецк ═лдь═исеьт ═бея═:ртс ═ста═еьтцоде ═лда═префиьЮ;MUST BE 16-BITS ═бне═:цхецкпре :ц1═лда═ноеьт ═бне═:ерр ═инц═еьтблахЮ;оPCODE NOT YET OUTPUT ═лда═дфбфлаг ═бея═:аддеьт ═дец═еьтблахЮ;NO OPCODE TO OUTPUT! ═лда═дфблен ═цмп═#2 ═бне═:ерр :аддеьт═йср═аддеьт ═лда═#00 ═ста═еьтблах ═ста═исеьт ═ста═фац1+2 :ртс═ртс :цхецкпре ═цмп═#'^' ═бея═:ц1 :ерр═лда═#еьтерр ═ста═еррор ═ртс * * реаднум * * цALCULATES NUMBER AND STORES RESULT IN фац1 * * сTRATEGY: ANS = BASE*ANS + NUM * цUSTOM MULTIPLY ROUTINE FOR SPEED. * басе═дфб 0 ндигитс═дфб 00Ю;# OF (HEX) DIGITS, FOR ста $00XXXX Ю;USED AS FLAG FOR цалцлен реаднум ═лда═#00 ═ста═фац1 ═ста═фац1+1 ═ста фац1+2 ═лдь═#10Ю;бASE 10 = DEFAULT ═лда═[теьтп],ы ═цмп═#'$' ═бне═:ц1 ═лдь═#16Ю;хEX ═иныЮ;аDVANCE TO NEXT CHAR :ц1═цмп═#'%' ═бне═:ц2 ═лдь═#2Ю;бINARY ═ины :ц2═сть═басеЮ;.ь = BASE :лооп ═лда═[теьтп],ыЮ;цHECK FOR VALID NUMBER ═цмп═#224Ю;TAB ═бея═:доне ═цмп═#58 ═бцц═:сбц ═анд═#$5фЮ;цONVERT TO LOWER-CASE ═сбц═#8 :сбц═сбц═#47Ю;0 -> 0 ETC. :ц4═цмп═басе ═бцс═:донеЮ;NUMBER > BASE SO EXIT ═ста темп ═лда═фац1+2 ═асл═фац1 ═рол═фац1+1 ═рол ═бцс═:ерр ═цпь═#16Ю;иF BINARY THEN WE ARE DONE ═бне :басе10 ═инц ндигитс ═асл═фац1Ю;мULTIPLY BY 16 ═рол═фац1+1 ═рол ═бцс═:ерр ═асл═фац1 ═рол═фац1+1 ═рол ═бцс═:ерр ═асл═фац1 ═рол═фац1+1 ═рол ═бцс :ерр :басе10═цпь═#10Ю;тO MULT BY TEN, USE ═бне═:окЮ;10*X = 8*X + 2*X * лда фац1+2 ═пха ═лда═фац1+1 ═пха ═лда═фац1 ═асл═фац1Ю;TEMP=8*X ═рол═фац1+1 ═рол═фац1+2 ═бцс═:ерр ═асл═фац1 ═рол═фац1+1 ═рол═фац1+2 ═бцс═:ерр ═адц═фац1Ю;аDD IN 2*X ═ста═фац1 ═пла ═адц═фац1+1 ═ста═фац1+1 ═пла ═адц═фац1+2 ═бцс═:ерр :ок═ста═фац1+2 ═лда═темпЮ;аDD IN THE NUMBER ═цлц ═адц═фац1 ═ста═фац1 ═бцц═:ц5 ═инц═фац1+1 ═бне═:ц5 ═инц═фац1+2 :ц5═ины ═бне═:лооп :ерр═лда═#баднум ═ста═еррор :доне═ртс * * реаджар * * рEADS IN A VARIABLE, BY SEARCHING THROUGH THE VARIABLE * LIST. цURRENT VARIABLE STORAGE IS: * * NAME TYPE LO MED HI * * WHERE NAME IS DEXTRAL CHAR INVERTED * жартыпе═дфб═00 исент═дфб═00 исеьт═дфб═00 ислаб═дфб═00 ноеьт═дфб═00 еьтцоде═дфб═00Ю;$80/$ц0 -> 16-BIT ADD/SUB ластжар═да═00 реаджар ═йср═ромоут ═йср═финджар ═бцц═:ерр ═сты═темпы ═лды═#00 ═лда═(жарпнт),ы ═ста═жартыпе ═цмп═#$фе ═бея═:иныЮ;PLAIN EQUATE ═цмп═#$фд ═бцц═:ц2 ═ста═ислабЮ;$фф AND $фд ═бцс═:ины :ц2═цмп═#$е0 ═бне═:ц1 ═ста═исент ═ста═ислаб :ц1═цмп═#$е1 ═бне═:ины ═ста═исеьт ═лда═ноеьт ═бне═:еьтерр :ины═ины :л1═лда═(жарпнт),ы ═ста═фац1-1,ы ═ины ═цпы═#4 ═бне═:л1 ═лда релфлаг ═бне═:ймп ═лда═жартыпеЮ;аDJUST # OF OFFSETS ═цмп═#$феЮ;DON'T ADJUST еьт OR PLAIN еяу ═бея═:ймп ═цмп #$е1 ═бея═:ймп ═лда═аддофф ═бми═:дец ═инц═нумрелс ═ймп═ромин2 :дец═дец═нумрелс :ймп═ймп═ромин2 :ерр═лда═пассЮ;аSSUME 2-BYTE VARIABLE ═бея═:ерр2Ю;IF ON FIRST PASS ═лда═#00 ═ста═еррор ═лдь═#2 :л2═лда═цодеп,ьЮ;цодеп WILL ENSURE BRANCHES ═ста═фац1,ьЮ;WORK. ═деь ═бпл═:л2 ═лда═#2 ═ста═арглен ═ймп═ромин :еьтерр═лда═#еьтерр ═дфб═$2ц :ерр2═лда═#баджар ═ста═еррор ═ймп═ромин * * тHESE ROUTINES CHECKS FOR A DECIMAL NUMBER IN THE * CODE, TO DIFFERENTIATE E.G. L1 FROM L1A * * оN EXIT, цARRY CLEAR INDICATES THAT IT IS NOT * A NUMBER. * иснум ═цмп═#'0' ═бцц═:еьит ═цмп═#'9'+1 ═ролЮ;иNVERT CARRY ═еор═#$01 ═рор :еьит═ртс ═пут 'OPCODES.L.S' ═пут 'OPTAB.C.S'