Ю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'
