ASMB,Q,C HED HEADER FOR FILES &F4XCS AND $F4XCS . NAM F4XCS,8 92834-12001 REV.2030 800715 * *************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * *************************************************************** * NAME: PART OF FTN4X * * SOURCE: PART OF 92834-18001 * * RELOC: PART OF 92834-12001 * * PGMR: B.G. * *************************************** * END ASMB,L HED "Z$INT" - SYSTEM PARAMETERS. NAM Z$INT,8 92834-12001 REV.2030 800304 * *************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * *************************************************************** * NAME: PART OF FTN4X * * SOURCE: PART OF 92834-18001 * * RELOC: PART OF 92834-12001 * * PGMR: B.G. * *************************************** * ENT Z$INT,Z$LPP * Z$INT RPL 1 1-WORD INTEGERS. Z$LPP RPL 59 59 LINES/PAGE. * END ASMB,Q,C HED STATEMENT DISPATCHER FOR FTN4X. NAM DSP.F,8 92834-12001 REV.2030 800805 * *************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * *************************************************************** * NAME: PART OF FTN4X * * SOURCE: PART OF 92834-18001 * * RELOC: PART OF 92834-12001 * * PGMR: B.G. * *************************************** * * EXT'S WITH A LEADING 'F.' ARE VARIABLES OR JUMP TARGETS * * THE COLUMN THE EXT STARTS IN DEFINES THE SUBROUTINE IT IS * DEFINED IN AS FOLLOWS * 2 -- OA.F (WRITE PASS FILE ROUTINES) * 3 -- NEX.F (STATEMEXTS THAT DON'T CONTAIN EXPRESSIONS) * 4 -- FA.F (THE ASSIGNMEXT TABLE ROUTINES) * 5 -- EX.F (STATEMEXTS USING THE EXPRESSION EVALUATOR) * 6 -- IC.F (THE CHARACTER INPUT ROUTINES) * 7 -- IDN.F (THE TOKEN INPUT ROUTINES) * 8 -- FTN4 ( THE MAIN) EXT F.A ASSIGNMEXT TABLE ADDRESS (CURRENT ENTRY) EXT F.ABT ABORT COMPILE EXTRY EXT F.AT ADDRESS TYPE OF CURRENT ITEM. ENT F.BGN STARTING POINT AFTER SEGMENT 0 LOADED. EXT F.CC CHARACTER COUNT EXT F.CCW FTN OPTION WORD. ENT F.CRT TEST FOR C/R & GO ON TO NEXT STMT. EXT F.D DO TABLE POINTER. EXT F.DCF DIM, COM FLAG EXT F.DNI ADDR OF (NID) BUFFER. EXT F.DO LWA MEM & LWA+1 DO TABLE. EXT F.EMA F.A OF EMA MASTER. EXT F.END END FLAG EXT F.FNS FIRST NON-SPECIFICATION CHECK. EXT F.IDI CONSTANT BUFFER. EXT F.IM CURRENT ITEM MODE. EXT F.IU CURREXT ITEM USAGE (DUM., RELATIVE, ECT.) EXT F.L # WORDS ON STACK 2 EXT F.LFF LOCICAL IF FLAG EXT F.LSF EXPECT FIRST STATEMEXT FLAG EXT F.LSN F.A OF LAST STATEMEXT NUMBER EXT F.LSP LAST OP FLAG: 0 IF CAN'T FALL THRU. EXT F.MSG MSEG SIZE. EXT F.NCR NO CROSS REF FLAG. EXT F.NT NAME TAG 0= VAR, 1=CONSTANT. EXT F.NXN NO INPUT FLAG ENT F.P1E PASS 1 ERROR EXIT POINT. EXT F.RPL PROGRAM LOCATION COUNTER. EXT F.SEG LOAD A NEW SEGMENT EXT F.SID STATEMEXT ID PHASE FLAG EXT F.SLF STATEMEXT LEVEL FLAG EXT F.STA FLAG THAT IS ZERO UNTIL THE FTN STATEMEXT IS READ EXT F.STB STRING BACK FLAG (LOGICAL IF) ENT F.STS ENTRY TO STATEMENT SCAN (LOGICAL IF). EXT F.SVL SAVE # WDS ON OPER STACK (F.L) EXT F.T # WORDS ON STACK 1 EXT F.TC NEXT CHARACTER EXT F.TL LENGTH OF TITLE. ENT F.TRM TERMINATE COMPILE. (SOURCE END) EXT F.TTL TITLE. EXT F.#B # BUFFER BLOCKS. EXT F.#M # NON-DISC CONNECTIONS. EXT F.#N # DISC CONNECTIONS. EXT F.#S BUFFER MULTIPLE. EXT F.$CC SAVED F.CC AT $ STATEMENT BREAK. * * EXT'S WITH A TRAILING '.F' ARE SUBROUTINES * EXT CSN.F CHECK STATEMENT # TYPE. ENT CTL.F COPY TITLE TO PASS FILE. EXT DAF.F DEFINE F.AF EXT DAT.F DEFINE F.AT EXT DEM.F DEFINE F.EM=1 EXT DL.F DEFINE LOCATION: F.AF_F.RPL. EXT EJP.F EJECT PAGE. EXT ER.F ERROR PRINT SUBROUTINE EXT EXN.F EXAMINE NEXT CHARACTER EXT FA.F FETCH ASSIGNS. EXT IC.F GET NEXT CHARACTER. EXT ICH.F GET NEXT NON BLANK CHAR. AND TYPE IT EXT IDN.F INPUT DO NOT ASSIGN (GET NEXT OPERAND) EXT INM.F INPUT NAME. EXT ISN.F INPUT STATEMEXT NUMBER EXT ISY.F INPUT SYMBOL EXT ITS.F TEST CURRENT ITEM INTEGER. ENT KWP.F KEYWORD SEARCH (JOINED IN PROGRESS). ENT KWS.F KEYWORD SEARCH. EXT MCC.F RESET TO FIRST COLUMN OF STATEMEXT EXT PAK.F PACK & OUTPUT ASCII DATA. EXT PSI.F PRINT SOURCE IMAGE. EXT RP.F REQUIRE RIGHT PAREN & INPUT NEXT. EXT SCP.F SAVE CURRENT STMT POS (NEW STMT, SAME LINE). EXT SNC.F START NEXT CARD SUBROUTINE EXT TCT.F TEST (A)=F.TC ELSE ERROR 28. EXT TS.F TAG ITEM AS SUBROUTINE. EXT UC.F UNINPUT COLUMN EXT WAR.F WARNING MESSAGE PRINTER. EXT WS1.F WRITE A WORD TO SCRATCH FILE 1. * * FORMAT PROCESSOR. * ENT F.FMT * * SYSTEM LIBRARY. * EXT .MVW SPC 1 SUP A EQU 0 A-REGISTER B EQU 1 B-REGISTER SKP * ********************************** * * SOURCE END. VERIFY PROGRAM END * * ********************************** SPC 1 F.TRM LDA K98 LDB F.END LAST STATEMENT WAS 'END' ? SZB,RSS JMP F.ABT NO. ERROR 67. LDB K4 YES. LOAD SEGMENT 4. STB F.STA BUT DON'T LOOK FOR 'FTN,...' JMP F.SEG * K4 DEC 4 K98 DEC 98 SPC 2 * *********** * * SAVE CC * * *********** SPC 1 SCC.F NOP LDA F.CC SAVE COLUMN COUNTER STA F.SCC JMP SCC.F,I * F.SCC OCT 0 SAVE F.CC K29 DEC 29 SKP * ******************* * * STATEMENT INPUT * * ******************* SPC 1 F.BGN JSB SCC.F SAVE THE CHARACTER POSITION CLA STA F.A SET ASSIGNMENT TABLE PTR TO 0 STA F.LSN SET NO STMT #. LDA K46 WRITE START-OF-STATEMENT OPERATOR. JSB WS1.F JSB IC.F DIRECTIVE ? CPA "$" JMP DRCTV * CPA B40 STRIP BLANKS. JSB ICH.F JSB UC.F AND POSITION TO LAST BLANK. LDA F.TC CPA B15 IF BLANK CARD JMP F.CRT TREAT AS A CONTINUE CARD * LDA F.CC BEYOND COL. 6? ADA KM6 SZA,RSS IF EXACTLY 6 THEN MUST BE ISZ F.CC A '0' SO PUSH ON SSA,RSS WELL?? JMP F.STS YES, NO NUMBER. * CLA INPUT ANY KIND OF STATEMENT #. JSB ISN.F LDA F.A STA F.LSN LAST STATEMENT NUMBER FLAG LDA F.TC LOAD THE LAST CHARACTER READ. CPA B15 CARRIAGE-RETURN? RSS YES. STMT # ON BLANK CARD. JMP F.STS NO, IDENTIFY THE CARD TYPE. * LDA K29 BITCH: STATEMENT NO. ON BLANK CARD JSB ER.F SPC 2 KM6 DEC -6 K46 DEC 46 B15 OCT 15 C/R B50 OCT 50 '(' "$" OCT 44 $ "EN" ASC 1,EN "D$" ASC 1,D$ "D/" BYT 104,15 SKP * ********************** * * DIRECTIVE HANDLING * * ********************** SPC 1 DRCTV CLA,INA SET DIRECTIVE FLAG. STA F.DF STA F.NXN SET 'NO INPUT': ONLY ONE LINE. JSB KWS.F SEARCH FOR THE KEYWORD. DEF DRTBL SZA,RSS IF NOT FOUND, JMP DRC01 THEN ALSO ERROR. * ADA DRJMP ELSE GET PROCESSOR, LDA A,I JMP A,I AND DO IT. * DRC01 JSB PSI.F ERROR. PRINT THE LINE. JMP STID2 THEN COMPLAIN. * DRTBL ASC 11,EMA PAGE FILES TITLE , DRJMP DEF * KEEP IN ORDER: * DEF EMA * DEF PAGE * DEF FILES * DEF TITLE * * F.DF NOP DIRECTIVE FLAG: 1=THIS STMT IS DIRECTIVE. SKP * ******************* * * TITLE DIRECTIVE * * ******************* SPC 1 * NOTE: SINCE '$TITLE' TAKES UP 6 CHARACTERS, AND THE NO-INPUT * FLAG IS SET, THE MAXIMUM POSSIBLE TITLE IS 66 CHARACTERS. * TITLE LDA DFTTL SET UP TITLE POINTER. RAL,CLE,SLA,ERA REMOVE AT MOST ONE INDIRECT. LDA A,I STA T1TTL STA T2TTL SAVE FOR COMPUTING # WDS WRITTEN. JSB EXN.F STRIP BLANKS OFF. TTL01 JSB IC.F GET TWO TITLE CHARACTERS. CPA B15 IF FIRST IS C/R, JMP TTL02 THEN DONE. * ALF,ALF POSITION & SAVE. STA T3TTL JSB IC.F SECOND. CPA B15 IF SECOND IS C/R, LDA B40 CHANGE TO BLANK FOR NOW. IOR T3TTL MERGE IN FIRST. STA T1TTL,I STORE IN TITLE BUFFER. ISZ T1TTL BUMP POINTER. JMP TTL01 GET MORE. (MAY RE-READ C/R) * TTL02 LDB T1TTL BACK UP POINTER PAST BLANKS. LDA BLNKS (A) = TWO BLANKS. TTL03 CPB T2TTL AT START ? JMP TTL04 YES. WE'RE JUST CLEARING THE TITLE. * ADB KM1 ELSE BACK UP ONE, CPA B,I BLANKS ? JMP TTL03 YES. KEEP BACKING UP. * INB (B) = (LWA+1) OF TITLE. TTL04 STB T1TTL SAVE THE LWA+1. LDA T2TTL # WORDS WRITTEN = CMA,INA -(FWA) ADA B +(LWA+1) STA F.TL SET THAT AS THE TITLE LENGTH. JSB CTL.F COPY TO PASS 2. JMP PAGE GO PAGE EJECT & BUMP LINE #. * BLNKS ASC 1, T1TTL NOP CURRENT POINTER INTO TITLE BUFFER. T2TTL NOP FWA TITLE BUFFER (DIRECT). T3TTL NOP TEMP FOR MERGING TWO CHARACTERS. DFTTL DEF F.TTL FWA TITLE BUFFER. MAY BE INDIRECT ! SKP * ************** * * COPY TITLE * * ************** SPC 1 CTL.F NOP LDA F.TL TITLE LENGTH. ALF,ALF SET UP OPCODE. IOR K58 JSB WS1.F LDA F.TL AGAIN. CMA,INA,SZA,RSS NEGATE. ZERO ? JMP CTL.F,I YES. DONE. * STA T1CTL NO. SET UP COUNTER. LDA DFTTL SET UP POINTER. RAL,CLE,SLA,ERA LDA A,I STA T2CTL CTL01 LDA T2CTL,I SEND ANOTHER. JSB WS1.F ISZ T2CTL BUMP POINTER. ISZ T1CTL COUNT. JMP CTL01 MORE. JMP CTL.F,I DONE. * T1CTL NOP COUNTER. T2CTL NOP POINTER. KM1 DEC -1 K57 DEC 57 K58 DEC 58 B4002 OCT 4002 K34 DEC 34 K31 DEC 31 BCOMI OCT 7000 SKP * ****************** * * PAGE DIRECTIVE * * ****************** SPC 1 PAGE JSB ICH.F READ CHAR AFTER DIRECTIVE: CPA B15 REQUIRE C/R. RSS O.K. JMP DRC01 NO. PRINT LINE & ISSUE ERROR. * LDA F.CCW 'L' OPTION ? SLA,RSS JMP PAG02 NO. DONE. * AND B4002 'Q' OR 'M' ? SZA JMP PAG01 YES. * JSB EJP.F NO. DO IT NOW. JMP PAG02 THEN DONE. * PAG01 LDA K57 SEND OPCODE TO FORCE PAGE EJECT JSB WS1.F IN PASS 2. * PAG02 LDA K29 SINCE THE DIRECTIVE WASN'T PRINTED, JSB WS1.F MUST TELL PASS 2 TO BUMP LINE NUMBER. JMP F.CRT DONE. SKP * ***************** * * EMA DIRECTIVE * * ***************** SPC 1 EMA JSB PSI.F ALWAYS PRINT THIS ONE. LDB F.LSF BEFORE FIRST STATEMENT ? LDA K34 (ERROR: OUT OF ORDER) SZB,RSS WELL ? JSB ER.F NO. ERROR. * LDB F.EMA FIRST EMA STATEMENT ? SZB JSB ER.F NO. ERROR. * JSB ICH.F YES. READ THE '('. LDA B50 REQUIRE IT. JSB TCT.F JSB INM.F READ THE COMMON BLOCK NAME. LDA BCOMI AND JSB DAT.F SET UP AS COMMON JSB TS.F MASTER - TYPE SUB. LDA F.A SET F.EMA = ADDR OF MASTER. STA F.EMA JSB DAF.F SET TO POINT AT SELF (0 LENGTH LINKED LIST) JSB DEM.F SET TO BE TYPE EMA. LDA F.TC IS DELIMETER: CPA B54 A COMMA ? RSS YES. JMP EMA02 NO. MUST BE ')'. * * SET UP MSEG SIZE, CHECK ')'. * JSB GDC.F GET VALUE. LDB A A=B=VALUE. AND K31 LIMIT TO 31. CPA B (MUST NOT EXCEED 5 BITS) RSS JMP GDC02 TOO BIG. ERROR. * STA F.MSG SAVE THE VALUE. EMA02 JSB RP.F REQUIRE ')' NOW, & READ C/R JMP F.CRT TEST C/R, THEN DONE. SKP * ******************* * * FILES DIRECTIVE * * ******************* SPC 1 FILES JSB PSI.F ALWAYS PRINT. LDB F.LSF BEFORE FIRST STATEMENT ? LDA K34 SZB,RSS JSB ER.F NO. ERROR 34. * LDB F.#S FIRST FILES ? SZB JSB ER.F NO. ERROR. * JSB EXN.F YES. SKIP OPTIONAL '(' CPA B50 JSB ICH.F * * GET M & N . * JSB GDC.F GET DIRECTIVE CONSTANT (M). STA F.#M SAVE. CMA,SSA,INA,RSS NEGATE. WAS IT NEGATIVE ? JMP FIL04 YES. ERROR. * ADA K64 NO. > 64 ? SSA JMP FIL04 YES. ERROR. * LDA B54 NO. REQUIRE COMMA. JSB TCT.F JSB GDC.F GET (N). STA F.#N CMA,SSA,INA,RSS NEGATE. WAS IT NEGATIVE ? JMP FIL04 YES. ERROR. * ADA K16 NO. > 16 ? SSA JMP FIL04 YES. ERROR. * LDA F.#M M = M + N. ADA F.#N STA F.#M * * GET S OR "DS". * LDB F.TC NO. IS S/DS PRESENT ? CPB B54 JMP FIL07 (YES) * CLA,INA NO. S=1. STA F.#S JMP FIL08 AND DEFAULT F.#B TOO. SKP FIL07 JSB EXN.F YES. IS NEXT PARAM NUMBER ? SZB,RSS JMP FIL01 YES. GO GET IT. * JSB KWS.F NON-DIGIT. REQUIRE "DS". DEF FILDS 1-ITEM KEYWORD SEARCH. SZA FOUND IT ? (I.E., IS IT "DS" ?) JMP FIL02 YES. LEAVE S=0. JMP FIL05 NO. ERROR. * FIL01 JSB GDC.F GET S. STA F.#S CMA,SSA,INA,SZA NEGATE. .LE. 0 ?. RSS (NO) JMP FIL04 YES. ERROR. * ADA K64 NO. > 64 ?. SSA JMP FIL04 YES. ERROR. * * GET B OR "FREESPACE". * LDA F.TC IS IT THERE ? CPA B54 RSS (YES) JMP FIL08 NO. DEFAULT IT. * JSB EXN.F DIGIT ? SZB,RSS JMP FIL09 YES. GET VALUE. * JSB KWS.F NO. MUST BE "FREESPACE". DEF FILFR SZA,RSS WELL ? JMP FIL05 NO. ERROR. * CCA YES. SET F.#B = -1 AS FLAG. STA F.#B JMP FIL02 GO EXIT. * FIL09 JSB GDC.F YES. GET IT. STA F.#B & SET IT UP. (CLEARED IF ERROR) AND B377 RESTRICT TO [0,255] CPA F.#B CMA,RSS (O.K.; -B-1) JMP FIL04 REJECT: OUT OF RANGE. * ADA F.#N N-B-1 SSA,RSS IF B '9' ? SSA,RSS JMP FMT04 YES. END OF DIGITS. ADA K10 < '0' ? (A=VALUE) SSA JMP FMT04 YES. END OF DIGITS. LDB T0FMT NO. ADD THIS DIGIT IN. RBL,RBL ADB T0FMT 5 * OLD #. RBL 10. ADB A ADD DIGIT. STB T0FMT ASL 4 > 2047 ? SOS JMP FMT03 NO. TRY FOR ANOTHER. * LDA K14 YES. COMPLAIN. JSB ER.F SKP * LOOK AT NON-DIGIT. PROCESS: ( ) H " ' * FMT04 LDB F.TC GET NEXT CHARACTER CPB "H" 'H' JMP FMT05 YES CPB B42 '"'? JMP FMT07 CPB B47 "'" ? JMP FMT07 * LDA K9 (ERROR #) CPB B15 C/R JSB ER.F YES. ERROR. * CPB B50 THIS A '('? ISZ T2FMT YES. CPB B51 A ')'? CCA,RSS YES. GO DECREMENT COUNT. JMP FMT02 NO. GO ON. ADA T2FMT STA T2FMT SZA OUTER RIGHT PAREN ? JMP FMT02 NO. GO ON. JSB ICH.F YES. SHOULD TRANSFER THE C/R JMP FMT09 GO WRAP UP. (F.CRT CATCHES IF NOT C/R.) * * HOLLERITH FORMAT. TRANSFER ALL CHARACTERS. * FMT05 LDB T0FMT SET UP THE COUNT. LDA K20 (ERROR #) CMB,INB,SZB,RSS ZERO ? JSB ER.F YES. ERROR. STB T0FMT NO. SAVE -(# CHARS) FMT06 JSB IC.F NEXT ! CPA B15 C/R ? JSB ER.F YES. ERROR 13. JSB PAC.F NO. SEND IT. ISZ T0FMT COUNT 'EM UP. JMP FMT06 MORE. JMP FMT02 DONE. * * QUOTE FORMATS. * FMT07 STB T0FMT SAVE TYPE OF QUOTE. FMT08 JSB IC.F SEND ALL. CPA B15 C/R ? JSB ER.F YES. ERROR. (A=13) JSB PAC.F SEND IT. LDA F.TC WAS IT MATCHING QUOTE ? CPA T0FMT JMP FMT02 YES, DONE. JMP FMT08 NO, GET MORE. SKP * END OF FORMAT. CLEAN UP & EXIT. * FMT09 LDA KM2 FLUSH PAK.F BUFFER. JSB PAK.F (MAYBE NOTHING WRITTEN - O.K.) ADB F.RPL UPDATE F.PRL STB F.RPL JMP F.CRT EXIT, CHECK FOR C/R. * * SUB TO CALL PAK.F IF FORMAT HAS STMT #. * PAC.F NOP LDB F.LSN FORMAT HAS STMT # ? SZB JSB PAK.F YES. DO IT. JMP PAC.F,I EXIT. SPC 2 T0FMT NOP T2FMT NOP BM72 OCT -72 "H" OCT 110 H KM2 DEC -2 K14 DEC 14 K20 DEC 20 K9 DEC 9 K50 DEC 50 K27 DEC 27 REL OCT 1000 F.AT = REL. * END ASMB,Q,C HED INPUT GROUP FOR FTN4 COMPILER NAM IC.F,8 92834-12001 REV.2030 800707 * *************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * *************************************************************** * NAME: PART OF FTN4X * * SOURCE: PART OF 92834-18001 * * RELOC: PART OF 92834-12001 * * PGMR: B.G. * *************************************** * * THIS MODULE CONTAINS THE CARD,CHARACTER,AND ITEM INPUT ROUTINES * * EXT'S WITH A LEADING 'F.' ARE VARIABLES OR JUMP TARGETS * * THE COLUMN THE EXT STARTS IN DEFINES THE SUBROUTINE IT IS * DEFINED IN AS FOLLOWS * 2 -- OA.F (WRITE PASS FILE ROUTINES) * 3 -- NEX.F (STATEMEXTS THAT DON'T CONTAIN EXPRESSIONS) * 4 -- FA.F (THE ASSIGNMEXT TABLE ROUTINES) * 5 -- EX.F (STATEMEXTS USING THE EXPRESSION EVALUATOR) * 6 -- IC.F (THE CHARACTER INPUT ROUTINES) * 7 -- IDN.F (THE TOKEN INPUT ROUTINES) * 8 -- FTN4 ( THE MAIN) EXT F.A ASSIGNMEXT TABLE ADDRESS (CURRENT ENTRY) EXT F.ABT ABORT COMPILE EXTRY EXT F.CC CHARACTER COUNT EXT F.CCW FTN OPTION WORD EXT F.DNI ADDRESS OF NID EXT F.END END FLAG EXT F.FLN FIRST LINE NUMBER IN MODULE. EXT F.IM CURREXT ITEM MODE (REAL, COMPLEX,ECT.) EXT F.IU CURREXT ITEM USAGE (DUM., RELATIVE, ECT.) EXT F.LNA ADDRESS OF CURRENT LINE EXT F.LNL LENGTH OF CURRENT LINE EXT F.LNN LINE # OF CURRENT LINE EXT F.NCR NO CROSS REF FLAG EXT F.NT NAME TAG 0= VAR, 1=CONSTANT. EXT F.NTF NAME TAG FLAG EXT F.NXN NO INPUT FLAG EXT F.SID STATEMEXT ID PHASE FLAG EXT F.TC NEXT CHARACTER EXT F.TRM TERMINATE COMPILE EXT F.$CC SAVED F.CC AT $ STATEMENT BREAK. SKP * EXT'S WITH A TRAILING '.F' ARE SUBROUTINES * EXT AI.F ASSIGN ITEM EXT ASC.F CONVERT TO 4 ASCII DIGITS EXT BNI.F CLEAR NID TO BLANKS EXT CRP.F OUTPUT CROSS-REFERENCE PAIR. EXT CSN.F CHECK STATEMENT NUMBER TYPE. EXT ER.F ERROR PRINT ROUTINE ENT EXN.F EXAMINE NEXT CHARACTER ENT IC.F GET NEXT CHARACTER ENT ICH.F GET NEXT NON BLANK CHAR. AND TYPE IT EXT IDN.F INPUT DO NOT ASSIGN (GET NEXT OPERAND) ENT II.F INPUT ITEM ENT IIV.F INPUT INTEGER VARABLE ENT INM.F INPUT NAME ENT IOP.F INPUT OPERATOR ENT ISN.F INPUT STATEMEXT NUMBER ENT ISY.F INPUT SYMBOL EXT ITS.F INTEGER TEST ENT IVN.F INPUT VARIABLE/ARRAY NAME. ENT MCC.F RESET TO FIRST COLUMN OF STATEMEXT EXT NCT.F TEST FOR NOT A CONSTANT ENT PSI.F PRINT SOURCE IMAGE. EXT PSL.F PRINT SOURCE LINE. ENT SCP.F SAVE CURREXT STATPMEXT POSITION. ENT SNC.F START NEXT CARD SUBROUTINE EXT TV.F TAG VARIABLE ENT UC.F UNINPUT COLUMN EXT WAR.F ERROR COMMENT SUBROUTINE (WARNINGS) EXT WS1.F WRITE WORD TO PASS FILE #1. * * COMPILER LIBRARY ROUTINES USED * EXT C.SAU SOURCE FCB EXT RED.C READ ROUTINE EXT WRT.C WRITE FILE ROUTINE EXT C.SC0 SCRATCH FILE FCB EXT RWN.C REWIND ROUTINE * * LIBRARY ROUTINES * EXT .MVW EXT IFBRK * SUP * A EQU 0 B EQU 1 SKP * GLOBALS, REFERENCED BY OFFSET FROM F.$IC * EXT F.$IC $ EQU F.$IC * EOSF EQU 0 END-OF-STATEMENT FLAG. FIRST EQU 1 FIRST-CARD FLAG. 0: CONTINUATION ILLEGAL. LINOL EQU 2 ADDR OF (ASCII) LINE # IN CURRENT BUFFER. CBA EQU 3 ADDR OF CARD TEXT IN CURRENT BUFFER. CRD#1 EQU 4 ADDR BUFFER # 1. CD#1 EQU 5 CARD NUMBER (WITHIN STMT) FOR BFR #1. CRD#2 EQU 6 ADDR BUFFER # 2. CD#2 EQU 7 CARD NUMBER (WITHIN STMT) FOR BFR #2. CD# EQU 8 CURRENT CARD NUMBER. DCD# EQU 9 PTR TO CURRENT CARD BUFFER CARD NUMBER. CD#F EQU 10 # CARDS IN CARD FILE. CD#P EQU 11 CURRENT POSITION IN CARD FILE. CICNT EQU 12 ADDR WORD COUNT IN CURRENT BUFFER. MLIN EQU 13 ADDR CLIB LINE NUMBER IN CURRENT BUFFER. LIFCC EQU 14 COL # OF START OF 1ST CARD CURRENT STMT. FTNF EQU 15 FLAG THAT FTN DIRECTIVE IN PROCESS. * T0IC NOP K73 DEC 73 DCD#1 DEF $+CRD#1 DEF TO CARD BUFFER ADDRESSES B15 OCT 15 CARRAGE RETURN (USED AS END OF LINE) B377 OCT 377 B40 OCT 40 SKP * **************** * * INPUT COLUMN * * **************** SPC 1 IC.F NOP LDB $+CD# IF CURRENT CARD IS ZERO SZB,RSS THEN THERE IS NONE SO JMP IC02 GO FIND ONE * LDB F.CC COLUMN COUNTER. SZB IF F.CC=0, OR CPB K73 END OF CURRENT CARD, JMP IC01 THEN NOT EASY. (FASTEST TEST!) * IC18 ADB KM1 (B) WAS F.CC HERE. CLE,ERB (B)=(F.CC-1)/2 , E=ODD EVEN ADB $+CBA (B)=LOC. OF WORD CONTAINING CHAR. LDA B,I (A)=WORD CONTAINING CHAR. SEZ,RSS F.CC ODD ? ALF,ALF YES, GET LEFT CHAR. AND B377 ISZ F.CC F.CC=F.CC+1 * IC06 STA F.TC C/R, /, OR CHAR. FROM CARD BUFFER JMP IC.F,I EXIT * IC01 SZB F.CC=0 OR 73. WHICH ? JMP IC10 73. GET ANOTHER CARD. * IC00 LDA B15 0. RETURN C/R. JMP IC06 * IC10 LDB F.NXN NO INPUT FLAG SET? LDA B15 SZB JMP IC06 YES - SEND C/R * IC02 ISZ $+CD# BUMP THE CARD NUMBER LDA $+CD# GET THE REQUIRED CARD NUMBER LDB K7 SET THE COLUMN COUNTER CPA K1 BASED ON THE CARD NUMBER LDB $+LIFCC FIRST CARD OF STMT. MAY START ELSE WHERE STB F.CC SET IT LDB DCD#1 PICK A DEF TO BUFFER # 1 CPA $+CD#1 REQUIRED CARD IN BUFFER 1? JMP INC YES GO SET IT UP * ADB K2 INDEX TO THE NEXT BUFFER CPA $+CD#2 REQUIRED CARD IN BUFFER # 2? JMP INC YES GO SET IT UP * LDA $+CD#1 CARD IS NOT IN MEMORY SO CMA,INA FIGURE WHICH BUFFER WE WILL USE ADA $+CD#2 USE ONE WITH LOWEST NUMBERED CARD IN IT SSA,RSS B CURRENTLY POINTS AT BUFFER 2 SO ADB KM2 ADJUST IF IT IS TO BE 1. JSB SETCA SET UP THE BUFFER ADDRESSES ECT. * LDA $+CD#P GET THE CURRENT FILE COUNT INA DOES THE BUFFER CONTAIN CPA $+DCD#,I THE NEXT CARD TO BE PUT IN THE CARD FILE? CLA,INA,RSS YES MUST WRITE IF .... JMP IC07 NO CARD NEED NOT BE WRITTEN * CPA $+CD# ... FIRST CARD OR ... JMP IC03 (IT IS FIRST CARD) * LDA F.SID ... STILL SCANNING. SZA,RSS WELL...?? JMP IC07 NO CARD NEED NOT BE WRITTEN * IC03 JSB WRT.C WRITE THE CARD IN THE DEF C.SC0 CARD FILE DEF $+CBA,I SO WE CAN GET IT BACK DEF K43 JMP PASER IF ERROR ABORT * ISZ $+CD#F STEP THE COUNT OF CARDS IN THE FILE ISZ $+CD#P AND THE CURRENT POSITION * IC07 LDA $+CD# NOW WE KNOW WHERE TO PUT IT SO FIGURE OUT CMA,INA WHERE TO GET IT ADA $+CD#F GET FROM SCRATCH FILE IF IT CONTAINS THE SSA,RSS THE REQUIRED NUMBER WELL? JMP INF YES GO READ IT IN * JSB RD.F READ A NEW CARD JMP IC08 GO CHECK FOR EOS ECT. * * INC JSB SETCA SET UP THE CURRENT BUFFER JMP IC08 AND GO CHECK FOR EOS ECT. * * SETCA NOP SET UP BUFFER POINTER ROUTINE STB $+DCD# SET LOCAL POINTER TO CARD #. ISZ $+DCD# LDB B,I GET POINTED TO ADDRESS. STB $+LINOL SAVE THE LINE NUMBER LOCATION IN BUFF. ADB K3 SKIP OVER LINE NUMBER. STB $+CBA SET CURRENT BUFFER ADDRESS. ADB K41 INDEX TO CARD LENGTH AREA. STB $+CICNT SET POINT TO IT. INB AND TO THE LINE COUNT. STB $+MLIN JMP SETCA,I RETURN * KM1 DEC -1 KM2 DEC -2 K1 DEC 1 K3 DEC 3 SKP * ********************** * * CARD IMAGE INPUT * * ********************** SPC 1 RD.F NOP READ ROUTINE RD00 JSB IFBRK CHECK IF HE HAS HAD ENOUGH DEF *+1 SSA WELL JMP BREAK YES GO QUIT * JSB RED.C READ SOURCE FILE DEF C.SAU DEF $+CBA,I DEF K40 80 CHARACTERS JMP F.TRM ERROR ON READ ERROR 98 SSB EOF ? JMP F.TRM YES, GO WRAP IT UP. * STA $+MLIN,I SAVE THE LINE COUNT FROM READ ADB K3 ADD SPACE FOR LINE # TO LENGTH AND STB $+CICNT,I SAVE WORD COUNT IN WD 41 OF CI * LDA B COMPUTE # WDS LEFT IN CARD BUFFER. CMB -(LENGTH+3)-1 ADB K43 (40-LENGTH)-1 = (AMT LEFT)-1 SSB IF NONE JMP IC134 SKIP FILL * STB T0IC SAVE COUNT (ZERO IF ONE WD TO FILL) ADA $+LINOL ADDRESS OF FIRST UNUSED WORD LDB LINO FILL WITH STB A,I BLANKS STA B SET TO MOVE REST INTO PLACE INB A= FROM B= TO JSB .MVW MOVE WORDS DEF T0IC NOP * IC134 LDA KM40 CHECK FOR BLANK CARD: STA T0IC COUNT 40 WORDS, LDB $+CBA STARTING HERE. IC136 LDA B,I CURRENT WORD. CPA LINO BLANK ? INB,RSS YES. ADVANCE TO NEXT & SKIP. JMP IC138 NO. NON-BLANK CARD. * ISZ T0IC COUNT. 40 YET ? JMP IC136 NO. GO ON. * LDA F.END YES. BLANK. BETWEEN MODULES ? SZA,RSS JMP RD06 NO. TREAT AS COMMENT. JMP RD03 YES. IGNORE THE CARD. * IC138 LDA $+MLIN,I GET THE LINE # PASSED IN SSA IF NEGATIVE, JMP RD06 TREAT CARD AS A COMMENT * LDA $+CD# STUFF THE CURRENT CARD NUMBER STA $+DCD#,I IN THE BUFFER FLAG * LDB $+FTNF FTN FLAG SET? (IT IS 1 IF SO) SZB JMP IC141 YES. CONTROL CARD * LDA $+CBA,I CPA KK10 IF CARD STARTS WITH '$ ' JMP F.TRM GO WIND IT UP * AND KK07. (A)HI=1ST CHAR. OF CARD BUFFER CPA "C" IS IT A 'C' ? RSS CPA "C"L OR LOWER CASE ? JMP RD06 YES, A COMMENT CARD CPA KK06 '*' ALSO COMMENT. JMP RD06 * CPA "D" OPTIONAL CARD? RSS CPA "D"L JMP RD05 YES GO CHECK IF OPTION ENABLED * CPA KK09 DOES IT START WITH '$' ? JMP RD02 YES. NOT A CONTINUATION. * RD04 LDA $+CBA COMPUTE ADDRESS ADA K2 OF THE SIXTH COLUMN LDA A,I AND GET IT AND B377 (A)LO=CI(6) LDB K7 7 CPA B60 RSS "0". CPA B40 RD02 CLB,INB,RSS CLA,RSS SET EOSF (END OF STATEMENT FLAG) LDA $+CD# TO ZERO (NOT END) OR CARD # IF END STA $+EOSF STB F.CC SET THE COLUMN POINTER ISZ $+FIRST ALLOW CONTINUATIONS AFTER THIS STMT. SZA CONTINUATION ? JMP RD.F,I NO. DON'T PRINT IT. * JSB PSI.F YES. PRINT. CLB,INB IF CONTINUATION NOT ALLOWED, CPB $+FIRST CLA,RSS (ERROR) JMP RD.F,I ALLOWED. EXIT. * STA F.END THEN ERROR. CLEAR END FLAG, LDA K90 AND SET ERROR NUMBER. JSB ER.F * IC141 STB F.CC F.CC=1. CLA STA $+FTNF CLEAR THE FTN FLAG STA $+EOSF KEEP READING (WELL, START) JMP RD.F,I DONE. DON'T PRINT IT. * RD05 LDA F.CCW CHECK THE D BIT AND B100 SZA SKIP IF TO BE TREATED AS COMMENT JMP RD04 D IS SET TREAT AS STD. STMT. * RD06 JSB PSI.F PRINT COMMENT CARD. RD03 JSB ULN.F UPDATE LINE # FOR PASS 2. JMP RD00 AND READ ANOTHER CARD * "D" BYT 104,0 "D"L BYT 144,0 KM40 DEC -40 SPC 1 * INF LDA $+CD# CHECK IF A REWIND IS NEEDED CMA,INA IT IS IF REQUESTED CARD IS ADA $+CD#P LESS THAN OR EQUAL TO CURRENT POSITION SSA,RSS WELL? JSB RWCDF YES REWIND THE CARD FILE JSB RED.C READ CARD FROM THE SAVE FILE DEF C.SC0 DEF $+CBA,I DEF K43 JMP PASER ABORT IF ERROR * ISZ $+CD#P STEP THE CURRENT POSITION ON THE SAVE FILE LDA $+CD#P CHECK IF THIS IS THE REQUIRED CARD CPA $+CD# WELL? CLB,RSS YES SKIP OUT JMP INF NO READ AGAIN * STA $+DCD#,I SET BUFFER FLAG TO SHOW CARD IS HERE * IC08 LDA $+EOSF CHECK IF THIS IS THE END OF STATEMENT CARD CPA $+CD# WELL? CLA,RSS YES SET UP TO SEND A C/R JMP IC09 NO. GO UPDATE XREF LINE & GET CHAR. * STA F.CC END OF STATEMENT SET F.CC TO ZERO AND JMP IC00 GO PICK A C/R. (F.CC STAYS ZERO) * IC09 LDA $+MLIN,I LINE NUMBER. STA F.LNN LDB F.CC SET UP FOR IC18. JMP IC18 NOW GO GET CHAR. SPC 1 BREAK LDA K96 SEND THE BREAK ERROR MESSAGE JMP F.ABT AND EXIT PASER LDA K99 ERROR ON CARD FILE. JMP F.ABT * K96 DEC 96 K99 DEC 99 SPC 1 K7 OCT 7 KM7 DEC -7 K2 DEC 2 K40 DEC 40 K41 DEC 41 K90 DEC 90 KK06 BYT 52,0 '*' IN HIGH BYTE. KK07. OCT 177400 "C" BYT 103,0 'C' IN HIGH BYTE. "C"L BYT 143,0 SAME BUT LOWER CASE. KK09 BYT 44,0 '$' IN HIGH BYTE. KK10 ASC 1,$ '$ ' B100 OCT 100 SPC 1 LINO ASC 1, BLANKS FOR FILL ROUTINE SKP * ********************** * * PRINT SOURCE IMAGE * * ********************** SPC 1 * SET UP LINE ADDR, LENGTH, NUMBER. * PSI.F NOP LDA $+CBA SET LINE ADDRESS, LENGTH IN PSL.F STA F.LNA LDA $+CICNT,I ADA KM3 (DON'T PASS ASCII LINE #) SZA,RSS IF ZERO-LENGTH, INA CHANGE TO ONE WORD. STA F.LNL JSB ULN.F UPDATE LINE #. * * IF Q.OR.(M&L).OR.(M&.NOT.COMMENT),PUT IN PASS FILE. * LDA F.CCW AND B4002 'M' OR 'Q' OPTIONS ? SZA,RSS JMP PSI03 NO. DON'T WRITE. * LDA F.CCW -Q,+M,-L ? AND B4003 CPA K2 RSS YES, CHECK FOR COMMENT. JMP PSI01 NO, PASS COMMENTS THRU TOO. * LDA $+CBA,I GET THE FIRST CHARACTER AND KK07. IF 'C' BUT NO 'Q' OPTION CPA "C" THEN RSS CPA "C"L JMP PSI03 DON'T KEEP IT * PSI01 LDA F.LNL COMBINE COUNT & OPERATOR. ALF,ALF IOR K28 JSB WS1.F & WRITE. LDA F.LNL # WDS. CMA,INA STA T1PSI LDA $+CBA ADDR. STA T2PSI PSI02 LDA T2PSI,I OUTPUT IT. JSB WS1.F ISZ T2PSI ISZ T1PSI JMP PSI02 JMP PSI04 DONE. SKP PSI03 LDA K29 JUST LINE BREAK. JSB WS1.F * * IF 'L', BUT NOT 'Q' OR 'M', PRINT IT. * PSI04 LDA F.CCW CHECK IF WE ARE TO LIST IT AND B4003 Q,M,L OPTIONS. CPA K1 IS IT -Q,-M,+L ? CLE,RSS YES. (E=0 FOR ASC.F) JMP PSI05 NO. GO CHECK 'D'. * LDA T0PSI LINE NUMBER. JSB ASC.F CONVERT TO ASCII CHARS SWP SWITCH SO WE CAN USE THE DST STB T1PSI SAVE 3RD & 4TH CHARS. RRR 8 CHANGE TO '4123', AND B377 THE REPLACE THE '4' WITH BLANK. IOR B20K DST $+LINOL,I SET '-123' IN THE CURRENT BUFFER LDA T1PSI NOW GET THE 4TH DIGIT, AND B377 IOR B20K AND APPEND A BLANK, ALF,ALF AFTER IT. LDB $+LINOL NOW PUT IT AFTER THE FIRST THREE. ADB K2 STA B,I TO FORM: -1234- , THREE WORDS. LDA $+CICNT,I # OF WORDS IN IMAGE LDB $+LINOL LOC OF LINE # JSB PSL.F LIST THE CARD * * IF 'D' IN COLUMN 1, CHANGE GO BLANK. * PSI05 LDA $+CBA,I COLUMNS 1 & 2. AND KK07. UPPER CHAR. CPA "D" WAS IT "D" ? RSS CPA "D"L RSS JMP PSI.F,I NO. EXIT. * XOR $+CBA,I YES. CHANGE TO BLANK. (A)=LOWER. IOR B20K LOWER CHAR .OR. UPPER BLANK. STA $+CBA,I JMP PSI.F,I RETURN SPC 2 KM3 DEC -3 K28 DEC 28 K29 DEC 29 K43 DEC 43 B4002 OCT 4002 B4003 OCT 4003 B20K OCT 20000 BLANK IN UPPER BYTE. T0PSI NOP LINE #. T1PSI NOP COUNTER FOR OUTPUT. T2PSI NOP POINTER FOR OUTPUT. SKP * **************************** * * SET UP TO RESCAN THE STMT * * **************************** SPC 1 MCC.F NOP CLA SET THE CURRENT CARD TO ZERO STA $+CD# TO FOURCE RESCAN STA F.SID CLEAR THE SCAN SWITCH LDB $+LIFCC GET START OF CARD COLUMN CPB K1 IF IT IS 1 THEN LDB K7 CHANGE TO 7 (STMT. # PICKED ON FIRST SCAN) STB $+LIFCC SET THE INITIAL COLUMN JMP MCC.F,I RETURN SPC 2 * ********************************************* * * SET CURRENT POSITION AS START OF STATEMENT* * ********************************************* SPC 1 SCP.F NOP LDA $+CD# GET THE NUMBER OF THE NEW FIRST CARD LDB F.CC ALSO SAVE THE COLUMN POSITION JSB CCB.F CLEAR THE CARD BUFFER JMP SCP.F,I RETURN SPC 2 * **************************** * * SET UP FOR NEW STATEMENT * * **************************** SPC 1 SNC.F NOP SCN1 LDA $+EOSF IF LAST CARD OF PRIOR STMT. SZA NOT READ JMP SCN2 ISZ $+CD# STEP THE CARD NUMBER AND JSB RD.F READ JMP SCN1 UNTIL IT IS READ * SCN2 CLB,INB SET THE RESET LOCATION JSB CCB.F CLEAR THE CARD BUFFER CLA STA $+EOSF CLEAR THE END OF STMT. FLAG JSB IC.F MAKE SURE LINE IS SET UP. JSB UC.F LDA F.TC IF LINE STARTS WITH $, CPA "$" JMP SNC3 THEN DIRECTIVE. JSB PSI.F ELSE PRINT IT NOW. JMP SNC.F,I RETURN * SNC3 CLA DIRECTIVE. DON'T PRINT, STA $+FIRST AND DON'T ALLOW CONTINUATIONS. JSB ULN.F UPDATE LINE NUMBER, THOUGH. JMP SNC.F,I * "$" OCT 44 $ SKP * ************************ * * REWIND THE CARD FILE * * ************************ SPC 1 RWCDF NOP ROUTINE TO REWIND THE CARD FILE JSB RWN.C REWIND THE CARD FILE DEF C.SC0 AND CLEAR ITS COUNTS JMP PASER ABORT IF ERROR CLA STA $+CD#P RESET THE CURRENT POSITION POINTER JMP RWCDF,I RETURN SPC 2 * **************************** * * CLEAR CARD FILE & BUFFER * * **************************** SPC 1 CCB.F NOP ROUTINE TO CLEAR THE CARD FILE AND BUFFERS STB $+LIFCC SET THE RESET COLUMN CLB,CLE SET THE NO CARD PRESENT FLAG IN B STB $+CD# SET INITIAL CARD NUMBER CPA $+CD#1 IS THIS CARD IN BUFFER 1 OR 2? CCE IT IS IN 1 CLA,SEZ,INA,RSS ARRANGE AN INITIAL CARD # FLAG SWP SWAP IF NEEDED STA $+CD#1 THE FLAGS STB $+CD#2 AS REQUIRED JSB RWCDF REWIND THE CARD BUFFER STA $+CD#F CLEAR ITS COUNT JMP CCB.F,I RETURN SPC 2 * ********************** * * UPDATE LINE NUMBER * * ********************** SPC 1 ULN.F NOP LDA $+MLIN,I CARD COUNT SSA IF NEGATIVE CMA,INA SET POSITIVE STA T0PSI SAVE FOR LIST. LDB F.FLN FIRST LINE # ? SZB,RSS STA F.FLN YES. REMEMBER IT FOR PASS 2. JMP ULN.F,I EXIT. SKP * *********************************** * * INPUT CHARACTER, DETERMINE TYPE * * *********************************** * * ON RETURN A=F.TC=CHARACTER * B=CHAR IF NON-DIGIT, ELSE 0 * E=1 IF DELIMITER, ELSE 0 FOR ALF,NUM. * O=1 IF NON-LETTER, ELSE 0 FOR ALPHA. SPC 1 ICH.F NOP ICH01 JSB IC.F INPUT COLUMN CPA B40 IS CHARACTER A BLANK? JMP ICH01 YES. GET ANOTHER CHARACTER * STO ASSUME NON-LETTER, O=1. CPA "!" COMMENT ESCAPE ? RSS (YES) JMP ICH05 NO. * LDA K73 YES. FORCE END-OF-LINE. STA F.CC JMP ICH01 AND GO FETCH THE C/R. * ICH05 CPA "$" STATEMENT BREAK ? CLA,RSS (YES) JMP ICH02 NO. * LDB F.CC YES. SAVE F.CC, STB F.$CC STA F.CC AND SET IT TO ZERO (END OF STATEMENT). JMP ICH01 GO GET C/R TO RETURN. * ICH02 LDB A SET B=CHAR. ADA BM60 CHAR-60B CCE,SSA E=1. JMP ICH04 F.TC .LT. "0" [0,57B] * ADA BM12 CHAR-72B SSA CLB,CLE,RSS F.TC IS A DIGIT [60B,71B] (E=0) * ADA KM7 CHAR-101B SSA (IF DIGIT, SKIPS TO HERE, A<0, E=0) JMP ICH04 NON-ALPHANUM. [72B,100B] * ADA BM32 CHAR-133B SSA JMP ICH03 UPPER CASE. [101B,132B] * ADA KM6 CHAR-141B SSA JMP ICH04 NON-ALPHANUM. [133B,140B] * ADA BM32 CHAR-173B SSA,RSS JMP ICH04 NON-ALPHANUM. [173B,177B] * ADA B133 LOWER CASE. [141B,172B] STA F.TC FOLD TO UPPER: CHAR-40B LDB A SET NEW (B)=CHAR. ICH03 CLE LETTER. (E) = 0. CLO AND (O) = 0. ICH04 LDA F.TC CHAR. JUST INPUT JMP ICH.F,I EXIT. * BM60 OCT -60 BM32 OCT -32 BM12 OCT -12 B133 OCT 133 "!" BYT 0,41 SKP * ****************** * * UNINPUT COLUMN * * ****************** SPC 1 UC.F NOP LDA F.CC F.CC=F.CC-1 SZA,RSS UNLESS F.CC=0, JMP UC.F,I INWHICHCASE LEAVE IT ALONE. * CMA,INA DO IT THIS WAY SO THAT CMA THE 'E' BIT IS PRESERVED. STA F.CC (SO EXN.F RETURNS PROPER FLAGS.) JMP UC.F,I SPC 2 * ************************** * * EXAMINE NEXT CHARACTER * * ************************** SPC 1 EXN.F NOP JSB ICH.F INPUT CHARACTER JSB UC.F UNINPUT COLUMN LDA F.TC RETURN NEXT CHAR JMP EXN.F,I RETURN NFL IN B SKP * ************** * * INPUT ITEM * * ************** SPC 1 II.F NOP JSB EXN.F STRIP OFF BLANKS PRECEDING ITEM JSB IDN.F INPUT DNA SZA F.IM=0, POSSIBLE ERROR CPA TWPE ALSO IF PSUDO JMP II.F,I * JSB AI.F ASSIGN ITEM STA T2II SAVE F.IM LDA F.NT IOR F.NCR SZA,RSS IS NAME TAG = 0? JSB CRP.F YES, BUILD CROSS REFERENCE PAIR LDA T2II RETURN F.IM JMP II.F,I * T2II NOP K24 DEC 24 TWPE OCT 40000 ARR OCT 600 F.IU=ARR. SPC 2 * ***************************** * * INPUT VARIABLE/ARRAY NAME * * ***************************** SPC 1 IVN.F NOP JSB INM.F FIRST, MUST BE A NAME. LDA F.IU THEN: IF NOT ALREADY ARRAY, CPA ARR RSS JSB TV.F FORCE IT TO BE A VARIABLE. JMP IVN.F,I DONE. SKP * ************** * * INPUT NAME * * ************** SPC 1 INM.F NOP JSB IOP.F INPUT OPERAND LDA K24 LDB F.NT IS OPERAND A NAME? SZB JSB ER.F NO. GRIPE LDA F.IM YES, (A)=F.IM OF THE OPERAND JMP INM.F,I SPC 2 * **************** * * INPUT SYMBOL * * **************** SPC 1 ISY.F NOP CLA,INA STA F.NTF SET NO-TAG FLAG JSB INM.F INPUT NAME JMP ISY.F,I SPC 2 * ************************** * * INPUT INTEGER VARIABLE * * ************************** SPC 1 IIV.F NOP JSB IOP.F INPUT OPERAND JSB TV.F TAG VARIABLE JSB ITS.F INTEGER TEST JSB NCT.F NON-CONSTANT TEST JMP IIV.F,I SPC 2 * ***************** * * INPUT OPERAND * * ***************** SPC 1 IOP.F NOP JSB II.F INPUT ITEM SZA JMP IOP.F,I (A)=F.IM OF THE OPERAND LDA K17 JSB ER.F DELIMITER FOUND WHEN OPERAND EXPECTED * K17 DEC 17 SKP * ************************** * * INPUT STATEMENT NUMBER * * ************************** * * ENTER WITH A = TYPE: -1 = FORMAT. * 0 = DON'T CARE. * +1 = NON-FORMAT. SPC 1 ISN.F NOP STA T3ISN SAVE TYPE. JSB BNI.F CLEAR NID TO BLANKS LDA K64 '@' LDB F.DNI SET UP POINTER TO LAST CHAR STORED. STB T2ISN STA B,I SET FIRST WORD TO '@' LDA KM6 STA T1ISN T1=-6 LDA F.CC ARE WE READING THE DEFINITION, ADA KM7 OR A REFERENCE ? SSA,RSS JMP ISN04 REFERENCE. (F.CC > 6) * * DEFINITION IN COL 1-5. * ISN01 JSB IC.F READ ANOTHER CHAR. LDA F.CC IF IT WAS IN COL 6, CPA K7 JMP ISN06 THEN DONE. * LDA F.TC IF BLANK, CPA B40 JMP ISN01 THEN SKIP IT. * ADA BM60 DIGIT ? SSA FIRST, < "0" ? JMP ISN09 YES. ERROR. * ADA BM12 THEN > "9" ? SSA,RSS JMP ISN09 YES. ERROR. * LDA F.TC DIGIT. RESTORE F.TC CPA B60 IF A ZERO, RSS JMP ISN02 (NO) * LDB T2ISN IS IT A LEADING ZERO ? CPB F.DNI JMP ISN01 YES. SKIP IT. * ISN02 ISZ T2ISN NORMAL DIGIT, SAVE IT. STA T2ISN,I JMP ISN01 GO FOR MORE. * * ERROR IN STATEMENT #. * ISN09 LDA B40 ERROR # 32. JSB ER.F SKP * REFERENCE AFTER COL 6. * ISN04 JSB ICH.F INPUT CHAR. SZB DIGIT ? JMP ISN07 NO. DONE. * CPA B60 ZERO ? RSS JMP ISN05 (NO) * LDB T2ISN YES. LEADING ? CPB F.DNI JMP ISN04 YES. SKIP IT. * ISN05 ISZ T1ISN NORMAL DIGIT. SIXTH ONE ? RSS NO. JMP ISN09 YES. ILLEGAL STMT #. * ISZ T2ISN STORE DIGIT INTO NID BUFFER STA T2ISN,I JMP ISN04 AND GO FOR MORE. * * GOT THE WHOLE NUMBER. ENTER IN SYMBOL TABLE. * ISN06 JSB EXN.F FOR DEFINITION, PEEK AT NEXT CHAR. ISN07 LDB T2ISN ALL ZEROES ? CPB F.DNI JMP ISN09 YES. ERROR. * CLA STA F.IU F.IU=0 STA F.NT F.NT=0 STA F.IM F.IM=0 CLA,INA SET THE NO-TAG FLAG. STA F.NTF JSB AI.F ASSIGN ITEM JSB CRP.F BUILD CROSS REFERENCE PAIR LDA T3ISN TYPE. LDB F.A SZA DO WE CARE ? JSB CSN.F YES. CHECK IT OUT. LDA F.IM RETURN F.IM IN (A) JMP ISN.F,I * T1ISN BSS 1 COUNT FOR NO. OF DIGITS T2ISN BSS 1 NID BUFFER POINTER T3ISN BSS 1 TYPE. B60 OCT 60 K64 DEC 64 "@" KM6 DEC -6 * END ASMB,Q,C HED SCANNER FOR FTN4X. NAM IDN.F,8 92834-12001 REV.2030 800820 * *************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * *************************************************************** * NAME: PART OF FTN4X * * SOURCE: PART OF 92834-18001 * * RELOC: PART OF 92834-12001 * * PGMR: B.G. * *************************************** * * EXT'S WITH A LEADING 'F.' ARE VARIABLES OR JUMP TARGETS * * THE COLUMN THE EXT STARTS IN DEFINES THE SUBROUTINE IT IS * DEFINED IN AS FOLLOWS * 2 -- OA.F (WRITE PASS FILE ROUTINES) * 3 -- NEX.F (STATEMEXTS THAT DON'T CONTAIN EXPRESSIONS) * 4 -- FA.F (THE ASSIGNMEXT TABLE ROUTINES) * 5 -- EX.F (STATEMEXTS USING THE EXPRESSION EVALUATOR) * 6 -- IC.F (THE CHARACTER INPUT ROUTINES) * 7 -- IDN.F (THE TOKEN INPUT ROUTINES) * 8 -- FTN4 ( THE MAIN) EXT F.A ASSIGNMENT TABLE ADDR OF CURRENT ENTRY. EXT F.CCW FTN OPTION WORD EXT F.CSL CHARACTER STRING LENGTH, CURRENT F.A EXT F.DID ADDRESS OF F.IDI EXT F.DNI ADDRESS OF NID ENT F.DPK DEF TO F.PAK BUFFER. EXT F.DTY IMPLICIT TYPE TABLE ENT F.EIM EXPECTED ITEM MODE. EXT F.IDI INPUT ARRAY NON-NUMERIC EXT F.IM CURREXT ITEM MODE (REAL, COMPLEX,ECT.) EXT F.IU CURREXT ITEM USAGE (DUM., RELATIVE, ECT.) EXT F.NT NAME TAG 0= VAR, 1=CONSTANT. EXT F.RPL PROGRAM LOCATION COUNTER EXT F.S2T TOP OF STACK 2 EXT F.SID STATEMEXT ID PHASE FLAG ENT F.SIM SAVED ITEM MODE (NEGATIVE CONSTANTS) EXT F.SLF STATEMENT LEVEL FLAG. ENT F.STC SAVED F.TC (NEGATIVE CONSTANTS) EXT F.SXF COMPLEX CONSTANT FLAG EXT F.TC NEXT CHARACTER * * ENT'S WITH A TRAILING '.F' ARE SUBROUTINES * EXT AI.F ASSIGN ITEM EXT BNI.F CLEAR NID TO BLANKS EXT CDI.F CLEAR IDI ROUTINE EXT DL.F DEFINE LOCATION SUBROUTINE EXT ER.F ERROR PRINT SUBROUTINE EXT ESC.F ESTABLISH CONSTANT SUBROUTINE EXT EXN.F EXAMINE NEXT CHARACTER. EXT IC.F GET NEXT CHARACTER EXT ICH.F GET NEXT NON BLANK CHAR. AND TYPE IT ENT IDN.F INPUT DO NOT ASSIGN (GET NEXT OPERAND) ENT ISC.F INPUT STRING CONSTANT. EXT KWS.F KEYWORD SEARCH. EXT MVW.F INTERNAL MOVE WORDS. ENT PAK.F PACK & OUTPUT ASCII DATA. ENT RP.F INPUT ')' EXT TCT.F TEST (A) = F.TC ELSE ER 28 EXT UC.F UNINPUT COLUMN. EXT WAR.F ERROR COMMEXT SUBROUTINE (WARNINGS) EXT WS1.F WRITE ONE WORD TO PASS FILE 1. * * EXT .MVW LIBRARY MOVE WORDS ROUTINE * * * A EQU 0 B EQU 1 SUP SKP * *********************** * * INPUT DO NOT ASSIGN * * *********************** SPC 1 * START BY CLEARING STATE. ASSUME IT'S A NUMBER. * IDN.F NOP CLA STA F.IU F.IU=0 STA F.NT F.NT=0 STA HFLAG NOT HOLLERITH. STA F.SIM NOT NEGATIVE CONSTANT. JSB EXN.F PEEK AT NEXT CHARACTER. ADA BM101 LETTER ? SSA JMP IDN04 NO. GO TRY NUMBER. * * NAME. READ IT. * JSB ICH.F READ 1ST CHARACTER. LDB F.TC GET THE CHARACTER AND ADB BM101 USE IT TO INDEX CLE,ERB INTO THE ADB F.DTY IMPLICIT TYPE TABLE LDA B,I GET TYPE FORM THE TABLE SEZ ROTATE IT ALF,ALF IF REQUIRED AND B170K ISOLATE THE TYPE STA F.IM SET THE IMPLICIT TYPE JSB BNI.F CLEAR NID BUFFER TO BLANKS LDA KM6 STA T4IDN SET CHAR. COUNT TO -6 LDB F.DNI LOC. OF 1ST WORD OF NID BUFFER STB T5IDN LDA F.TC STORE CHAR. INTO NID BUFFER IDN02 STA T5IDN,I JSB ICH.F INPUT A CHAR. SEZ IS IT ALPHANUMERIC?? JMP IDN11 NO * ISZ T5IDN INCREMENT NID BUFFER POINTER ISZ T4IDN 6 CHARS INPUT? JMP IDN02 NO. GET ANOTHER * JMP IDN11 YES QUIT EVEN IF NOT DONE WITH SYMBOL SKP T4IDN NOP T5IDN NOP T7IDN BSS 4 SAVED FIRST PART OF COMPLEX CONSTANT. HFLAG NOP ZPX OCT 140000 F.IM=12 DOUBLE COMPLEX CPX OCT 50000 DO NOT REARRANGE THESE ***** DBL OCT 60000 CONSTANTS ***** REA OCT 20000 F.IM=2 REAL ***** INT OCT 10000 F.IM=1 INTEGER ***** TPADD DEF INT+1 USED TO INDEX INTO ABOVE FOR HOLL. CONST. B170K OCT 170000 BM101 OCT -101 B60K EQU DBL * * CONSTANT OR OPERATOR. LET INC.F DECIDE. * IDN04 JSB INC.F GET A CONSTANT. SZA,RSS F.IM=0 ? JMP IDN11 YES, NO SUCH LUCK. * LDB F.SXF COMPLEX FLAG SET ? SZB,RSS JMP IDN10 NO. LDB F.TC YES. F.TC = ',' ? CPB B54 RSS YES. JMP IDN10 NO. LDB F.SID SCAN MODE ? SZB JMP IDN11 YES, DONE. * * COMPLEX CONSTANT. * CPA RE8 MUST BE COMPLEX. SINGLE OR DOUBLE ? (B=0) INB,RSS DOUBLE. B=1. CPA REA NO. SINGLE ? BLS,SLB SINGLE: B=0. DOUBLE: B=2 JMP IDN15 NO. ERROR. * ADB K2 B = 2/4 AS SINGLE/DOUBLE COMPLEX. STB T6IDN T6IDN = # WORDS IN EACH PART. ADB F.DID T4IDN = ADDR OF SECOND PART. STB T4IDN STA T5IDN T5IDN = TYPE OF FIRST PART. JSB MVW.F SAVE FIRST PART. DEF T7IDN IN T7IDN (UP TO 4 WORDS) DEF F.IDI DEC 4 JSB INC.F GET SECOND PART. CPA T5IDN MUST BE SAME TYPE AS FIRST PART. RSS JMP IDN15 * LDB CPX SET UP NEW F.IM: SINGLE, CPA RE8 LDB ZPX OR DOUBLE COMPLEX. STB F.IM JSB RP.F & FOLLOWED BY ')' JSB MVW.F FORM COMPLEX CONSTANT. DEF T4IDN,I MOVE SECOND PART UP. DEF F.IDI DEC 4 JSB MVW.F MOVE SAVED FIRST PART IN. DEF F.IDI DEF T7IDN T6IDN ABS *-* 2/4 AS TYPE. SKP * ALL DONE. IF CONSTANT, ESTABLISH IT. * SOAK UP ANY DOT OPERATOR FOLLOWING. * IDN10 LDA F.IM SET UP CONSTANT. JSB ESC.F IDN11 JSB IDO.F THIS MAY BE REDUNDANT. JMP IDN10 IF .TRUE. OR .FALSE., SET UP CONSTANT. CLA CLEAR COMPLEX FLAG. STA F.SXF LDB F.SIM SPECIAL NEGATIVE CONSTANT ? SZB,RSS JMP IDN13 NO. * LDB F.TC YES. NEG HOLLERITH OR EXPONENTIATION. STB F.STC REMEMBER THE CONSTANT. LDB F.IM STB F.SIM STA F.IM AND SEND '-' BACK FOR NOW. LDA B55 STA F.TC * IDN13 LDA F.IM RETURN (A) = F.IM. LDB HFLAG (B) = HOLLERITH FLAG. JMP IDN.F,I EXIT. * IDN15 LDA K8 COMPLEX CONSTANT ERROR. JSB ER.F * F.SIM NOP SAVED ITEM MODE & NEG CONST FLAG. F.STC NOP SAVED F.TC WHEN F.SIM#0. KM2 DEC -2 K4 DEC 4 B40 OCT 40 TWPE OCT 40000 SUBCL BYT 32,1 K20 DEC 20 B15 OCT 15 K8 DEC 8 B54 OCT 54 SKP * **************************** * * INPUT HOLLERITH CONSTANT * * **************************** SPC 1 * VERIFY COUNT > 0. IF SCANNING, JUST SKIP CHARACTERS. * IDN72 DLD F.IDI+2 (A,B) = COUNT, < 2**31. SZA,RSS IF >= 2**15 = 32768, SSB JMP IHC06 ERROR. * LDA K20 CMB,INB,SZB,RSS SET HOLL. COUNT NEGATIVE JSB ER.F ERROR: EMPTY HOLLERITH STRING * STB T4IDN KEEP THE NEGATIVE COUNT STB HFLAG SET HOLLERITH FLAG. LDA F.SID NOT CODE GEN.? SZA,RSS SCANING? JMP IHC01 NO. NORMAL CODE GEN. * IHC00 JSB IC.F SCANNING. SKIP (N) CHARACTERS. ISZ T4IDN COUNT. ALL DONE ? JMP IHC00 NO, GO ON. * JSB IC.F READ DELIMITER. JMP IDN11 EXIT. * * SEE WHETHER NORMAL CONSTANT OR HOLLERITH PARAMETER. * IHC01 LDA SIGN IF NEG COUNT, SET FLAG (FOR SHORT). SSA ISZ F.SIM ADB K8 NORMAL CONSTANT AT MOST 8 CHARS. SSB,RSS JMP IHC02 LESS THAN 9-CHAR. OK * LDB F.S2T,I GET THE CURRENT TOP OF STACK RBL,CLE,ERB CLEAR POSSIBLE SIGN BIT CPB SUBCL IF SUBROUTINE PRAM. SSA AND POS. COUNT, O.K. JMP IHC06 ELSE ILLEGAL LONG HOLL. * LDA TWPE SET UP A TWPE ENTRY JSB ESC.F TO REMEMBER THE ADDRESS. JSB AI.F JSB DL.F START IT RIGHT HERE. JMP IHC03 SKIP OTHER TYPE. SKP * NORMAL CONSTANT. SET UP TYPE. * IHC02 LDB T4IDN GET THE NEGATIVE COUNT BRS DIVIDE BY TWO ADB TPADD ADD THE BASE ADDRESS LDB B,I GET THE TYPE LDA F.CCW 'J' OPTION. AND B10K CPB REA IF 3-4 CHARS SZA,RSS & 'J' OPTION, RSS (NO) LDB DBI THEN MAKE IT (DBI), NOT (REA). STB F.IM SET THE ITEM MODE * * INPUT THE PROPER NUMBER OF CHARACTERS. * IF NORMAL, WON'T FORCE FLUSH OF PAK.F BUFFER. * IHC03 CCA INITIALIZE PAK.F CLB OFFSET = 0. JSB PAK.F IHC04 JSB IC.F READ NEXT CHARACTER. CPA B15 C/R ? LDA B40 YES, USE BLANK. JSB PAK.F PACK IT. ISZ T4IDN MORE ? JMP IHC04 YES. * * FOR NORMAL CONSTANTS, COPY DATA TO F.IDI * LDA F.IM WHICH ? CPA TWPE SUB PARAM = TWPE. JMP IHC05 SUBROUTINE PARAMETER. * LDA F.DPK NORMAL. COPY FROM F.PAK BUFFER. LDB F.DID JSB .MVW DEF K4 NOP JSB ICH.F INPUT NEXT CHAR. JMP IDN10 GO FINISH UP. * * FOR SUBROUTINE PARAMETERS, FLUSH PAK.F BUFFER * AND MAKE SURE DELIMETER IS ',' OR ')' . * IHC05 LDA KM2 FLUSH BUFFER. JSB PAK.F ADB F.RPL UPDATE F.RPL STB F.RPL JSB ICH.F (A) = NEXT NON-BLANK. CPA B54 MUST BE ',' RSS CPA B51 OR ')' JMP IDN11 YES, FINISH UP. * IHC06 LDA K20 NO, ERROR. JSB ER.F SKP * ********************************** * * FINISH INPUT OF OCTAL CONSTANT * * ********************************** SPC 1 INB01 JSB ICH.F SKIP PAST THE "B". LDA F.SID SCAN MODE ? SZA JMP INC.F,I YES, DONE. * JSB CEX.F CHECK FOR '**' * LDB BILGD 8 OR 9 ? LDA K16 SZB JSB WAR.F YES, WARNING. LDB BOVFL OVERFLOW ? LDA K16 SZB JMP INB02 YES, WARNING & DOUBLE. * LDB F.SLF DATA STATEMENT ? CPB K2 RSS (YES) JMP INB05 NO. * LDA F.EIM YES. EXPECTED TYPE ? CPA DBI JMP INB03 DOUBLE. * LDB B.IDI SINGLE. OVERFLOW ? LDA K16 SZB JSB WAR.F YES. WARNING. LDB B.IDI+1 THEN FORCE SINGLE ANYWAY. JMP INB06 * INB05 LDA F.CCW NO. 'J' OPTION ? AND B10K SZA JMP INB03 YES, DOUBLE. * DLD B.IDI SINGLE OR DOUBLE ? SZA (SINGLE IF UPPER WORD = 0) JMP INB03 DOUBLE. * INB06 LDA SIGN SINGLE. NEGATE ? SSA CMB,INB YES. DO IT. * STB F.IDI SINGLE. SET UP F.IDI & F.IM LDA INT JMP INC16 * INB02 LDA K16 OVERFLOW WARNING. JSB WAR.F * INB03 LDA SIGN DOUBLE. NEGATE IF SIGN#0. ELA COPY SIGN TO (E). DLD B.IDI VALUE. SEZ,RSS NEGATE ? JMP INB04 NO. CMA YES. DO IT. CMB,INB,SZB,RSS INA INB04 DST F.IDI LDA DBI JMP INC16 * K16 DEC 16 SPC 2 * ********************** * * INPUT DOT OPERATOR * * ********************** SPC 1 * ENTRY: F.TC=FIRST CHAR OF CANDIDATE. IF F.TC#'.', EXIT, ELSE * CHECK IT FOR BEING A DOT OPERATOR. IF NOT, ERROR 28. * IF .FALSE. OR .TRUE. : * IF F.IM#0, ERROR, ELSE SET UP THE CONSTANT. * EXIT: F.TC= FIRST TWO CHARACTERS OF OPERATOR NAME, E.G. 'EQ'. * RETURNS TO P+1 IF .FALSE. OR .TRUE. * P+2 IF OTHER OR SCAN MODE. SPC 1 * SEARCH FOR MATCHING KEYWORD & VERIFY TRAILING '.' * IDO.F NOP LDA F.TC STARTS WITH DOT ? CPA "." CCA,RSS YES. (A=-1) JMP IDO03 NO. LEAVE IT AS IS. * JSB KWS.F YES. SEARCH FOR KEYWORD. DEF DOTOP SZA,RSS FOUND ONE ? JMP IDO02 NO. ERROR. * * IF NOT TRUE/FALSE, SET F.TC = 1ST TWO CHARS & EXIT. * ADA TRORD TRUE=0, FALSE=1, OTHER < 0. SSA,RSS WELL ? JMP IDO01 TRUE/FALSE * ADA DLGOP OP. GET FIRST TWO CHARS. LDA A,I STA F.TC F.TC = FIRST TWO CHARS. JMP IDO03 NORMAL EXIT. SKP * TRUE/FALSE: 1) MAKE SURE NO PREVIOUS OPERAND. * 2) SET VALUE. * 3) PICK SINGLE OR DOUBLE LOGICAL. * IDO01 LDB F.IM CAN'T HAVE AFTER AN OPERAND. SZB DOES IT ? JMP IDO02 YES. ERROR. * ADA KM1 TRUE: -1 FALSE: 0 AND B100K TRUE: 100000B FALSE: 0 STA F.IDI SET VALUE (FIRST WORD IF DOUBLE) STB F.IDI+1 SECOND WORD = 0 IN CASE DOUBLE. LDA F.SID SCAN MODE ? SZA JMP IDO03 YES, QUIT NOW. * LDA F.CCW 'J' OPTION ? AND B10K LDB LOG SINGLE LOGICAL IF NOT. SZA LDB LO4 DOUBLE LOGICAL IF SO. STB F.IM SET F.IM JSB ICH.F READ NEXT CHAR. JMP IDO.F,I RETURN P+1 (TO DO ESC.F) * * ERROR. IGNORE IF SCAN MODE. * IDO02 LDB F.SID ERROR. SCAN MODE ? LDA K28 (ERROR 28) SZB,RSS JSB ER.F 28: UNEXPECTED CHARACTER. IDO03 ISZ IDO.F BUMP RETURN POINT & EXIT.TER. JMP IDO.F,I SPC 2 K2 DEC 2 K28 DEC 28 LOG OCT 30000 LO4 OCT 110000 * DOTOP ASC 19,LT. LE. EQ. NE. GE. GT. OR. AND. NOT. , ASC 18,EQV. XOR. EOR. NEQV. TRUE. FALSE. , * TRORD DEC -14 -(ORDINAL OF .TRUE., FROM 1) * LOGOP ASC 13,LTLEEQNEGEGTORANNOEVXOXOXO DLGOP DEF * (LAST ABOVE)+1 "EQ" EQU LOGOP+2 "EV" EQU LOGOP+9 SKP * **************************** * * PACK & OUTPUT ASCII DATA * * **************************** SPC 1 * ENTRY: A>=0: PACK THE CHARACTER IN (A). * A=-1: INITIALIZE. F.A = A.T. ADDR OF ITEM. * IF ZERO, IS PROGM-RELATIVE. * (B) = OFFSET WITHIN ITEM. * A=-2: FLUSH THE BUFFER. RTNS (B)=LWA+1. (OFFSET) SPC 1 * FIRST, FLUSH BUFFER IF NEED BE. * PAK.F NOP STA T2PAK SAVE VALUE FOR LATER. INA,SZA INITIALIZE CALL ? JMP PAK03 NO. * STB T3PAK YES. SAVE OFFSET FOR OUTPUT. LDA F.A AND THE F.A VALUE. STA T4PAK JMP PAK05 GO INITIALIZE. * PAK03 LDB T0PAK BUFFER FULL, INA,SZA OR FLUSH CALL ? CPB K20 RSS (YES) JMP PAK06 NO. JUST OUTPUT CHAR. * LDA T0PAK YES, FLUSH. (A) = # CHARS OUTPUT. INA ROUND UP TO WHOLE WORD. ARS (A) = # WORDS. STA T0PAK SZA,RSS ANY ? JMP PAK05 NO. GO RE-INIT & EXIT. * ADA K3 FORM & OUTPUT OPCODE. (3 HEADER WDS) ALF,ALF IOR K51 DATA STATEMENT OPERATOR. JSB WS1.F LDA T4PAK ITEM F.A JSB WS1.F LDA T3PAK OFFSET. JSB WS1.F LDA K1PS 1+SIGN BIT: REPEAT, ASCII. JSB WS1.F LDA T3PAK UPDATE OFFSET. ADA T0PAK STA T3PAK LDA T0PAK SET UP LOOP COUNTER. CMA,INA STA T0PAK LDA F.DPK SET UP LOOP TO OUTPUT. STA T1PAK PAK04 LDA T1PAK,I ONE WORD. JSB WS1.F ISZ T1PAK NEXT! ISZ T0PAK DONE ? JMP PAK04 NO. * PAK05 LDA F.DPK RESET BUFFER POINTER. STA T1PAK CLA T0PAK = 0, # CHARS IN BUFFER. STA T0PAK * * IF IT'S A DATA CALL, PACK THE CHARACTER. * PAK06 LDA T2PAK WELL ? LDB T3PAK (IN CASE NOT, (B)=LWA+1) SSA JMP PAK.F,I NO, INIT OR FLUSH. DONE. * ISZ T0PAK CHARACTER. COUNT IT. LDB T0PAK FIRST OR SECOND IN WORD ? SLB JMP PAK07 FIRST. GO STORE. * XOR B40 SECOND. PACK & OUTPUT. XOR T1PAK,I (REPLACES BLANK WITH CHARACTER) STA T1PAK,I ISZ T1PAK ADVANCE TO NEXT WORD. JMP PAK.F,I EXIT. * PAK07 ALF,ALF FIRST. PAD WITH A BLANK. IOR B40 STA T1PAK,I & STORE. JMP PAK.F,I EXIT. SPC 2 T0PAK NOP CURRENT # CHARS IN BUFFER (< 21) T1PAK NOP ADDR OF WORD WITH LAST CHAR PACKED. T2PAK NOP SAVED INPUT VALUE. T3PAK NOP OFFSET TO WRITE NEXT BUFFER TO. T4PAK NOP SAVED ITEM F.A F.DPK DEF FBUF ADDR OF BUFFER. FBUF BSS 10 10-WORD ASCII BUFFER. K51 BYT 0,63 DATA STATEMENT OPERATOR. K1PS OCT 100001 1 + SIGN BIT. K3 DEC 3 SKP * ************************* * * INPUT STRING CONSTANT * * ************************* SPC 1 * ENTRY: F.TC = LEADING SINGLE QUOTE. * EXIT: F.TC = CHARACTER AFTER TRAILING SINGLE QUOTE. * F.A = A.T. ADDR OF STRING CONSTANT. * ISC.F NOP CLA SET CHAR COUNT = 0. STA F.CSL STA F.A SET F.A=0 FOR PAK.F (PROGM REL) CCA INITIALIZE PAK.F LDB F.RPL JSB PAK.F ISC01 JSB IC.F NEXT CHAR. CPA B15 IF C/R, JMP ISC99 THEN ERROR - TERMINATED WITHOUT QUOTE. * CPA B47 SINGLE QUOTE ? RSS (YES) JMP ISC03 NO. * JSB IC.F YES. GET CHARACTER AFTER IT, CPA B47 TO SEE IF PAIR OF QUOTES. RSS YES; TREAT PAIR AS SINGLE ONE. JMP ISC04 NO. AT END. * ISC03 JSB PAK.F ELSE PACK THE CHARACTER. ISZ F.CSL AND COUNT IT. JMP ISC01 AND GO ON. * ISC04 CPA B40 HAVE CHAR AFTER END; IF BLANK, JSB ICH.F SKIP BLANKS & READ NEXT NON-BLANK. LDB F.CSL IF ODD # CHARS, LDA B40 SLB JSB PAK.F PACK ANOTHER BUT DON'T COUNT IT. * * CREATE SYMBOL TABLE ENTRY FOR IT. * LDA CHAR SET UP FIELDS FOR CONSTANT. JSB ESC.F LDA F.DPK MOVE 10 WORDS INTO F.IDI, LDB F.DID EVEN IF THEY'RE JUNK. JSB .MVW DEF K10 NOP JSB AI.F FIND OR CREATE A.T. ENTRY. LDA F.CSL LONG OR SHORT STRING ? ADA KM21 SSA JMP ISC.F,I SHORT. ALL DONE. SKP * LONG STRING. FLUSH BUFFER & SAVE ADDR. * LDA KM2 LONG. FLUSH PAK.F BUFFER. JSB PAK.F (NOW (B) HAS UPDATED F.RPL) LDA F.RPL (A) = OLD F.RPL = FWA CONSTANT. STB F.RPL UPDATE F.RPL = LWA+1 CONSTANT. LDB F.A GET EXTENSION ADDR. INB LDB B,I ADB K2 = POSITON OF BYTE ADDR FIELD. CLE,RAL BYTE ADDR. STA B,I STUFF IT. JMP ISC.F,I DONE. * ISC99 LDA K13 C/R BEFORE ENDING QUOTE. JSB ER.F DOWN THE TUBES. * K10 DEC 10 K13 DEC 13 B47 OCT 47 SINGLE QUOTE. CHAR OCT 130000 F.IM=CHAR. KM21 DEC -21 SKP * ******************** * * )-INPUT OPERATOR * * ******************** SPC 1 RP.F NOP LDA B51 F.TC MUST BE ')' JSB TCT.F F.TC-TEST JSB ICH.F INPUT CHARACTER JMP RP.F,I * B51 OCT 51 SPC 2 * GLOBALS. * EXP NOP EXPONENT D NOP -D-1 EXPON NOP EXPONENT PART OF NUMBER POST NOP INPUT CONTROL INDICATOR SIGN NOP SIGN OF NUMBER. MANTL NOP LWA DITTO * * ADDRESS CONSTANTS & SHIFT INSTRUCTIONS. * MULTZ DEF MULT DIVDZ DEF DIVD MANTE DEF F.IDI+5 LWA+1 MANTISSA * * NUMERIC AND CHARACTER CONSTANTS. * KM4 DEC -4 KM1 DEC -1 B53 OCT 53 B55 OCT 55 "." OCT 56 "D" OCT 104 "E" OCT 105 SKP * PTEN - SCALE NUMBER BY A POWER OF TEN. * * PTEN MULTIPLIES THE VALUE IN (MANT...MANT2) AND (EXP) * BY 10**(A). NO CHECK IS MADE FOR OVERFLOW/UNDERFLOW. * * CALLING SEQUENCE: * LDA POWER * JSB PTEN SPC 2 PTEN NOP SZA,RSS IF N=0, LEAVE ALONE. JMP PTEN,I SSA,RSS N>0 ? JMP PTEN1 YES. CMA,INA NO, TAKE IABS(N) STA T1PTN JSB RSN RIGHT SHIFT MANTISSA TWO BITS. JSB RSN LDB DIVDZ SET "DIVIDE" JMP PTEN2 PTEN1 LDB MULTZ SET "MULTIPLY" STA T1PTN T1PTN = IABS(N) PTEN2 STB T2PTN T2PTN = ADDR MULT OR DIVD PTEN3 LDA T1PTN A=N ADA KM6 N-6 CLE,SSA N<6 ? (E=0 FOR MULT) JMP PTEN4 YES, GO DO LAST ONE. STA T1PTN NO, MULT/DIV BY 10**6 LDA PWR1A+10 LDB PWR1A+11 JSB T2PTN,I JMP PTEN3 TRY AGAIN. PTEN4 ADA K5 A = N-1 RAL,CLE,SLA N=0 ? JMP PTEN5 YES, GO NORMALIZE. ADA PWR10 GET POWER OF TEN. (E=0 FOR MULT.) DLD A,I JSB T2PTN,I GO MPY DIV USING IT. PTEN5 JSB NORML NORMALIZE. JMP PTEN,I * T1PTN NOP T2PTN NOP SKP * INDIG TAKES A DIGIT AND COMBINES IT WITH THE RUNNING MANTISSA. * THE RUNNING MANTISSA IS NOT IN A USABLE FORM UNTIL A TERMINATION * CALL IS MADE. IT IS THEN USABLE BUT MAYBE NOT NORMALIZED. * * CALLING SEQUENCE: LDA (NEG FOR TERMINATION) * JSB INDIG * * ANY TRAILING ZEROES OR DIGITS AFTER THE LIMIT (20) * AFFECT ONLY THE TRAILING ZERO COUNT IN "T4INP". SPC 1 * CHECK FOR ZERO, EXTRA DIGIT OR TERMINATION. * INDIG NOP STA T1IND SAVE DIGIT. SSA TERMINATION CALL ? JMP INDI7 YES. * * ACCUMULATE OCTAL. * STA T2IND SAVE DIGIT. CPA K8 IF 8 OR 9, RSS CPA K9 ISZ BILGD ILLEGAL DIGIT. DLD B.IDI GET TOP 3 BITS. AND B160K SZA ANY SET ? ISZ BOVFL YES, OVERFLOW. XOR B.IDI GET TOP WORD WITHOUT BITS. RRR 13 SWAP & LEFT SHIFT 3. IOR T2IND INSERT DIGIT. STA B.IDI+1 STB B.IDI LDA T2IND (A) = DIGIT. * * CHECK FOR ZERO OR LIMIT. * INDI1 LDB MANTE NO. AT LIMIT ? RBL,CLE,SLB,ERB (REMOVE POSSIBLE INDIRECT) LDB B,I SZA OR ZERO DIGIT ? CPB MANTL JMP INDI6 YES, JUST COUNT IT. * * GOOD DIGIT. ADD IT OR A SKIPPED ZERO. * LDA T1INP NO. GOOD DIGIT. MULTIPLY OTHERS BY 10. ALS,ALS ADA T1INP ALS LDB T4INP ANY UNUSED ZEROES ? SZB,RSS IF SO, ADD THEM FIRST. ADA T1IND IF NOT, ADD THIS DIGIT. STA T1INP ISZ T2INP COUNT DIGITS. FULL GROUP OF 4 ? JMP INDI5 NO. LDA K5000 YES, ADD THEM. INDI2 LDB KM16 MAKE ROOM. CMB,CCE,INB B=16, E=1. JSB MULT LDB MANTL ADD DIGIT(S) ISZ MANTL LDA B,I CLE ADA T1INP STA B,I CCA,SEZ,RSS CARRY ? JMP INDI4 NO. INDI3 ADB A PROPOGATE IT. ISZ B,I RSS JMP INDI3 * INDI4 LDA KM4 RESET COUNT. STA T2INP CLA RESET DIGITS. STA T1INP LDB T4INP RELOAD TRAILING ZERO COUNT. SKP * IF JUST PROCESSED A SKIPPED ZERO, DO ANOTHER DIGIT. * INDI5 LDA T1IND WAS IT A TERMINATION CALL ? SSA,RSS SZB,RSS OR NO TRAILING ZEROES ? JMP INDIG,I YES, DONE WITH THIS DIGIT. ADB KM1 IT WAS A SKIPPED ZERO. DECREMENT COUNT. STB T4INP JMP INDI1 TRY AGAIN. * * ZERO, EXTRA DIGIT & TERMINATION PROCESSING. * INDI6 LDA T1INP ZERO OR EXTRA DIGIT. LEADING ZERO ? ADA EXP (IF SO, EXP=-1 AND T1INP=0) SSA,RSS ISZ T4INP NO, TRAILING DIGIT, COUNT IT. JMP INDIG,I DONE WITH THIS ONE. INDI7 LDA T2INP ANY UNUSED DIGITS ? CPA KM4 JMP INDIG,I NO, DONE. ADA PWR10 YES. ADD THEM. LDA A,I JMP INDI2 * T1IND NOP T2IND NOP KM16 DEC -16 K9 DEC 9 B160K OCT 160000 B.IDI DEC 0,0 BILGD NOP OCTAL ILLEGAL DIGIT FLAG. BOVFL NOP OCTAL OVERFLOW FLAG. SPC 3 * POWER OF TEN TABLE. FIRST PART IS (10**I)/2, I=1,2,3. SECOND * PART IS IDENTICAL TO 2-WORD FLOATING EXCEPT THE SECOND WORD HAS * BEEN RIGHT SHIFTED ONE BIT. VALUES ARE 1O**I FOR I=1,6. SPC 1 K5000 DEC 5000 PWR10 DEF PWR1A BASE ADDRESS. K5 DEC 5 DEC 50 DEC 500 PWR1A DEC 20480 10**1 DEC 4 DEC 25600 10**2 DEC 7 DEC 32000,10 10**3 DEC 20000,14 10**4 DEC 25000,17 10**5 DEC 31250,20 10**6 SKP * NORML - MANTISSA NORMALIZATION. * THE MANTISSA AND EXPONENT ARE ADJUSTED SO THAT THEY CONTAIN * A NORMALIZED VALUE. THE MANTISSA MUST NOT BE ZERO. * NORML NOP NORM1 LDB F.IDI SEE IF NORMALIZED. ASL 1 SOC WELL ? JMP NORML,I YES. JSB LSONE NO. LEFT SHIFT & ADJUST EXP. JMP NORM1 TRY AGAIN. SPC 2 * RSN - LOGICAL RIGHT SHIFT MANTISSA ONE BIT. * RSN NOP ISZ EXP ADJUST EXPONENT. NOP DLD F.IDI JUST SHIFT.... CLE,ERA ERB DST F.IDI DLD F.IDI+2 ERA ERB DST F.IDI+2 JMP RSN,I EXIT SPC 2 * LSONE - LOGICAL LEFT SHIFT MANTISSA ONE BIT. (5 WORDS) * LSONE NOP CCA ADJUST EXP ADA EXP STA EXP LDA F.IDI+4 CLE,ELA STA F.IDI+4 DLD F.IDI+2 ELB ELA DST F.IDI+2 DLD F.IDI ELB ELA DST F.IDI JMP LSONE,I * B17 OCT 17 LSR16 LSR 16 T1RSN NOP SKP * RSNN - LOGICAL RIGHT SHIFT (A) BITS, IN [0,63], AND UPPER * TWO WORDS ONLY VALID FOR INTEGER OVERFLOW TEST. * RSNN NOP STA T1RSN SAVE SHIFT COUNT. ARS,ARS DIVIDE BY 16 TO GET WORD COUNT. ARS,ARS ADA RSNN1 SELECT CODE FOR 0-3 WORDS OF SHIFT JMP A,I * RSNN1 DEF *+1 JUMP TABLE FOR WORD SHIFTS JMP RSNN7 JMP RSNN2 JMP RSNN3 JMP RSNN4 * RSNN2 DLD F.IDI+1 RIGHT SHIFT ONE WORD. DST F.IDI+2 LDA F.IDI F.IDI+1=F.IDI JMP RSNN6 * RSNN3 DLD F.IDI RIGHT SHIFT TWO WORDS. STB F.IDI+3 JMP RSNN5 * RSNN4 LDA F.IDI RIGHT SHIFT THREE WORDS. STA F.IDI+3 CLA RSNN5 STA F.IDI+2 CLA RSNN6 STA F.IDI+1 CLA STA F.IDI * * NOW RIGHT SHIFT BY PARTIAL WORD * RSNN7 LDA T1RSN GET SHIFT COUNT. AND B17 SZA,RSS JMP RSNN,I IF ZERO COUNT, DONE SHIFTING * IOR LSR16 FORM "LSR N" STA RSNN8 PLUG CODE STA RSNN9 LDB F.IDI+2 DO LOW SHIFT. LDA F.IDI+3 RSNN8 ABS *-* STA F.IDI+3 LDB F.IDI+1 THEN HIGH SHIFT. LDA F.IDI+2 RSNN9 ABS *-* STB F.IDI+1 (UPPER BITS LEFT IN F.IDI+0) STA F.IDI+2 JMP RSNN,I DONE. SKP * .XCOM - NEGATE MANTISSA / ROUND RESULT. * * IF 'SIGN' IS +, ADD 200B TO LAST WORD & PROPOGATE CARRY. * IF -, COMPLEMENT EACH WORD & ADD 201B TO LAST & PROP. * THE RESULT MUST NOT BE ZERO. SPC 2 .XCOM NOP LDA B200 (A) = ROUND CONSTANT FOR +. LDB SIGN + OR - ? SSB INA (A) = ROUND CONSTANT FOR -. STA T1DIV LDA MANTL (A) = POINTER. * XCOM1 LDB SIGN COPY COMPLEMENT STATUS TO (E) ELB LDB A,I (B) = WORD OF MANTISSA. SEZ COMPLEMENT ? (E=0) CMB,CLE YES. DO IT. (E=0) ADB T1DIV ADD CARRY. STB A,I (STORE MANTISSA) CLB,SEZ COPY NEW CARRY BIT TO (A). INB STB T1DIV SAVE CARRY FOR NEXT TIME. CPA F.DID AT FIRST WORD ? JMP XCOM2 YES. * ADA KM1 NO. BACK UP POINTER AND JMP XCOM1 KEEP GOING. * XCOM2 LDA F.IDI (A) = FIRST WORD. LDB A (ALSO B) XOR SIGN SIGN RIGHT ? SSA JMP XCOM4 NO. OFL. * ASL 1 YES. IS IT NEG UNNORM ? SOC JMP .XCOM,I NO, DONE. * CCA YES. (A)=-1 TO DECR EXPONENT, JMP XCOM5 AND (B)=100000, SHIFTED MANTISSA. * XCOM4 CLA,INA OFL. (A)=+1 TO INCR EXPONENT, RBR AND (B)=40000, SHIFTED MANTISSA. XCOM5 STB F.IDI SET UP MANTISSA, ADA EXP AND CORRECT EXPONENT. STA EXP JMP .XCOM,I DONE. SKP * MULT MULTIPLIES THE MANTISSA BY A 15-BIT SCALAR AND ADJUSTS THE * EXPONENT. THE RESULT IS AS IF AN INTEGER MULTIPLY OF THE MANTISSA * AND SCALAR WERE DONE FOLLOWED BY A RIGHT SHIFT 15. THE RESULT * WILL NOT OVERFLOW BUT IT MAY BECOME UNNORMALIZED. * * CALLING SEQUENCE: CLE/CCE LAST WORD FLAG. * LDA SCALAR MULTIPLIER. * LDB N EXPONENT ADJUSTMENT. * JSB MULT * * WHERE E=1 INDICATES THAT THE LAST WORD OF THE CURRENT MANTISSA IS * ZERO. (INPUT) FOR THIS CASE, EXP ADJUSTMENT MUST NOT CARRY OUT. SPC 1 MULT NOP STA T1DIV SAVE MULTIPLIER. RAL AND 2*MULTIPLIER. STA T4DIV CME E=0 IFF INPUT ADB EXP ADJUST EXPONENT STB EXP LDB MANTL CURRENT WORD ADDR SEZ,RSS INPUT ? JMP MULT3 YES, SKIP FIRST MPY STB T2DIV RAR RESTORE MULTIPLIER. MPY B,I ASL 1 JMP MULT2 MULT1 LDA T1DIV MULTIPLIER. MPY B,I * CURRENT WORD. CLE,ELA ALIGN. ELB,CLE ADA T3DIV,I ADD LOWER TO CURRENT + 1 STA T3DIV,I SEZ PROPOGATE CARRY. INB MULT2 LDA T2DIV,I CORRECT FOR BIT 15. SSA ADB T4DIV STB T2DIV,I LDB T2DIV SEE IF DONE. MULT3 CPB F.DID I.E., IS CURRENT WORD THE START ? JMP MULT,I YES, DONE. STB T3DIV NO, UPDATE POINTERS. ADB KM1 STB T2DIV JMP MULT1 AND LOOP. SKP * DIVD DIVIDES THE MANTISSA BY A SCALAR AND ADJUSTS THE EXPONENT * ACCORDINGLY. THE EFFECT IS AS IF THE TWO WERE INTEGERS AND THE * DIVIDE WERE DONE, KEEPING 15 FRACTION BITS, FOLLOWED BY A L.S. 15. * OVERFLOW CAN OCCUR ONLY IF THE MANTISSA IS NORMALIZED OR THE * DIVISOR IS LESS THAN 2**14. * * CALLING SEQUENCE: LDA SCALAR 15-BIT DIVISOR. * LDB N EXPONENT ADJUSTMENT. * JSB DIVD SPC 1 DIVD NOP STA T1DIV SAVE DIVISOR. ARS SAVE DIVISOR/2. STA T4DIV CMB,INB CORRECT EXPONENT. ADB EXP STB EXP LDA F.DID SET UP POINTERS. STA T2DIV STA T3DIV LDB A,I B = FIRST WORD. CMA,INA -F.DID ADA MANTL MANTL-F.DID = # WDS - 1 CMA - # WDS STA T5DIV CLA BITS 15,14 FIRST WORD = 0 JMP DIVD2 DIVD1 ISZ T2DIV CLA SAVE BIT 15 (IN E). ELA,ELA CMB FORM REM - DIVISOR/2 ADB T4DIV CMB,CLE,SSB POS ? ADB T4DIV NO, RESTORE REM & SET E. CME SAVE BIT 14 (IN E). ERA,RAR DIVD2 STA T6DIV SAVE BITS 15,14. ISZ T3DIV LDA T3DIV,I A = NEXT WORD (LOW) DIV T1DIV DIVIDE. CLE,ERA SHIFT RIGHT, SAVE BIT 0 AS BIT 15. IOR T6DIV ADD PREV BITS 15,14. STA T2DIV,I ISZ T5DIV DONE ? JMP DIVD1 NO, LOOP. JMP DIVD,I YES, EXIT. * T1DIV NOP T2DIV NOP T3DIV NOP T4DIV NOP T5DIV NOP T6DIV NOP SKP * INITIALIZE FOR CONVERTING A NUMBER. * INC.F NOP LDA F.DID SET UP (MANTL) FOR INDIG. STA MANTL LDA KM4 FOR INDIG. STA T2INP # DIGITS THIS GROUP - 4. CCA STA EXP JSB CDI.F CLEAR F.IDI, SET A=0. STA B.IDI CLEAR B.IDI STA B.IDI+1 STA T1INP ACCUMULATED DIGITS THIS GROUP. (UP TO 4) STA EXPS SIGN OF EXPONENT. STA T4INP # TRAILING ZEROES. STA SIGN SIGN OF MANTISSA. STA BOVFL OCTAL OVERFLOW FLAG. STA BILGD OCTAL ILLEGAL DIGIT FLAG. STA EXPON DECIMAL EXPONENT. STA POST STATE OF CONVERSION. STA D # DIGITS AFTER POINT. LDA REA DEFAULT F.IM = REA. STA F.IM JMP INC02 GO START. * * MAIN LOOP. READ A CHAR AND DECIDE WHAT TO DO. * INC00 ISZ POST BUMP POST TWICE. INC01 ISZ POST BUMP POST ONCE. * INC02 JSB ICH.F GET NEXT (NON-BLANK) CHAR. SZB,RSS DIGIT ? JMP INC04 YES. * CPA B53 '+' JMP INC07 CPA B55 '-' JMP INC07 CPA "." '.' JMP INC09 CPA "E" 'E' JMP INC13 CPA "D" 'D' JMP INC13 JMP INC14 NONE OF ABOVE. STOP THE CONVERSION. SKP * DIGIT. POST= 0 => 2 ADD MANTISSA DIGIT. * 1 => 2 .. * 2 => 2 .. * 3 => 3 .. & COUNT FRACTION DIGIT. * 4 => 6 ADD EXPONENT DIGIT. * 5 => 6 .. * 6 => 6 .. * INC04 ADA BM60 (A) = VALUE OF DIGIT. JSB JTB.F JUMP ON B=POST. DEC 6 ALL VALUES LEGAL. * ISZ POST 0 => 1 ISZ POST 1 => 2 JMP INC06 2, ADD DIGIT. JMP INC05 3, ADD & COUNT DIGIT. ISZ POST 4 => 5 ISZ POST 5 => 6 * LDB EXPON 6, MULTIPLY EXPON BY 10 BLS,BLS ADB EXPON BLS ADB A ADD DIGIT. ASL 4 GUARANTEE LARGE EXPONENTS STAY LARGE. SOC IF TOO BIG, LDB B60K SET LARGER THAN MAX ALLOWED. ASR 4 (HERE 60000B => 3000B) STB EXPON JMP INC02 TRY FOR MORE. * INC05 ISZ D 3, COUNT DIGIT. INC06 JSB INDIG 0-2, ADD MANTISA DIGIT. JMP INC02 NEXT! SPC 2 BM60 OCT -60 BM54 OCT -54 "Q" OCT 121 "V" OCT 26 T1INP NOP T2INP NOP EXPS NOP T4INP NOP SKP * SIGN. POST= 0 => 1 SET MANTISSA SIGN. * 1 => ERROR. * 2 => FINISH INTEGER. * 3 => FINISH REAL. * 4 => 5 SET EXPONENT SIGN. * 5 => ERROR * 6 => FINISH REAL/DOUBLE * INC07 ADA BM54 '+': -1 '-': +1 CMA,INA +-1 AS SIGN. JSB JTB.F JUMP ON (POST) DEC 4 5,6 SAME AS END. * JMP INC08 0, GO SAVE MANTISSA SIGN. JMP INC26 1, ERROR: TWO SIGNS. JMP INC20 2, FINISH INTEGER. JMP INC32 3, FINISH REAL. * STA EXPS 4, SAVE EXPONENT SIGN. JMP INC01 4 => 5. * INC08 STA SIGN 0, SAVE MANTISSA SIGN. JMP INC01 0 => 1. * INC26 LDA K17 ERROR 17, MISSING OPERAND. JSB ER.F K17 DEC 17 SPC 4 * E OR D. POST= 0 => NAME. * 1 => OPERATOR, + OR -. * 2 => 4 * 3 => 4 * 4 => ERROR * 5 => ERROR * 6 => FINISH REAL/DOUBLE. * INC13 JSB JTB.F JUMP ON (POST) DEC 3 4,5,6 SAME AS (END). * JMP INC15 0, NAME. JMP INC27 1, + OR -. ISZ POST 2 => 4 * STA E/D 3, REMEMBER WHICH KIND. JMP INC01 3 => 4. SKP * POINT. POST= 0 => 3 IF FOLLOWED BY DIGIT, ELSE OPERATOR. * 1 => 3 IF FOLLOWED BY DIGIT, ELSE ERROR. * 2 => 3 IF NOT FOLLOWED BY LETTER. * 4 IF FOLLOWED BY 'E' BUT NOT 'EQ'. * 'EQ', FINISH DOT OPERATOR THEN INTEGER. * 3 => FINISH REAL. * 4 => ERROR. * 5 => ERROR. * 6 => FINISH REAL/DOUBLE. * INC09 JSB JTB.F JUMP ON (POST) DEC 2 3,4,5,6 SAME AS (END). JMP INC10 0 JMP INC12 1 * JSB EXN.F 2. WHAT'S NEXT ? SEZ,RSS DELIMETER OR SZB,RSS DIGIT ? JMP INC01 YES, 2 => 3. CPA "D" 'D' ? JMP INC01 YES, FIGURE IT OUT LATER. CPA "E" 'E' ? RSS JMP INC11 NO. MUST BE RELATIONAL OP. * JSB ICH.F READ THE 'E'. STA E/D AND SAVE FOR LATER. JSB EXN.F & LOOK AT ONE AFTER. CPA "Q" IS IT '.EQ' ? RSS YES. JMP INC00 NO. 2 => 4. * JSB ICH.F READ THE 'Q'. JSB ICH.F READ NEXT, SHOULD BE '.' OR 'V'. LDB "EQ" (INCASE .EQ.) CPA "V" IS IT .EQV. ? RSS MUST BE. JMP INC03 NO. GO VERIFY THAT IT'S .EQ. * JSB ICH.F .EQV., READ THE DOT. LDB "EV" SET UP RESULT. INC03 STB F.TC SET RESULT. CPA "." ENDS RIGHT ? JMP INC20 YES. JMP INC18 NO. ERROR. * INC10 JSB EXN.F 0. PEEK AHEAD. SZB DIGIT ? JMP INC11 NO. NOT A NUMBER. RESTORE '.' ISZ POST YES. DIGIT AFTER POINT. JMP INC00 ADVANCE POST TO 3. * INC11 LDA "." RESTORE F.TC = "." FOR DOT OPERATOR. STA F.TC JMP INC14 INTERPRET IT AS A DELIMETER. * INC12 JSB EXN.F 1, REQUIRE NEXT = DIGIT. SZB,RSS DIGIT ? JMP INC00 YES. 1 => 3. INC18 LDA K17 NO, ERROR. JSB ER.F * SPC 3 * UNKNOWN. POST= 0 => NAME. * 1 => + OR -. * 2 => FINISH INTEGER. * 3 => FINISH REAL. * 4 => ERROR. * 5 => ERROR. * 6 => END REAL/DOUBLE. * * JTB.F ALLOWS ACCESS TO AN IMMEDIATELY FOLLOWING JUMP TABLE USING * (POST) AS THE INDEX INTO THE TABLE. THE FIRST RETURN POINT * CORRESPONDS TO POST=0. IF POST>LIMIT, THE TERMINATION TABLE IS * USED (FOLLOWS JTB.F). * * ENTRY: JSB JTB.F (POST=INDEX) * DEC LIMIT * * * ..ETC.. * * EXIT: (B,E,O) DESTROYED, (A) INTACT. * JTB.F NOP LDB POST (B) = POST. CMB,CLE,INB -POST. E=0 UNLESS POST=0. ADB JTB.F,I LIMIT-POST. E=0 IFF POST>LIMIT AND POST#0. LDB JTB.F RETURN POINT FOR (-1). ADB POST RETURN POINT FOR (POST-1). SEZ,INB POST>LIMIT ? (RTN POINT FIXED) JMP B,I NO. RETURN. * * HERE'S THE ACTUAL JUMP TABLE FOR UNKNOWN CHARACTERS. * INC14 JSB JTB.F (MAY RE-ENTER) DEC 6 ALL. * JMP INC15 0, NAME OR OPERATOR. JMP INC27 1, + OR -. JMP INC20 2, FINISH INTEGER. JMP INC32 3, FINISH REAL. JMP INC19 4, ERROR. JMP INC19 5, ERROR. JMP INC30 6, END OF REAL/DOUBLE. * * EXIT CODE FOR INC.F * INC27 JSB UC.F SIGN ONLY. BACK UP. LDA SIGN AND RESTORE F.TC CMA,INA ADA B54 STA F.TC INC15 CLA SET F.IM=0 INC16 STA F.IM SET F.IM INC17 LDA F.IM LOAD F.IM JMP INC.F,I EXIT. * * ERROR - ILLEGAL EXPONENT. * INC19 LDA K14 LDB F.SID SCAN MODE ? SZB,RSS JSB ER.F NO. ERROR. JMP INC17 YES. RETURN F.IM * KM6 DEC -6 B1000 OCT 1000 B200 OCT 200 BM400 OCT -400 BMAX OCT 77777 RE8 OCT 120000 K14 DEC 14 E/D NOP KM63 DEC -63 B10K OCT 10000 B100K OCT 100000 DBI EQU B100K B52 OCT 52 SPC 2 * SUBR TO CHECK FOR '**' AFTER NEGATIVE CONST. * CEX.F NOP LDA F.SID SCAN MODE LDB SIGN OR + CONSTANT ? SZA,RSS SSB,RSS JMP CEX.F,I YES. DOESN'T MATTER. * LDA F.TC DELIMETER = '*' ? CPA B52 RSS YES. JMP CEX.F,I NO. ISN'T ** THEN * JSB EXN.F CHECK NEXT ONE. CPA B52 WELL ? JMP CEX01 YES. SPECIAL NEGATIVE CONST. * LDA B52 NO. RESTORE F.TC STA F.TC JMP CEX.F,I & EXIT. * CEX01 CLA SET SIGN POSITIVE AGAIN. STA SIGN ISZ F.SIM SET FLAG TO DELAY CONSTANT. JMP CEX.F,I (WILL RETURN A '-' INSTEAD) SKP * FINISH UP AN INTEGER CONSTANT. * INC20 JSB CEX.F CHECK FOR '**' LDA F.TC OCTAL CONSTANT ? CPA "B" JMP INB01 YES. * LDA DBI SET F.IM=DBI IN CASE OVERFLOW. STA F.IM CCA ADD ANY REMAINING DIGITS. JSB INDIG LDA F.IDI RESULT = 0 ? IOR F.IDI+1 SZA IF SO, SKIP NORMALIZE. JSB NORML NORMALIZE SO 'PTEN' WORKS. LDA T4INP ADD ANY TRAILING ZEROES. JSB PTEN * LDA EXP ALLOW 4 WORDS (MAX NEG MUST FIT) ADA KM63 (A) = - (R.S. COUNT FOR 4 WORD INTEGER) CLE,SSA,RSS FITS ? (E=0) JMP INC35 NO. * CMA,INA YES. (A) = POSITIVE SHIFT COUNT. JSB RSNN RIGHT SHIFT (A) BITS. LDA F.IDI >= 2**32 ? IOR F.IDI+1 CLE,SZA (E=0) JMP INC35 YES, OFL. * DLD F.IDI+2 (A,B) = UNSIGNED VALUE. CLE,SSA >= 2**31 ? (E=0) JMP INC23 YES. -2**31 IS STILL O.K. * LDA F.SLF IF DATA STATEMENT, CPA K2 JMP INC25 LET THE DATA PROCESSOR DO HOLLERITH. * LDA F.TC OTHERWISE, CHECK FOR 'H' CPA "H" JMP IDN72 YES, HOLLERITH CONSTANT. * INC25 LDA F.IDI+2 ISZ SIGN NEGATIVE ? JMP INC22 NO. (A,B) = NUMBER. * CMA YES. NEGATE. CMB,INB,SZB,RSS INA SKP * (A,B) = INTEGER VALUE. * DECIDE IF SINGLE OR DOUBLE, SET VALUE & F.IM, EXIT. * INC22 DST F.IDI RESULT. SWP DECIDE IF SINGLE OR DOUBLE. ASL 16 OFL=1 IFF MUST BE DOUBLE. LDB F.TC IF 'J' SUFFIX, CPB "J" JMP INC28 THEN ALWAYS TWO-WORD. * CPB "I" 'I' SUFFIX ? JMP INC29 THEN ALWAYS ONE-WORD. * LDA F.CCW ELSE CHECK 'J' OPTION. AND B10K SZA,RSS FOR SINGLE INTEGER: 'J' OPTION OFF SOC AND FITS IN 16 BITS. JMP INC24 NO. DOUBLE. * INC29 LDA K14 'I' SUFFIX & TOO BIG ? SOC JSB WAR.F YES. GIVE WARNING. * LDB F.TC NO. IF 'I' SUFFIX, CPB "I" JSB ICH.F SKIP OVER IT. LDA F.IDI+1 SET UP SINGLE INTEGER CONSTANT. STA F.IDI LDA INT F.IM=INT. JMP INC16 SET F.IM & EXIT. * INC28 JSB ICH.F 'J' SUFFIX, SKIP OVER IT. INC24 LDA DBI F.IM=DBI, DOUBLE INTEGER. JMP INC16 * INC23 ISZ SIGN NEGATIVE ? JMP INC35 NO. CAN'T BE O.K. * CPA B100K (A) = 100000 CLE,SZB (B) = 0 ? (E=0) JMP INC35 NO. OVERFLOW. JMP INC22 YES. GO BACK TO STORE IT. * "B" OCT 102 "H" OCT 110 "I" OCT 111 "J" OCT 112 F.EIM NOP EXPECTED ITEM MODE (SET BY DATA STMT) SKP * FINISH UP REAL/DOUBLE WITH EXPONENT. * INC30 LDA E/D WHICH ? CPA "E" E ? JMP INC32 YES, LEAVE SINGLE. * JSB CEX.F CHECK FOR '**'. CCA ADD ANY LEFT-OVER DIGITS. JSB INDIG LDA F.SLF DATA STATEMENT ? CPA K2 RSS (YES) JMP INC31 NO. GO CHECK 'Y' OPTION. * LDA B1000 YES. ASSUME REAL*8; LDB F.EIM WHAT IS EXPECTED MODE ? CPB DBL IF REAL*6, CLA THEN SET UP FOR THAT. RSS (A)=1000 FOR RE8, 0 FOR DBL. INC31 LDA F.CCW "D", DECIDE PRECISION OF CONSTANT. AND B1000 'Y' BIT. LDB DBL ASSUME DBL = REAL*6 SZA WELL ? LDB RE8 WRONG, RE8 = REAL*8. STB F.IM SET UP TYPE. LDB K2 ALSO SET UP ADDR OF LAST WORD. SZA INB DBL=2, RE8=3 WORDS AFTER FIRST. JMP INC33 * * FINISH REAL/DOUBLE. * INC32 JSB CEX.F CHECK FOR '**'. CCA ADD ANY LEFT-OVER DIGITS. JSB INDIG CLB,INB COMPUTE ADDR LAST WORD. INC33 ADB F.DID STB MANTL LDA F.SID SCAN MODE ? SZA JMP INC17 YES. CAN STOP NOW. * LDA F.IDI TEST FOR ZERO. IOR F.IDI+1 SZA,RSS JMP INC17 RESULT = 0. * JSB NORML ELSE NORMALIZE. LDB EXPON FINAL COMPUTATION OF NUMBER ISZ EXPS COMPUTE EXTERNAL CMB,INB EXPONENT AS NEGATIVE ADB D ADJUST FOR DECIMAL POINT OR EXCESS DIGITS. CMB,INB ADB T4INP ACCOUNT FOR TRAILING ZEROES, EXTRA DIGITS. ASL 9 OFL IF OUTSIDE [-64,+64) SOC SHOULD NEVER BE OUTSIDE [-60,+39] JMP INC34 (MANTISSA IN [1,10**20], ASR 9 RESULT IN [10**-39,10**39] ) LDA B JSB PTEN MULTIPLY BY POWER OF TEN. * * ROUND FLOATING. CHECK FOR OFL UFL, PACK EXPONENT. * JSB .XCOM (NEGATE) & ROUND. LDB EXP CHECK EXP CLA FOR USE IN FORMATTING EXP ASL 8 MUST FIT IN 8 BITS WITH SIGN. SOC JMP INC34 NO, OFL/UFL. CLE,ELB E=EXP SIGN, B<15:9>=EXP MANT. BLF,BLF B<7:1>=EXP MANT. RBR,ELB B<7:0>=FORMATTED EXPONENT. LDA MANTL,I LAST WORD MANTISSA. AND BM400 MAKE ROOM FOR EXP. IOR B PUT TOGETHER. STA MANTL,I JMP INC17 ALL DONE! * * OVERFLOW & UNDERFLOW HANDLING. * INC34 CCE,SSB OFL OR UFL ? (IF OFL, E=1) CLA,CLE,RSS UFL. (E=0) INC35 LDA BMAX OFL. E=1 IF FLOATING. STA F.IDI RAL,ARS UFL:0 OFL:-1 STA F.IDI+1 STA F.IDI+2 STA F.IDI+3 SEZ,RSS INTEGER OR UFL ? JMP INC36 YES, DONE. LDA MANTL,I FLOATING & OFL, CLEAR LAST BIT. ALS STA MANTL,I * INC36 LDB F.SID SCAN MODE ? LDA K14 SZB,RSS JSB WAR.F NO, USE UFL/OFL WARNING. JMP INC17 EXIT. END ASMB,Q,C HED INPUT DUMMY LIST / LINK MANIPULATION. NAM IDL.F,8 92834-12001 REV.2030 800226 * *************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * *************************************************************** * NAME: PART OF FTN4X * * SOURCE: PART OF 92834-18001 * * RELOC: PART OF 92834-12001 * * PGMR: B.G. * *************************************** * EXT F.A ASSIGNMENT TABLE ADDRESS (CURRENT ENTRY) EXT F.AT ADDRESS TYPE OF CURRENT F.A EXT F.NAR NUMBER OF ALTERNATE RETURNS. EXT F.NT NAME TAG: 0=VAR, 1=CONST. EXT F.SBF 0=MAIN, ELSE F.A OF SUBROUTINE. EXT F.SFF SUBROUTINE/FUNCTION FLAG (0=SUB). EXT F.SLF STATEMENT LEVEL. EXT F.TC NEXT CHARACTER. * EXT DAF.F DEFINE (F.AF) EXT DAT.F DEFINE (F.AT) EXT DIU.F DEFINE (F.IU) EXT EXN.F EXAMINE THE NEXT NONBLANK CHARACTER. EXT ICH.F GET & TYPE NEXT NONBLANK CHARACTER. EXT ISY.F INPUT SYMBOL. EXT RP.F INPUT ')' EXT TCT.F TEST (A)=F.TC ELSE ERROR 28. EXT WAR.F ISSUE WARNING. * ENT EL.F EXCHANGE LINKS OF (F.A) AND (B). ENT FL.F FETCH LINK OF (B). ENT IDL.F INPUT DUMMY LIST. SPC 1 A EQU 0 B EQU 1 SUP SKP * ***************************** * * INPUT DUMMY ARGUMENT LIST * * ***************************** SPC 1 * ENTRY: F.A = A.T. ADDR OF SUB/FCT NAME. * EXIT: (A)=ADDR FIRST FORMAL, LINKED THRU F.AF FIELDS. * IDL.F NOP LDA B50 CHECK FOR JSB TCT.F '(' JSB EXN.F O.K., CHECK FOR EMPTY LIST. CPB B51 WELL ? JMP IDL03 YES. THAT'S O.K. * CLA NO. SET LINK OF DUMMY HEAD TO ZERO. STA PLST+1 LDA DPLST START WITH F.A = DUMMY HEAD. STA F.A IDL00 LDA F.A SAVE F.A OF PREV ITEM FOR LINKING. STA T1IDL * * IF SUBROUTINE'S PARAMS, LOOK FOR ALTERNATE RETURNS. * LDA F.SLF IF IN SUBPROGRAM PARAM LIST, IOR F.SFF AND IT'S A SUBROUTINE, SZA JMP IDL02 NO. * JSB EXN.F THEN LOOK FOR ALTERNATE RETURNS. CPA B52 '*' ? RSS CPA B46 '&' ? RSS JMP IDL02 NEITHER. NOT AN ALT RTN. * ISZ F.NAR YES. COUNT IT. JSB ICH.F AND READ IT. JSB ICH.F AND POSITION AT THE DELIMETER. JMP IDL01 DONE WITH IT. * * ELSE GET THE PARAMETER AND DO SOME CHECKING. * IDL02 JSB ISY.F INPUT THE DUMMY NAME CLA CLEAR WAR.F AS A FLAG STA WAR.F TO BE TESTED FOR WARNINGS LATER LDB F.NT IF NOT A NAME LDA K74 SZB SEND JSB WAR.F WARNING LDB F.A IF SAME AS NAME CPB F.SBF JSB WAR.F SEND ALSO LDA K76 IF ALREADY DUM LDB F.AT THEN CPB DUM DOUBLY DEFINED DUMMY JSB WAR.F SEND MESSAGE CLA CLEAR JSB DIU.F THE F.IU LDA DUM SET F.AT JSB DAT.F TO DUM LDA WAR.F IF NO WARNINGS SENT SZA THEN SKIP TO THE LINK JMP IDL01 ELSE SKIP LINKING IT IN * LDB T1IDL LINK PREVIOUS TO CURRENT. JSB EL.F (F.AF OF CURRENT = SELF) CLA SET CURRENT LINK TO ZERO. JSB DAF.F (SAFER THIS WAY: AI.F SET STMT FCT F.AF) * * CHECK DELIMETER & LOOP. * IDL01 LDA F.TC ANY MORE?? CPA B54 ',' JMP IDL00 YES GO GET IT * JSB RP.F ')' TEST FOR FINAL ')', PASS IT. LDA PLST+1 RETURN ADDR FIRST DUMMY. JMP IDL.F,I EXIT. * IDL03 JSB ICH.F EMPTY LIST. READ THE ')'. JSB ICH.F AND THE ONE AFTER IT. CLA RETURN A=0, NULL LIST. JMP IDL.F,I * T1IDL NOP DPLST DEF PLST ADDR DUMMY HEAD. PLST DEC 0,0 DUMMY LIST HEAD. B46 OCT 46 & B50 OCT 50 ( B51 OCT 51 ) B52 OCT 52 * B54 OCT 54 , K74 DEC 74 K76 DEC 76 SKP * ************** * * FETCH LINK * * ************** SPC 1 * ENTRY: (B) = F.A OF ITEM TO FETCH LINK OF. * EXIT: (B) = ADDRESS OF LINK. * (A) = VALUE OF LINK. * SPC 1 FL.F NOP STB F.A LDA B,I AND B600 CPA ARR INB,RSS IU(F.A)=ARR RSS LDB B,I (B)=GF(F.A) XOR F.A,I GET THE AND B7000 AT FIELD CPA BCOM IF A BLOCK COMMON INB,RSS ELEMENT RSS INDEX ONE LDB B,I MORE LEVEL INB LDA B,I JMP FL.F,I SPC 2 * ****************** * * EXCHANGE LINKS * * ****************** SPC 1 * EXCHANGE AF(F.A) & AF(B) SPC 1 EL.F NOP LDA F.A STA T1EL JSB FL.F FETCH LINK (B) STB T2EL T2EL=LINK ADDR (B) LDB T1EL (B)=ORIGINAL F.A STA T1EL T1EL=LINK VALUE (B) JSB FL.F FETCH LINK STA T2EL,I SET CURRENT IN OLD LDA T1EL AND OLD IN STA B,I CURRENT JMP EL.F,I SPC 1 B600 OCT 600 EXTRACT F.IU FIELD ARR EQU B600 F.IU=ARR B7000 OCT 7000 EXTRACT F.AT FIELD. BCOM OCT 3000 F.AT=BCOM DUM OCT 5000 F.AT=DUM T1EL BSS 1 T2EL BSS 1 * END ASMB,Q,C HED FTN4X COMPILER CODE OUTPUT TO PASS 2 NAM OA.F,8 92834-12001 REV.2030 800623 * *************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * *************************************************************** * NAME: PART OF FTN4X * * SOURCE: PART OF 92834-18001 * * RELOC: PART OF 92834-12001 * * PGMR: B.G. * *************************************** * * EXT'S WITH A LEADING 'F.' ARE VARIABLES OR JUMP TARGETS * * THE COLUMN THE EXT STARTS IN DEFINES THE SUBROUTINE IT IS * DEFINED IN AS FOLLOWS * 2 -- OA.F (WRITE PASS FILE ROUTINES) * 3 -- NEX.F (STATEMEXTS THAT DON'T CONTAIN EXPRESSIONS) * 4 -- FA.F (THE ASSIGNMEXT TABLE ROUTINES) * 5 -- EX.F (STATEMEXTS USING THE EXPRESSION EVALUATOR) * 6 -- IC.F (THE CHARACTER INPUT ROUTINES) * 7 -- IDN.F (THE TOKEN INPUT ROUTINES) * 8 -- FTN4 ( THE MAIN) EXT F.A ASSIGNMEXT TABLE ADDRESS (CURRENT ENTRY) EXT F.ABT ABORT COMPILE EXTRY EXT F.AF ADDRESS FIELD CURREXT F.A EXT F.AT ADDRESS TYPE OF CURREXT F.A ENT F.C GENERAL OFFSET FOR CODE GENERATION. EXT F.D.T ADDRESS OF '.' FUN. TABLE EXT F.D0 ARRAY ELEMEXT SIZE EXT F.DID ADDRESS OF F.IDI EXT F.GRD ACCESS TO GRD.F EXT F.IM CURREXT ITEM MODE (REAL, COMPLEX,ECT.) EXT F.IU CURREXT ITEM USAGE (DUM., RELATIVE, ECT.) ENT F.NIT NO-INLINE-TEMP FLAG. EXT F.NT NAME TAG 0 = VAR, 1 = CONSTANT. EXT F.RES F.A OF CURRENT RESULT. EXT F.RPL PROGRAM LOCATION COUNTER EXT F.XID EXTERNAL ID COUNTER. * * EXT'S WITH A TRAILING '.F' ARE SUBROUTINES * EXT DAF.F DEFINE (F.AF) EXT DL.F DEFINE LOCATION SUBROUTINE EXT FA.F FETCH ASSIGNS ENT IN2.F INIT FOR OA.F MODULE ENT OA.F OUTPUT ASSIGNMEXT TABLE OPERAND ENT OAD.F OUTPUT ABS. DATA ENT OAI.F OUTPUT ABS. INSTRUCTION ENT OC.F OUTPUT CONSTANT ENT ODD.F OUTPUT DEF TO DOT FUNCTION. ENT ODF.F OUTPUT DOT FUNCTION ENT OID.F OUTPUT INSTRUCTION, DOT-OPERAND. ENT OLR.F OUTPUT LOAD ADDRESS ENT OMR.F OUTPUT MEMORY REF. INSTRUCTION ENT ORI.F OUTPUT ABS. REGISTER INSTRUCTION. ENT OS.F FLUSH THE BUFFER. ENT OW.F OUTPUT WORD ENT OZ.F OUTPUT ZREL (OP *+N) ENT PDF.F PRODUCE DEF SUBROUTINE ENT SOA.F STORE AND OUTPUT (OA.F) * * EXTERNALS IN RTM.F . * * * * COMPILER LIBRARY ROUTINES * EXT WRT.C WRITE RECORD EXT C.SC0 FCB FOR 2ND PASS FILE. * A EQU 0 B EQU 1 * ADDR OCT 70000 F.IM=7 ADDRESS SPC 1 * SKP * ******************************************* * * OUTPUT ASSIGNMENT TABLE POINTER OPERAND * * ******************************************* SPC 1 * PROCESS ABSOLUTE INSTRUCTIONS, CHANGE INDIRECTNESS * OF FORMAL PARAMS, OUTPUT 'DEF' ENTRIES IMMEDIATELY. * OA.F NOP STA T0OA TEMP CELL TO HOLD OPCODE WORD LDB F.A IF F.A IS SZB ZERO THEN PRODUCE AN CPB K1 (ONE ALSO) JMP OA03A ABSOLUTE INSTRUCTION * JSB CDO.F NO, CHECK FOR DATA WITH OFFSET. STB F.A JSB FA.F LDA T0OA GET THE OP CODE LDB F.IM IF THIS IS ADB F.NT A DEF ENTRY CPB K1 THEN SKIP THE REST OF THE CHECKS JMP OA015 AND PUT OUT THE CODE * LDB F.AT CPB DUM IS OPERAND TAGGED DUMMY? RSS JMP OA01 NO. * XOR KK01 YES, CHANGE THE INDIRECT OPTION. STA T0OA SAVE THE NEW INSTRUCTION JMP OA015 GO SEND A.T. BASED INSTRUCTION. * OA03A AND C2000 CLEAR THE CURRENT PAGE BIT STA T0OA SAVE WHILE GETTING REG INFO. JSB F.GRD,I GET REGISTER INFO. DEF F.A LDA T0OA RESTORE INSTRUCTION, IOR F.A ADD REGISTER NUMBER, SSB,RSS IF THE REGISTER IS DEFINED, SOS AND IT'S AN ADDRESS, RSS (NO) IOR SIGN SET THE INDIRECT BIT. JSB OAI.F SEND ABS INSTRUCTION OA04 CLA CLEAR THE NO-INLINE-TEMP FLAG. STA F.NIT JMP OA.F,I RETURN SKP * CHECK FOR SPECIAL PROCESSING. * OA01 LDA F.IU CPA SUB IS OPERAND AN EXTERNAL NAME JMP OA03 YES, GEN. EXT. REF. INSTRUCTION * LDB F.AT IS OPERAND CPB BCOM LABELED COMMON? JMP OA10 YES GO DO SPECIAL * CPB DIM DIMENSION ENTRY ? RSS CPB BCOMI OR BCOM OFFSET ? JMP OA015 YES. MUST BE NORMAL DEF. * LDA T0OA LOAD FIRST WORD OF INSTRUCTION CPB COM. IN COMMON? ADA K2 YES, SET BIT 2 OF FIRST WORD ON. STA T0OA UPDATE INSTRUCTION. LDB F.IM DOES OPERAND HOLD CPB ADDR ARRAY ELEMENT ADDRESS? JMP OA05 YES GO CHECK IF DEF * * OUTPUT THE CODE. * OA07 LDB F.AF (IN CASE ARRAY NAME) LDA F.IU IS OPERAND CPA ARR AN ARRAY NAME? JMP OA02 YES, OUTPUT INSTR. WITH RPL * OA015 LDB F.A NO, OUTPUT THE ADB KK01 INSTRUCTION WITH (B) _ F.A,I OA02 LDA T0OA JSB OMR.F JMP OA.F,I * * ADDRESS TEMP. TRY TO DEFINE IN-LINE. * OA05 XOR KK01 ADD THE SIGN BIT. STA T0OA & SET NEW INSTRUCTION. LDB F.NIT (TO CHECK FOR INHIBITION OF INLINE) CPA KK01 IS IT 'DEF TEMP,I' ? SZB AND INHIBIT FLAG CLEAR ? JMP OA07 NO. LEAVE IT ALONE. * JSB DL.F SET F.AT TO REL LDA F.LLO GET THE CURRENT LOAD ADDRESS SSA,RSS IF DIRECT ADA ADON GET THE ACTUAL ADDRESS JSB DAF.F DEFINE ADDRESS OF ADCON LDA F.LLO GET THE BASE ADDRESS AGAIN LDB ADON IF A SYMBOL TABLE POINTER SSA,RSS THEN WE MUST CLB (NO USE ZERO) LDA F.A INCLUE THE OFFSET ADA K2 SET THE NAME STB A,I IN THE A.T. JMP OA015 GO SEND IT SKP * EXTERNAL REF. * OA03 LDB F.A F.IU IS SUBPROG; GEN. EXT. REF. INB (B) POINTS TO AF FOR JSB GETEX GET EXT NO FOR IT JMP OA015 GO SEND * * LABELLED COMMON REF. * OA10 LDB F.AF LABELED COMMON REF. INB GET INFO. ENTRY ADDRESS LDA B,I GET OFFSET ADA F.C ADD THE THE CURRENT OFFSET STA F.C AND SAVE IT INB GET ADDRESS OF LDB B,I THE EXT NO INB AND JSB GETEX GO SET IT UP ADB N1PS SUBTRACT ONE AND ADD THE SIGN LDA T0OA AND THE INSTRUCTION JSB OW.F PUT OUT A R111 OCT 160000 R=111 3- WORD EXT WITH OFFSET JMP OA.F,I RETURN * T0OA NOP F.NIT NOP NO-INLINE-TEMPS FLAG. COM. OCT 4000 F.AT=COM C2000 OCT 175777 COMPLEMENT OF 2000 (THE CURRENT PAGE BIT) K1 DEC 1 DUM OCT 5000 AT = 5 DIM OCT 6000 AT = 6 SUB OCT 200 IU = 1 ARR OCT 600 IU = 3 K2 DEC 2 KM1 DEC -1 B10 OCT 10 BCOM OCT 3000 F.AT=BCOM SIGN DEF 0,I NT=1,IM=0 => A DEF ENTRY SKP * ****************************** * * CHECK FOR DATA WITH OFFSET * * ****************************** SPC 1 * INPUT: (B)=CANDIDATE F.A * OUTPUT: (B)=UPDATED F.A; IF DATA WITH OFFSET, F.C UPDATED. SPC 1 CDO.F NOP LDA B,I FIRST WORD. AND NT&IU F.NT & F.IU CPA DPO DATA PLUS OFFSET ? RSS JMP CDO.F,I NO, EXIT. ADB K2 YES. ADD OFFSET TO F.C LDA B,I ADA F.C STA F.C ADB KM1 SET (B) TO F.A OF MASTER. LDB B,I JMP CDO.F,I SPC 2 * *********************** * * GET EXT ID FROM TBL * * *********************** * * GETEX NOP GET00 LDA B,I GET THE CURRENT VALUE CMA,INA,SZA IF NON-ZERO THATS ALL THERE IS TO IT JMP GETEX,I JUST RETURN IT * ISZ F.XID ALLOCATE A NEW EXT LDA F.XID AND CMA,INA SET ITS NEGATIVE STA B,I IN THE TABLE JMP GET00 GO SET IT AND EXIT SKP * *********************** * * STORE AND OUTPUT OA * * *********************** SPC 1 SOA.F NOP STB F.A SAVE IT JSB OA.F JMP SOA.F,I SPC 2 * ************************ * * OUTPUT ABSOLUTE DATA * * ************************ SPC 1 OAD.F NOP JSB OW.F OUTPUT THE INSTRUCTION OCT 0 R=0 FOR ABSOLUTE DATA (OCT WORD) JMP OAD.F,I RETURN A=0, E=1 SPC 2 * ******************************* * * OUTPUT ABSOLUTE INSTRUCTION * * ******************************* SPC 1 OAI.F NOP JSB OW.F OCT 060000 R011 FOR MNEMONIC OPCODE JMP OAI.F,I RETURN A=0, E=1 SPC 2 * **************************************** * * OUTPUT ABSOLUTE REGISTER INSTRUCTION * * **************************************** SPC 1 ORI.F NOP ALF,RAL MOVE BIT 11 TO BIT 0. IOR F.RES INSERT A/B BIT. ALF,ALF RESTORE. ALF,RAR JSB OAI.F NOW OUTPUT. JMP ORI.F,I DONE. SKP * *************************************** * * OUTPUT MEMORY REFERENCE INSTRUCTION * * *************************************** SPC 1 OMR.F NOP JSB OW.F OUTPUT INSTRUCTION R101 OCT 120000 R=5 FOR MEMORY REFERENCE LDB T1OW GET THE ADDRESS ADB K8 ALLOW A NEGATIVE OFFSET OF 8 SSB,RSS IF NOT AN A.T. REF JMP OMR.F,I JUST RETURN * ADB KK03 RESTORE THE ADDRESS TO B LDA B,I SET THE USED BIT IOR B10 IN THE A.T. STA B,I AND THEN CLA JMP OMR.F,I RETURN SPC 2 * *************************************** * * OUTPUT INSTRUCTION WITH DOT-OPERAND * * *************************************** SPC 1 OID.F NOP STA T1OID SAVE THE INSTRUCTION. ADB F.D.T GET ADDRESS TO B JSB GETEX GET THE EXT ID IOR T1OID ADD THE INSTRUCTION. JSB OW.F SEND IT KK01 OCT 100000 JMP OID.F,I AND RETURN * T1OID NOP SAVED INSTRUCTION CODE. SPC 2 * *********************** * * OUTPUT DOT FUNCTION * * *********************** SPC 1 ODF.F NOP LDA JSBI JUST JSB TO IT. JSB OID.F SEND IT JMP ODF.F,I AND RETURN SPC 2 * ****************************** * * OUTPUT DEF TO DOT FUNCTION * * ****************************** SPC 1 ODD.F NOP CLA A=0 FOR DEF. JSB OID.F SEND IT. JMP ODD.F,I EXIT. SKP * ******************************************** * * PRODUCE THE DEF DESCRIBED BY CURRENT F.A * * ******************************************** * * PDF.F NOP LDA F.RPL DEFINE ITS ADDRESS JSB DAF.F AS THE CURRENT ADDRESS LDB F.AT WHERE IS IT CPB BCOMI LABELED COM? JMP PDF03 YES DO SPECIAL * CLA NO SET FOR DEF CPB COM IN COMMON? LDA K2 YES SET MR LDB F.A INDEX ADB K2 INTO THE ENTRY LDB B,I AND GET THE ADDRESS JSB OMR.F OUTPUT THE WORD PDF02 LDA F.A,I SET THE R FLAG IOR B20 TO SHOW STA F.A,I IT WAS DONE JMP PDF.F,I AND RETURN * PDF03 LDB F.A LABELED COMMON REFERENCE ADB K2 GET THE LDA B,I OFFSET AND STA F.C SET UP INB GET THE LDB B,I ADDRESS OF THE MASTER JSB CDO.F IF DATA WITH OFFSET, FIX THAT. INB INDEX TO THE EXT WORD. JSB GETEX GET THE EXT NO ADB N1PS ADD THE SIGN BIT AND SUBTRACT ONE CLA SET INSTRUCTION TO DEF JSB OW.F SEND IT OCT 160000 MAKE SURE IT IS WITH OFFSET JMP PDF02 GO SEND IT * * K8 DEC 8 F.C NOP B20 OCT 20 COM OCT 4000 F.AT=COM BCOMI OCT 7000 F.AT=BCOMI N1PS OCT 77777 -1+100000B KK03 OCT 77770 -8-100000B JSBI OCT 16000 SKP * *************************** * * OUTPUT LOAD ADDRESS=RPL * * *************************** SPC 1 OLR.F NOP CLB LDA F.RPL JSB OW.F R001 OCT 20000 R=1 JMP OLR.F,I RETURN A=0, E=1 SPC 2 * *************** * * OUTPUT ZREL * * *************** SPC 1 OZ.F NOP OUTPUT COMMAND OF FORM 'OP *+N' ADB ADON ADD CURRENT DISPLACEMENT ADB F.C NOT CURRENTLY NEEDED BUT FEEL FREE STB F.C SET THE TOTAL DISPLACEMENT LDB F.LLO GET THE BASE ADDRESS JSB OMR.F OUTPUT INSTR. (A) HAS OP IN IT JMP OZ.F,I SPC 2 * ******************* * * OUTPUT CONSTANT * * ******************* SPC 1 OC.F NOP OUTPUT INT,REA,LOG,CPX, OR DBL LDA F.D0+1 CONSTANT. CMA,INA STA T0OC -LENGTH OF CONST LDA F.DID 1ST LOC OF F.IDI STA T1OC OC01 LDA T1OC,I JSB OAD.F OUTPUT WORD ISZ T1OC ISZ T0OC JMP OC01 NOT DONE; OUTPUT MORE WORDS. JMP OC.F,I RETURN A=0, E=1 * T0OC NOP T1OC NOP SKP * *************** * * OUTPUT WORD * * *************** SPC 1 * INPUT: (A)=WORD TO BE OUTPUT * (B)=2ND WORD IF MR * (F.C)=OFFSET IF R=111 OR IF R=101 AND F.C#0 * THEN: JSB OW.F * VFD 3/R,13/0 * WHERE R = RELOCATION INDICATOR IN HIGH ORDER (-1 IF SRC) * * THE VALUES OF 'R' AND THEIR MEANINGS ARE: * * R=000 OCTAL DATA. * R=001 ORG TO (B). * R=010 ASCII DATA. * R=011 ABSOLUTE INSTRUCTION. * R=100 EXTERNAL, EXT ID IN LOW BITS. * R=101 MEM REF INSTRUCTION TO (B). * R=110 BYTE DEF; A<15>=LSB, (B)=WORD ADDR. * R=111 EXTERNAL (B) WITH OFFSET (F.C). * * SET UP WORD TO OUTPUT AND RELOCATION INDICATOR. * IF R=1,5,7 THEN SET UP ADDRESS. * OW.F NOP STA T0OW SAVE (A) STB T1OW SAVE (B), JUST IN CASE. LDA OW.F,I (A)=RELOCATION INDICATOR. ISZ OW.F STA R SAVE 'R'; SEE IF ADDRESS IN (B). CPA R001 R=1,5,7 ? RSS CPA R101 RSS CPA R111 RSS JMP OW01 NO. IGNORE (B). (OR BYTE ADDR) * STB T1OW YES, SET AS TENTATIVE ADDR. ADB K8 A.T. REF ? SSB,RSS JMP OW01 NO. * ADB KK03 YES. RESTORE & REMOVE BIT 15. JSB CDO.F HANDLE DATA WITH OFFSET. ADB SIGN PUT BIT 15 BACK, STB T1OW AND SET AS ADDRESS. SKP * IF R=5 & F.C#0, CHANGE R TO 7. * OW01 LDB R (B)=R. LDA F.C (A)=OFFSET. CPB R101 IF R=5, NORMAL MEM REF, SZA,RSS AND OFFSET#0, RSS (NO. LEAVE IT) LDB R111 THEN SET TO OFFSET TYPE. STB R (IN CASE CHANGED) * * IF NEW RECORD (E.G. INIT) THEN START IT UP. * CPB R001 IS THIS A NEW LOAD LOC? JMP OWS41 YES * CLB,INB IF A NEW RECORD CPB F.BUF THEN JMP OW07 GO SET IT UP * * SEE IF ENOUGH ROOM IN CURRENT RECORD. * LDA KM63 DETERMINE ROOM IN PRESENT SECTOR ADA F.BUF ADD CURRENT USAGE LDB R ADD TO PRIOR DATA RECORD. CPB R111 IF OFSET INA,RSS ADD TWO CPB R101 MEM REF? RSS CPB R110 OR BYTE ADDR ? INA YES. NEEDS EXTRA WORD. LDB RNO ADB KM5. SSB,RSS NEW BYTE WORD NEEDED? INA YES. ALLOW FOR IT SSA,RSS ROOM FOR THESE WORDS? JMP OW06 NO. USE NEW RECORD. * * IT FITS. BUT MAY STILL NEED NEW R-WORD. * SSB,RSS BYTE WORD FULL? JMP OW16 YES. START NEW BYTE WORD JMP OW17 USE PRESENT ONE * * START A NEW RECORD. * OW06 JSB OS.F FULL. OUTPUT RECORD OW07 LDA F.LLO LOAD LOCATION JSB WR SEND IT LDA ADON ADD-ON JSB WR SEND IT SKP * START A NEW RELOCATION INDICATOR WORD. * OW16 LDA PBPT START NEW BYTE WORD. STA RPTR SAVE ITS LOCATION CLA STA RNO JSB WR SEND A ZERO * * INSERT RELOCATION INDICATOR. * OW17 LDB RNO REL BYTE NO. BLS ADB RNO 3*RNO LDA R RECORD TYPE BYTE CMB,RSS RAR POSITION R-BYTE INB,SZB SHIFT COMPLETE? JMP *-2 NO IOR RPTR,I STA RPTR,I COMBINE PRIOR BYTE WORD ISZ RNO BUMP THE COUNT. * * BUMP LOCATION COUNTER & CHECK FOR OFL. * ISZ ADON ADON=ADON+1 ISZ F.RPL RPL=RPL+1 LDB F.RPL LDA K84 OVERFLOW CODE SSB OVERFLOW?? JMP F.ABT RPL OVERFLOW * * OUTPUT THE CODE. * LDA T0OW JSB WR SEND THE WORD LDB R LDA T1OW GET WORD TWO CPB R101 MEMORY REFERENCE? RSS CPB R110 OR BYTE ADDR ? RSS CPB R111 OR OFFSET TYPE? JSB WR SEND IT IN THIS CASE ALSO LDA F.C GET OFFSET CPB R111 OFFSET TYPE JSB WR YES SEND THE OFFSET CLA,CCE CLEAR A AND STA F.C F.C JMP OW.F,I RETURN A=0, E=1 SKP * ORG. * OWS41 LDA T0OW ELSE SET UP STA F.LLO THE NEW ADDRESS LDA T1OW AND STA ADON OFFSET JSB OS.F FLUSH THE CURRENT RECORD JMP OW.F,I AND RETURN (A=0, E=1) * WR NOP WRITE WORD AND PUSH POINTERS STA PBPT,I ISZ PBPT ISZ F.BUF JMP WR,I RETURN * F.LLO NOP LOAD LOCATION ADON NOP ADD-ON TO LOAD LOCATION PBPT NOP PBUF WORD POINTER RPTR NOP RECORD R1R2R3R4R5 LOCATION RNO NOP R NUMBER KM5. DEC -5 T0OW NOP SAVE ENTRY (A) T1OW NOP SAVE ENTRY (B) R NOP INTERMEDIATE CODE RECORD TYPE KM63 DEC -63 R110 OCT 140000 K84 DEC 84 NT&IU OCT 000601 MASK F.NT & F.IU DPO EQU NT&IU F.NT=1 & F.IU=ARR SKP * ***************** * * OUTPUT SECTOR * * ***************** SPC 1 OS.F NOP CLB,INB IF EMPTY RECORD CPB F.BUF JUST JMP OS.F,I RETURN * LDB OWK1 STB PBPT RESET PBUF POINTER JSB WRT.C OUTPUT BUFFER TO DISC DEF C.SC0 OWK1 DEF F.BUF DEF F.BUF FIRST WORD IS THE TRUE LENGTH JMP PASER IF NO ERROR RETURN * CLA,CCE SET BUFFER TO POINT TO NEXT WD JSB WR AND COUNT TO ONE JMP OS.F,I RETURN A=0, E=1 * PASER LDA K99 SEND PASS WRITE BOOM JMP F.ABT NO RETURN SPC 1 K99 DEC 99 * IN2.F NOP INIT CODE FOR THIS MODULE LDA OWK1 REMOVE THE INDIRECT RAL,CLE,SLA,ERA IF SET LDA A,I GET THE REAL ADDRESS STA OWK1 ON THE BUFFER ADDRESS STA PBPT CLA SET COUNT TO 1 AND PUSH THE POINTER. JSB WR JMP IN2.F,I RETURN * F.BUF BSS 65 BUFFER FOR WRITING TO PASS FILE. * END