ASMB,R,L,C * * NAME: ASMB1 * SOURCE: 92067-18071 * RELOC: 92067-16071 * PGMR: C.C.H.,S.P.K. * MOD 77-01-30 ADDED DEY INST EAS * MODIFIED BY VERN MCGEORGE 22MAY79 TO RELEASE LOD & GEN INSTR. * MODIFIED BY VERN MCGEORGE 13JUL79 TO REPORT "SY" ERROR IN NAM * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** HED * RTE ASMB1 92067-16071 * (C) HEWLETT-PACKARD COMPANY 1978. * NAM ASMB1,5,99 92067-16071 REV.1940 790713 ENT ASMB1 SPC 1 EXT RWN.C,C.SOR SPC 1 ENT ?LITI,?CMQ,?INSR,?HA3Z,?ENP,?EXP,?EMP EXT ?RSTA,?ERPR,?MOVE,?CHPI,?OPER,?PLIT,?ORGS EXT ?ASCN,?BPKU,?MSYM,?PKUP,?SYMK,?CHOP,?ENDS EXT ?MSYS,?SEGM,?PNCH,?V,?X,?T EXT ?ICSA,?TFLG,?LTFL,?CNTR EXT ?ARTL,?ASM1,?ORRP,?BNCN,?DCOD,?MESX,?PRNT EXT ?LABE EXT ?OPLK,?NDOP,?NDSY,?ENER,?PRPG EXT ?BPSV,?GETA,?GETC,?SYMT,?FMPE SPC 2 EXT ?NAMI,?NAME,?SUMP,?FLEX,?CNTB,?CODE,?INST EXT ?LAST,?PEEK,?PLCN,?PLEN,?PNTR,?SCN1,?SYMI EXT ?SYMP,?TEST,?ENT.,?ENTC,?ENTV,?IOBF,?BUFF EXT ?PBUF,?TEMP,FUBP,FUBP2 SUP .1 DEC 1 .2 DEC 2 .3 DEC 3 .4 DEC 4 .5 DEC 5 .6 DEC 6 .7 DEC 7 .12 DEC 12 .13 DEC 13 .14 DEC 14 .15 DEC 15 .16 DEC 16 .17 DEC 17 .M1 DEC -1 .M2 DEC -2 L OCT 50,51,52,53,54,55,56 .9 DEC 9 .29 DEC 29 .M8 DEC -8 .M15 DEC -15 .M29 DEC -29 BLNK OCT 40 =40B(LOWER BLANK) .IL ASC 1,IL .MBLN ASC 1,M .NO ASC 1,NO BLNS ASC 1, BIT15 OCT 100000 .E OCT 105 .B OCT 102 RC ASC 5,E R B C X TEMP EQU ?TEMP NAMI EQU ?NAMI LOC'N FOR TEMP SYMBOL STORAGE NAME EQU ?NAME FOR USE BY 'OPLK' SUMP EQU ?SUMP RUNNING SUM FOR 'CHOP' FLEX EQU ?FLEX 'ASCN' CNTB EQU ?CNTB CODE EQU ?CODE OPCODE TYPE(FROM OPTABLE) INST EQU ?INST OPCODE FORMAT LAST EQU ?LAST PEEK EQU ?PEEK LAST CHAR PICKED UP PLCN EQU ?PLCN PROGRAM LOCATION COUNTER PLEN EQU ?PLEN LIT LENGTH PASS 1/LIT ORG PASS 2 PNTR EQU ?PNTR POINTS AT LAST OR CURRENT CHAR. SCN1 EQU ?SCN1 STATE LNG/OPCODE/OPERAND/LABEL(4) SYMI EQU ?SYMI ADDR CNTR FOR SYMBOL TBL (SYMK) SYMP EQU ?SYMP SYMBOL LNG/ AND LOC'N TEST EQU ?TEST TEST CHARACTER ENT. EQU ?ENT. ENTC EQU ?ENTC ENTV EQU ?ENTV * * I/O STATEMENT BUFFER * IOBF EQU ?IOBF 50 WORDS + END OF STATEMENT BUFF * *(INPUT BUFFER 'BUFF' STARTS IN 11TH WORD)* BUFF EQU ?BUFF PBUF EQU ?PBUF SAVES THE 'NAM' RECORD INFO. OCT 0 EXTRA WORD FOR BUFFER OVERFLOW. WCNT EQU PBUF WORD(BLK) CNT FOR BIN.RECRD. SPC 1 ASCN EQU ?ASCN BPKUP EQU ?BPKU CHOP EQU ?CHOP CHOPI EQU ?CHPI CNTR EQU ?CNTR ERPR EQU ?ERPR GETA EQU ?GETA GETC EQU ?GETC LTFLG EQU ?LTFL MOVE EQU ?MOVE MSYM EQU ?MSYM MSYMS EQU ?MSYS OPERR EQU ?OPER ORGSV EQU ?ORGS PKUP EQU ?PKUP PNCH EQU ?PNCH RSTA EQU ?RSTA SYMTS EQU ?SYMT T EQU ?T X EQU ?X * ICNTR DEC -6 ATBL DEF *+1 PBF9 DEF PBUF+9 CSAD DEF PBUF+3 POINTS AT PUNCH BUFFER DSTAD DEF PBUF+17 ADDR: NAM EXTENSION BUFFER PBF8 DEF PBUF+8 ADDRESS: NAM-RECORD COMMON DECLARATION SNOB DEF IOBF+5 BUFFER ORIGIN FFUB DEF BUFF SPC 1 * ASMB1 LDA ATBL,I GET AN INDIRECT ADDRESS RSS LDA A,I REMOVE ONE LEVEL OF INDIRECT RAL,CLE,SLA,ERA BIT 15 SET? JMP *-2 YES STA ATBL,I RESTORE DIRECT ADDRESS ISZ ATBL ISZ ICNTR ALL ADDRESSES DONE? JMP ASMB1 NO * ASMBA JSB RSTA LDA CODE CPA .15 'HED' STATE? JMP IXH YES STA ?ASM1 CLEAR 'CS' AND 'INIT' FLAGS CPA .13 (13) NAM ? JMP HI12 * * * NO NAM OR ORG * * LDA .NO 'NO'= NO ORG OR NAM STATEMENT JSB ERPR JMP HA32+1 IXH JSB INST,I GO TO HEDSB JMP ASMBA * * * * PROCESS NAME FOR BINARY RECORD * * .SY ASC 1,SY PNSAV OCT 0,0 FOR USE IN 'NAM' SETUP HI12 LDB SCN1+2 JSB MSYM MEASURE THE NAME STB HI14 STA PNSAV SAVE # OF CHARS IN THE PARAMETER * LDB A CHECK FOR NAM TOO LONG CMB,INB ADB .5 SSB,RSS ERR < 0 / OK >= 0 JMP HI13 OK NAM <= 5 CHARACTERS LDA .SY NOT OK NAM > 5 CHARACTERS JSB ERPR REPORT ERROR LDA PNSAV RESTORE A REG (NESSESSARY ?) * HI13 LDB TEST GET CONTINUATOR STB PNSAV+1 AND SAVE IT LDB CSAD JSB MOVE MOVE IT TO THE 'NAM' RECORD HI14 NOP LDA PNSAV+1 GET THE CONTINUATOR CPA L+4 COMMA?(ANOTHER PARAMETER?) RSS YES JMP HI16 NO - GO TEST FOR END LDA PNSAV GET # OF CHARS IN CURRENT PARAME ADA PNTR INA STA PNTR SET POINTER TO NEXT PARAMETER JSB BPKUP SCAN TO NEXT PARAM. JSB MSYM MEASURE IT STA PNSAV SAVE # OF CHARS IN THE PARAMETER ALF,ALF INA FOR DECIMAL CONV ALF,ALF POSITION IT STA 1 PARAM. FOR 'ASCN' TO 'B' REG. LDA TEST GET CONTINUATOR STA PNSAV+1 AND SAVE IT LDA PNTR GET POSITION OF NUMBER JSB ASCN GO CONVERT THE NUMBER CLA ERROR RETURN, SET 'A' =0 STA PBF9,I ISZ PBF9 JMP HI14+1 HI16 CPA BLNK LEGAL? RSS YES JSB OPERR NO - PRINT 'M' ERROR LDA PBUF+9 SZA,RSS IS TYPE=0(SYSTEM)? STA PBUF+10 YES, SET PRIORITY = 0. SPC 1 * * EXTENDED NAM RECORD PROCESSOR * SPC 1 LDA PNSAV GET # OF CHARS. IN CURRENT PARAM. ADA PNTR INA SET POINTER TO NEXT PARAMETER. STA PNTR SAVE FOR BUFFER MOVE. CMA,INA COMPUTE THE NUMBER OF ADA SCN1 ADDITIONAL CHARACTERS, IF ANY. SSA,INA MORE ? JMP HA32 NO. STA PNSAV YES. SAVE CHARACTER COUNT. LDA PNTR RELATIVE POINTER TO START JSB GETA OF NAM RECORD EXTENSION STB SRCAD SOURCE BUFFER. LDA PNSAV GET NUMBER OF CHARACTERS, LDB DSTAD AND DESTINATION ADDRESS JSB MOVE FOR DATA MOVE. SRCAD NOP LDA PNSAV CONVERT NUMBER OF INA CHARACTERS TO ARS NUMBER OF WORDS. ALF,ALF POSITION TO UPPER BYTE. ADA WCNT COMPUTE TOTAL NAM-REC WORD COUNT STA WCNT SAVE FOR PUNCH ROUTINE. * SKP HA32 JSB RSTA GO TO GET NEXT STATEMENT. LDA CODE GET OPCODE IDENTIFIER. CPA .12 IS IT THE 'END' STATEMENT ? JMP HB00 YES, GO TO 'END' PROCESSOR. CPA BLNK (40B) SUP/UNS? JMP HA32 IGNORE-PASS #1. CPA .32B REPLACEMENT CODE ? JMP HA71 YES, GO TO RPL PROCESSOR. CPA .100B USER MICROCODE (MIC)? JMP MIC YES, GO PROCESS. ADA .M3 (-3) SSA ORR/ORB/ORG ? JMP HA64 YES, ROUTE TO PROCESSOR. CPA .12B NAM? JMP HA63 YES, ERROR ADA .M3 (-3) SSA 'COM','ENT','EXT' OR 'EMA' ? JMP INST,I JUMP TO ROUTINE DESIGNATED IN INST CPA .5 'EQU'? JMP HA56 TO EQU CPA .9 (11B) HED? JMP HA32 IGNORE-PASS #1. CPA .12 (14B) SKP? JMP HA32 IGNORE-PASS #1. CPA .13 (15B) SPC? JMP HA32 IGNORE-PASS #1. CPA .14 (16B) LST/UNL? JMP HA32 IGNORE-PASS #1. * * * TEST FOR LABEL FIELD * JSB LABEL LDA CODE OPCODE INDICATOR CPA DEX JMP HA40 IT'S A 'DEX' CPA DEY IF INST = DEY THEN JMP HA40 GO PROCESS IT CPA BYT IS IT A 'BYT'? JMP HA40 YES, GO PROCESS. CPA .29 REP? JMP HA64 YES CPA .7 (7) JMP HA54 TO ASC CPA .33B (33 OCTAL) GEN INFORMATION RECORD JMP GENR YES, USE GEN PROCESSOR CPA .34B (34 OCTAL) LOADER INFO RECORD JMP LODR YES, USE LOD PROCESSOR CPA .26B INTEGER ARITH(HARDWARE)? JMP HA70 YES.... CPA .6 (6) ARITH MACRO? JMP INST,I YESM JUMP TO PROCESS IT.. ADA .M10 -10 SSA OCT OR DEC? JMP HA40 YES. SZA,RSS BSS? JMP HA3M TO BSS PROCESSOR. CPA .4 (4) MEM REF? JMP HA3L YES,TEST FOR LITERAL LDA CODE GET OPCODE I.D. NUMBER. ADA M100B SUBTRACT 100 OCTAL. SSA,RSS CODE <100B ? JMP XMIC NO, IT'S A MICROCODE MACRO. HA3B CLA,INA TO ADD 1 TO PLCN * * * INCREMENT PROGRAM LOCN. CNTR. * * HA3Z ADA PLCN ADD CURRENT LOC'N. STA PLCN SAVE NEW PROG. LOC'N COUNT. JMP HA32 GO TO GET NEXT STATEMENT. .26B OCT 26 FOR HARDWARE ARITHMETIC SPC 1 * * PROCESS BSS * * HA3M JSB CHOPI EVALUATE OPERAND. JMP HA32 * ERROR * LDA 1 B TO A JMP HA3Z GO UPDATE PROG. LOC'N COUNT. HA3L LDA LTFLG SZA,RSS LITERAL PRESENT ? JMP HA3B NO LDA INST SLA IS LITERAL LEGAL WITH INST? JMP *+3 YES JSB OPERR NO 'M' ERROR JMP HA3B JSB ?PLIT PROCESS LITERAL NOP IGNORE ERROR JMP HA3B * .M3 DEC -3 .12B OCT 12 .32B OCT 32 .33B OCT 33 .34B OCT 34 .100B OCT 100 M100B OCT -100 .M10 DEC -10 BYT OCT 43 OPCODE I.D. NO. FOR 'BYT' DEX OCT 25 OP TYPE FOR 'DEX' DEY OCT 44 OP TYPE FOR 'DEY' ENFLG NOP FLAG FOR PROCESSING ENTRY POINTS S BSS 1 * SKP * * PROCESS 'COMMON' DECLARATION * * CMQ LDA SCN1+2 STA PNTR SET POINTER STA TEST SET TEST (U) = 0. CMQA LDB PNTR JSB SYMCK GO TO CHECK FOR VALID SYMBOL. JMP HA32 ** ERROR ! GO TO GET NEXT STATEMENT. LDB PBF8,I SAVE CURRENT COM. LOC'N STB S FOR SYMBOL TABLE VALUE. LDB TEST GET CHARACTER FOLLOWING THE SYMBOL. CPB L+4 COMMA? JMP HM2 YES CPB BLNK END OF OPERAND ? JMP HM2 YES, IT'S = BLANK CPB L LEFT PAREN? RSS YES, = ( JMP HA55+1 NO. ERROR: 1ST PASS JSB BPKUP SKIP BLANKS STB TEMP+1 SAVE POINTER JSB MSYM MEASURE COM LENGTH STA TEMP SAVE NUMBER OF CHARACTERS JSB SPNTR ALIGN POINTER LDA TEST CPA L+1 RT PAREN? RSS YES, = ) JMP HA55+1 NO. 1RST PASS ERROR! STA PEEK LDB TEMP LDA LAST ADB .M1 LENGTH-1 TO B REG CPA .B =B? (OCTAL VALUE) RSS YES-SKIP ADB .401B NO, SET FOR DECIMAL LDA TEMP+1 JSB ASCN GO TO ASCII CONVERSION ROUTINE JMP HA32 ERROR EXIT ADA PBF8,I BUMP LENGTH OF OOMMON STA PBF8,I * * * INSERT 'COMMON' SYMBOL INTO TABLE * HM3 LDA .3 SET RELOC=COMMON LDB S VALUE TO B JSB INSR INSERT SYMBOL NOP ERROR EXIT LDA PEEK CPA BLNK BLANK? JMP HA32 YES, EXIT TO HA32 CPA L+4 COMMA? RSS YES JSB PKUP GET NEXT CHAR JSB ENDTS TEST FOR TERMINATION JMP CMQA HM2 ISZ PBF8,I STB PEEK SAVE TEST JMP HM3 * * PROCESS 'EXT' DECLARATION * EXP LDA SCN1+2 STA PNTR SET POINTER EXPA LDB PNTR JSB SYMCK GO TO CHECK FOR VALID SYMBOL. JMP HA32 ** ERROR: INVALID SYMBOL ! LDB CNTR VALUE TO B LDA .4 (4) EXT INDIC. JSB INSR GO TO INSERTION ROUTINE JMP *+2 ERROR EXIT ISZ CNTR BUMP EXT CNTR LDA TEST JSB ENDTS TEST FOR TERMINATION JMP EXPA GO BACK, THERE'S ANOTHER 'EXT'!! * * * PROCESS 'ENT' DECLARATION * ENP LDA .10B SET ENFLG = 10B STA ENFLG LDA SCN1+2 STA PNTR SET POINTER ENPA LDB PNTR JSB SYMCK GO TO CHECK FOR VALID SYMBOL. JMP HA32 ** ERROR: INVALID SYMBOL ! LDA .210B SET 'U' & 'E' FIELDS = 1 CLB JSB INSR INSERT INTO THE SYMBOL TABLE NOP LDA TEST JSB ENDTS TEST FOR TERMINATION JMP ENPA ENDTS NOP TEST FOR TERMINATION CPA BLNK OF COM,ENT OR EXT JMP HA55E CPA L+4 COMMA? RSS YES JMP HA55+1 NOT AN ERROR EXIT JSB BPKUP SCAN TO NEXT CHAR. JMP ENDTS,I * * PROCESS 'EMA' DECLARATION EMP CLA,INA SET EMA FLAG STA EMFLG LDA EMCNT COUNTER FOR # OF EMA INSTR. SZA AN EMA INSTR ALREADY ENCOUNTERED? JMP EMAIL YES, THEN ERROR LDA SCN1+2 SET POINTER TO FIRST OPCODE'S STA PNTR RELATIVE CHARACTER POSITION LDA .2 PRETEND IT IS AN ASC INSTRUCTION JSB CHOP GET VALUE OF FIRST OPERAND JMP HA32 ERROR RETURN SZA IS VALUE ABSOLUTE? JMP EMAOP NO THEN OPERAND ERROR LDA SUMP SAVE VALUE OF FIRST OPERAND STA EMASZ WHICH IS EMA SIZE * JSB PKUP PICKUP NEXT CHAR CPA L+4 IS IT A COMMA? RSS YES JMP EMAOP NO, THEN ERROR JSB BPKUP SKIP OVER ANY BLANKS STB SCN1+2 SET OPERAND POINTER AT 2ND PARAMETER CLA SET A=0 FOR NO COMMA JSB CHOP GET VALUE OF THE MSEG SIZE JMP HA32 ERROR RETURN SZA ABSOLUTE VALUE? JMP EMAOP NO, THEN ERROR-BAD OPERAND LDA SUMP YES, GET VALUE STA MSGSZ SAVE THE MAPPING SEGMENT SIZE * TEST FOR VALIDITY OF EMA SIZE AND MSEG SIZE LDA EMASZ GET EMA SIZE SSA -VE? JSB EMAOP YES, THEN OPERAND ERROR CMA,INA NEGATE EMA SIZE ADA .1023 MUST BE LESS THAN 1024 SSA EMA SIZE LESS THAN 1024? JMP EMAOP NO THEN OPERALND ERROR LDA MSGSZ NO, GET MSEG SIZE SSA -VE? JMP EMAOP YES, THEN OPERAND ERROR CMA,INA NEGATE MSEG SIZE ADA .31 SSA IS IT LESS THAN 32? JMP EMAOP NO, THEN ERROR * BOTH OPERANDS ARE VALID , TEST FOR LABEL JSB LBCK LABEL PRESENT? STA SYMP YES, SET CHARACTER COUNT LDB FFUB GET BUFFER ADDRESS STB SYMP+1 SET LABEL ADDRESS LDA .4 EXT INDICATOR LDB CNTR ORDINAL # - VALUE JSB INSR INSERT EMA LABEL INTO SYMBOL TABLE JMP HA32 ERROR EXIT ISZ CNTR INCREAMENT ORDINAL# CLA STA EMFLG CLEAR EM FLAG INA SET EMA COUNT TO INDICATE AN EMA STA EMCNT INSTRUCTION HAS ALREADY BEEN ENCOUNTERED JMP HA32 READ NEXT STATEMENT * PRINT EMA ERRORS EMAOP JSB OPERR OPERAND ERROR JMP HA32 READ NEXT STATEMENT EMAIL LDA .IL 'IL' ILLEGAL INSTR ERROR JSB ERPR PRINT ERROR MESSAGE JMP HA32 READ NEXT STATEMENT * EMASZ NOP MSGSZ NOP EMFLG NOP EMCNT NOP .31 DEC 31 .1023 DEC 1023 * HA55E CLA STA ENFLG CLEAR 'ENT'FLAG JMP HA32 EXIT ON A BLANK SPC 1 * * PNTR+1+'A' TO PNTR * SPNTR NOP ADA PNTR INA STA PNTR JMP SPNTR,I * .10B OCT 10 .210B OCT 210 SPC 1 HA63 LDA .IL NAM IS ILLEGAL AFTER START JMP HA55+2 TO ERPR * ************************************************* * * INSR: ADD ENTRY TO THE SYMBOL TABLE, W HACCOU * * * LINKAGE: A = TYPE B = VALUE ON INPUT * * * (OUTPUT) SYMP=NO.OF CHARS., SYMN=ENTRY FWA * * * L JSB INSR,I * * * L+1 ERROR RETN ('SO' OR 'DD'PRNTD)* * * L+2 NORMAL RETN * * ************************************************* .EN ASC 3,ENDDSO INSR NOP STA FLX1 SAVE TYPE STB NAME+3 SAVE VALUE JSB ?SYMK SYMBOL TABLE LOOKUP JMP INS1 NOT FOUND; GO TO INSERT. LDB ENFLG ALREADY THERE. SZB,RSS IN ENTRY PROC? JMP INSY NO ADA .M4 (-4) CHECK SYMBOL TYPE: SSA IS IT ABS,REL,B.P.,OR COM ? JMP INSC YES ENERR LDA .EN 'EN' ERROR: WRONG TYPE, DUPLICATE OR JMP INSX REFERENCE TO EXT-DEFINED SYMBOL. INSY AND .7 ISOLATE SYMBOL TYPE. LDB FLEX GET CURRENT FW OF ENTRY. SSB,RSS UNDEFINED ENTRY POINT? JMP INSG NO BLF IS THE 'E' BIT SET? SSB,RSS JMP INSG NO, THEN AN EMA LABEL LDB FLX1 YES, GET CURRENT SYMBOL TYPE CPB .4 EQUATING EXT TO ENT-DEFINED SYMBOL? JMP INSX-1 YES: 'DD' ERROR! ADA .M4 NO, CHECK TYPE: SSA,RSS ABS,REL,B.P. REL,OR COM? JMP ENERR INVALID TYPE FOR ENT! LDA FLX1 GET SYMBOL TYPE. ALF,ALF POSITION TO BITS #8-11 IOR FLEX INCLUDE ORIGINAL DATA, ELA,CLE,ERA CLEAR UNDEFINED BIT. LDB NAME+3 SET VALUE INTO STB TEMP+1,I SYMBOL TABLE ENTRY. JMP INSEX-1 FINISH PROCESSING. INSG CPA .7 LITERAL? JMP INSR,I YES, EXIT CPA .4 EXT? JMP INSZ YES, TEST INSE LDA .EN+1 NO, 'DD' ERROR (MULTIPLE SYMBOL) INSX JSB ERPR JMP INSR,I GET OUT HERE INSZ LDB FLEX EMA? SSB IS THE 'U' BIT SET? JMP INSE YES, ERROR LDB EMFLG IN EMA PROCESS? SZB JMP INSE YES, ERROR CPA FLX1 ARE BOTH EXT'S? JMP INSR,I YES, FAKE 'DD'EXIT (FOR ARITH. MACRO'S). JMP INSE GO TO ERROR PRNT INS1 LDA FLX1 ALF,ALF ADA NAME TYPE IN FIRST WORD LDB EMFLG IN EMA PROCESS? SZB IOR BIT15 YES, SET 'U' BIT TO INIDICATE EMA LABEL STA NAME OF ENTRY LDB NAMI ADB TEMP+2 STB TEMP+1 SET LIMIT LDA ?NDOP LWA-1 FOR SYMBOL TABLE CMA,INA ADA SYMI TEST FOR SYMBOL TBL ADA TEMP+2 OVERFLOW SSA JMP *+3 NO LDA .EN+2 'SO' SYMBOL TABLE OVERFLOW JMP INSX 'SO' ERROR LDA NAME+3 MOVE VALUE STA 1,I UP LDA NAMI LDB 0,I ADD ENTRY (FROM *+6) STB SYMI,I TO SYMBOL CPA TEMP+1 JMP INS5 GO SET NEW END OF SYMBOL TABLE. INA ISZ SYMI JMP *-6 INS5 LDB SYMI STB ?NDSY SET NEW END OF SYMBOL TABLE. JMP INSEX EXIT. INSC LDA .4000 IOR TEMP+4,I STA TEMP+4,I SET ENTRY POINT TYPE INSEX ISZ INSR BUMP EXIT POINT FOR A+2 EXIT JMP INSR,I EXIT HERE .M4 DEC -4 * * ************************************ * * INSERT LITERAL INTO SYMBOL TABLE * * ************************************ LITIN NOP LDA ?ICSA GET LOC'N OF ASCI BUFFER STA SYMP+1 LDA .7 (7) STA LTFLG LDB PLEN JSB INSR INSERT SYMBOL JMP LITIN,I ERROR RETN. ISZ PLEN BUMP LITERAL LOC'N CNTR ISZ LITIN JMP LITIN,I EXIT(NORMAL) * SKP * *********************** * * PROCESS OCT AND DEC * * *********************** HA40 CLB,INB B=1 CPA DEX CHECK CODE FOR 'DEX' ADB .2 B=3 IF CODE IS 'DEX' CPA DEY IF CODE = DEY THEN LDB .4 SET WORD COUNT = 4 STB TEMP+5 SET LOCN COUNT BUMPER CLA STA CNTB STA TEMP LDA SCN1+2 STA PNTR SET POINTER * * * PICK UP AND EXAMINE A CHARACTER * * HA41 JSB PKUP LDB TEMP+5 GET COUNT BUMPER CPA L+4 COMMA? JMP HA44 YES, GO SCAN FOR NEXT PARAM. ADB .M2 IF (TYPE=DEX) OR (TYPE=DEY) THEN SSB,RSS JMP HA42 GO CONTINUE SCAN LDB TEMP+5 CPA L+6 PERIOD? JMP HA48 YES, GO TEST FLT. POINT. CPA .E 'E' ? JMP HA48 YES, GO SEE IF DECIMAL PT., ALSO HA42 CPA BLNK END OF STATEMENT? JMP HA49 YES JMP HA41 * * * RESET FLT PT FLAG, SKIP BLANKS FOR NEXT CHAR * HA44 CLA STA TEMP JSB BPKUP LDB TEMP+5 GET 'BUMP' COUNT JMP HA48+4 * * * FLT PT TEST FOR NUMBER USING BOTH . AND E * HA48 LDA TEMP ISZ TEMP SZA E OR '.' COUNTED YET? CLB YES, SET B=0. * ADB CNTB (HA48+4) STB CNTB ADD TO WORD COUNT JMP HA41 * * * END OF NUMERIC PSEUDO-OP PROCESSOR * HA49 LDA TEMP+5 ADA CNTB SET A=NO OF LOCNS TO BE USED LDB CODE GET OPCODE I.D. NO. CLE PREPARE FOR REMAINDER TEST. CPB BYT BYTE? ERA YES, DIVIDE BY 2 SEZ ODD BYTE REMAINING? INA YES, ADD 1 TO WORD COUNT. JMP HA3Z EXIT * * ******************************** * * PROCESS ASC (GET VALUE OF N) * * ******************************** HA54 LDA .2 (2) 'ASC' INDIC.FOR CHOP JSB ?CHOP JMP HA3B * ERROR * SZA JMP HA55 ERROR-NOT ABS.VAL. SZB,RSS ZERO WORDS? JMP HA55 YES - * ERROR * ADB .M29 -29 LDA SUMP SSB SKIP IF >28 WORDS JMP HA3Z HA55 ISZ PLCN * ERROR EXIT * INFER LDA .MBLN 'M' ERROR(BAD OPERAND) JSB ERPR TO PRINT ERROR DIAG. JMP HA32 * * ******************************************************** * * * * * SYMCK: CHECK FOR A VALID SYMBOL * * * ENTER: = DON'T CARE. * * * = 'PNTR' (RELATIVE POS'N 1RST CHAR.) * * * RETURN: P+1 - INVALID SYMBOL ('SY' ERROR PRINTED) * * * P+2 - VALID SYMBOL. * * * * * * * * ******************************************************** SYMCK NOP STB PNTSV SAVE 'PNTR' FOR LATER RESTORATION. JSB MSYMS GO TO MEASURE THE SYMBOL. STA SYMSZ SAVE CHARACTER COUNT. CMA,INA NEGATE THE COUNT, STA SMCNT AND SAVE FOR 'SYMTS' LOOP COUNT. LDA TEST GET CONTINUATOR CHARACTER AND STA SYTST SAVE FOR LATER RESTORATION. LDA PNTSV GET POINTER TO FIRST CHARACTER. JSB GETC GO TO GET THE CHARACTER. LDB SMCNT GET NEGATIVE SYMBOL SIZE. JSB SYMTS GO TO CHECK FOR LEGAL SYMBOL. RSS ** ERROR: SET RETURN TO P+1. ISZ SYMCK VALID: SET RETURN TO P+2. LDA PNTSV RESTORE FORMER CONTENTS STA PNTR OF CHARACTER POINTER. LDA SYMSZ GET SYMBOL MEASUREMENT. JSB SPNTR GO TO ALIGN 'PNTR' FOR NEXT USE. LDA SYTST RESTORE THE STA TEST ORIGINAL CONTINUATOR. JMP SYMCK,I RETURN: P+1=ERROR; P+2=O.K. * PNTSV NOP TEMP. STORAGE: 'PNTR'. SYMSZ NOP TEMP. STORAGE: SYMBOL SIZE. SMCNT NOP TEMP. STORAGE: -SYMSZ. SYTST NOP TEMP. STORAGE: 'TEST'. * * ********************** * * PROCESS EQU PSEUDO * * ********************** HA56 JSB LBCK CHECK FOR REQUIRED LABEL. JSB CHOPI EVALUATE OPERAND JMP HA32 * ERROR * STB TEMP+1 CPA .4 (4) EXT ? RSS JMP HA57 LDA .5 (5) SET FOR NON-PNCH EXT LDB FLEX IS THIS AN EMA? SSB,RSS JMP HA57 NO CLB,INB YES,THEN SET EMA FLAG STB EMFLG HA57 STA TEMP NO CLB,INB JSB MSYMS GO TO MEAS.SYMBOL, SET SYMP/SYMN LDA TEMP LDB TEMP+1 * * * SEND LABEL TO TABLE * JSB INSR TO SYMBOL TABLE INSERTION RTN NOP CLA CLEAR EMA FLAG STA EMFLG JMP HA32 * ******************************* * * ORB ORG ORR PROCESSOR JUMPS * * ******************************* HA64 JSB INST,I GO TO SUBROUTINE JMP HA32 HA70 LDB LTFLG GET LITERAL FLAG SZB IS A LITERAL IN THE OPERAND? JSB ?ARTL GO PROCESS THE LITERAL LDA .2 A=2 JMP HA3Z * ********************************** * * PROCESS REPLACEMENT CODE (ENT) * * ********************************** HA71 JSB LBCK CHECK FOR REQUIRED LABEL. JSB CHOPI EVALUATE OPERAND. JMP HA32 *ERROR* GET NEXT STATEMENT. STB TEMP+1 SAVE OPERAND. CLB,INB POINT TO 1RST CHAR. OF LABEL. JSB MSYMS MEASURE SYMBOL,SET SYMP/SYMN LDA .14 (16B)CODE-REPLACEMENT ENT RECORD. LDB TEMP+1 GET REPLACEMENT CODE VALUE. JSB INSR INSERT SYMBOL & VALUE IN TABLE. NOP (ERRORS ARE ALREADY NOTED) JMP HA32 GO GET NEXT STATEMENT.