*** EXECUTE THE PROGRAM * * ** *** INITIALIZE FOR OUTPUT ** ** XEC CLA SET COUNTER FOR STA TYPE CHARACTERS OUTPUTTED STA XH INITIALIZE INA RANDOM STA XL VARIABLE ** *** INITIALIZE THE DATA POINTER ** ** CCA STA DCCNT -NO STA DSTRT DATA- LDB PBUFF CONDITION STB NXTDT LDA ADATA,I SEARCH JSB STSRH DATA STAREMENT JMP XEC2 STB DSTRT SAVE STATEMENT LOCATION JSB SETDP SET DATA POINTER ** *** INITIALIZE STACK POINTERS ** ** XEC2 LDB SYMTF INITIALIZE STB HSTPT POINTERS TO LDB FCORE -HIGH CORE- STACK, STB TSTPT -TEMPORARY- ADB .23 STB LSTAK STB LSTPT STACK CMB ADB HSTPT SSB JMP E1 CLA,INA SET EXECUTION FLAG=1 JSB SEXU,I LDB PBUFF BEGIN JMP XEC5 EXECUTION ** *** FIND NEXT STATEMENT TO BE EXECUTED ** ** XEC4 JMP MONIT,I XEC4. LDA NXTST NEXT STATEMENT NUMBER LDB PRADD PROSPECTIVE ADDRESS CPA 1,I DESIRED STATEMENT? JMP XEC6 YES LDB PBUFF NO, FIND JSB FNDPA,I NOP NON-EXISTENT JSB ERROR STATEMENT XEC5 LDA 1,I SAVE NEW XEC6 STA .LNUM SEQUENCE NUMBER ** *** SET SUCCESSOR STATEMENT ** ** JSB FLWST AND OPMSK EXTRACT STATEMENT TYPE ALF,ALF POSITION RAR IT ADA XECBR COMPUTE EXEXUTION ADDRESS JMP 0,I BRANCH TO EXECUTION ADDRESS ** *** EVALUATE FORMULA AND RETURN RESULT ** ** FETCH NOP LDB FETCH STB STK3 JSB FORMA,I EVALUATE FORMULA JSB OPCHK ISZ HSTPT UNSTACK RESULT ADDRESS LDA 1,I LOAD (A) WITH HIGH MANTISSA INB LOAD LOW PART LDB 1,I OF RESULT INTO (B) JMP STK3,I ** *** SET POINTER TO START OF DATA STATEMENT ** ** SETDP NOP STATEMENT ADDRESS IN (B) INB LOAD LDA 1,I STATEMENT LENGTH CMA,INA SET INA DATA COUNTER STA DCCNT TO 1-STATEMENT LENGTH INB SET -NEXT DATA- POINTER ONE STB NXTDT WORD ABOVE FIRST CONSTANT JMP SETDP,I ** *** SEARCH FOR STATEMENT OF GIVEN TYPE ** ** STSRH NOP TYPE IN (A), ADDRESS IN (B) AND OPMSK EXTRACT STA TEMP4 STATEMENT TYPE STSR1 LDA 1 EXTRACT ADA .2 PROGRAM LDA A,I AND OPMSK TYPE CPA TEMP4 DESIRED TYPE? JMP STSR2 YES LDA 1 NO, FETCH INA STATEMENT LENGTH ADB 0,I CPB PBPTR PAST LAST STATEMENT? JMP STSRH,I YES JMP STSR1 NO STSR2 ISZ STSRH JMP STSRH,I ** *** FETCH A DATA ITEM ** ** FDATA NOP FDAT1 ISZ DCCNT MORE DATA? JMP FDAT2 YES LDA ADATA,I NO, SEARCH LDB NXTDT FOR NEXT JSB STSRH JSB ERROR NONE FOUND E4 JSB SETDP INITIALIZE THE JMP FDAT1 DATA POINTERS FDAT2 ISZ DCCNT UPDATE ISZ DCCNT POINTER ISZ NXTDT LDA NXTDT,I LOAD ISZ NXTDT DATA LDB NXTDT,I ITEM ISZ NXTDT UPDATE POINTER JMP FDATA,I ** *** SET FOR FOLLOWING STATEMENT ** ** FLWST NOP (B) HOLDS PRESENT ADDRESS LDA 1 COMPUTE INA ADDRESS LDA 0,I ADA 1 NEXT STA PRADD STATEMENT LDA 0,I RECORD THE STA NXTST SEQUENCE NUMBER ADB .2 FETCH STB TEMPS FIRST WORD LDA 1,I OF CURRENT JMP FLWST,I STATEMENT ** *** SEARCH STACK FOR GIVEN FOR-VARIABLE ** ** FVSRH NOP LDA TEMPS,I FETCH AND MSK1 FOR-VARIABLE STA STK2 JSB SSYMA,I INB SYMBOL TABLE LDA HSTPT STA TEMP3 STACK TOP FVSR1 CPA SYMTF STACK BOTTOM? JMP FVSRH,I YES, EXIT VIA (P.1) CPB 0,I JMP FVSR2 YES ADA .6 NO, MOVE TO JMP FVSR1 NEXT STACK ENTRY FVSR2 ISZ FVSRH EXIT JMP FVSRH,I VIA (P.2) * *** EXECUTE LET * ELET JSB FORMA,I JMP XEC4 ** *** EXECUTE GOTO ** EGOTO INB LOAD SEQUENCE LDA 1,I NUMBER STA NXTST RECORD FOR EXECUTION JMP XEC4 RETURN TO MONITOR * *** EXECUTE IF * EIF JSB FETCA,I FETCH VALUE OF FORMULA SZA,RSS RESULTANT TRUE? JMP XEC4 NO ISZ TEMPS YES, BRANCH TO LDB TEMPS FOLLOWING JMP EGOTO SEQUENCE NUMBER * *** EXECUTE FOR * EFOR JSB FVSRH FOR-VARIABLE ALREADY IN STACK? JMP EFOR1 NO STA TEMP2 YES, SAVE SOURCE ADDRESS ADA .6 SAVE STA TEMP4 DESTINATION ADDRESS STB TEMP1 SAVE FOR-VARIABLE ADDRESS JSB MVTOH COMPRESS STACK LDB TEMP1 RESTORE FOR-VARIABLE ADDRESS CLA,RSS EFOR1 LDA M6 TOP OF ADA HSTPT FOR-STACK STA HSTPT POINTER STA TEMP1 CMA,INA STACK ADA LSTPT SSA,RSS OVERFLOW? JMP E1 YES STB TEMP1,I NO, RECORD FOR-VARIABLE ADDRESS JSB FORMA,I INITIALIZE FOR-VARIABLE ISZ TEMPS ISZ TEMP1 SAVE LDA TEMP1 LIMIT STA ENEX2 ADDRESS JSB FETCA,I FETCH STA TEMP1,I AND ISZ TEMP1 STORE STB TEMP1,I LIMIT ISZ TEMP1 LDB M2 SET FOR STEP SIZE STB FDATA SIGN CHECK LDA TEMPS,I SZA JMP EFOR2 FOUND LDA HONE NOT FOUND, LDB .2 DEFAULT RSS IS 1.0 EFOR2 JSB FETCA,I SSA STEP SIZE NEGATIVE? ISZ FDATA YES STA TEMP1,I SAVE ISZ TEMP1 SET POINTER STB TEMP1,I SIZE ISZ TEMP1 STEP LDA NXTST TO STATEMENT STA TEMP1,I FOLLOWING THE FOR EFOR3 LDA ANEXT,I FIND LDB PRADD -NEXT- JSB STSRH STATEMENT NOP JSB FLWST FIND FOLLOWING STATEMENT AND MSK1 SAME CPA STK2 RSS YES JMP EFOR3 NO LDB HSTPT,I LOAD LDA 1,I VALUE INB OF LDB 1,I FOR-VARIABLE JMP ENEX2-1 CHECK ACCEPTABILITY * *** EXECUTE NEXT * ENEXT JSB FVSRH FIND CORRESPONDING STACK ENTRY JMP XEC4 NONE PRESENT STA HSTPT RESET TOP OF STACK STB ENEX1 INA SAVE LIMIT STA ENEX2 ADDRESS ADA .2 SAVE STEP SIZE STA TEMP1 ADDRESS LDB M2 SET STEP SIZE STB FDATA SIGN CHECK LDA TEMP1,I LOAD ISZ TEMP1 STEP LDB TEMP1,I ISZ TEMP1 SSA CHECK ISZ FDATA SIGN JSB .FAD INCREMENT ENEX1 NOP FOR-VARIABLE STA ENEX1,I ISZ ENEX1 SAVE STB ENEX1,I VALUE JSB .FSB COMPUTE FOR-VARIABLE-LIMIT ENEX2 NOP ISZ FDATA POSITIVE STEP SIZE? ELA YES, COMPLEMENT SIGN SSA NO, NON-NEGATIVE RESULT? JMP ENEX3 NO LDA TEMP1,I YES,GO TO FIRST STA NXTST JMP XEC4 ENEX3 LDA HSTPT FAILS, ADA .6 ERASE STA HSTPT STACK JMP XEC4 * *** EXECUTE GOSUB * EGOSB INB LOAD (A) WITH LDA 1,I SEQUENCE NUMBER LDB NXTST LOAD (B) WITH STA NXTST RETURN SEQUENCE NUMBER JSB SLWST STACK RETURN ON LOW-CORE STACK ADA M10 GOSUBS NESTED CPA LSTAK JSB ERROR YES E2 JMP XEC4 NO * *** EXECUTE RETURN * ERTRN LDB LSTPT RETURN STACK CPB LSTAK EMPTY? JSB ERROR YES E3 LDA LSTPT,I NO, LOAD RETURN ADDRESS STA NXTST STORE FOR EXECUTION ADB M1 RESET STB LSTPT STACK POINTER JMP XEC4 RETURN TO THE MONITOR * *** EXECUTE READ * EREAD CPB PRADD END-OF-STATEMENT? JMP XEC4 YES JSB FORMA,I NO, EVALUATE NEXT ADDRESS LDA HSTPT,I RECORD STA STK4 JSB FDATA STA STK4,I ISZ STK4 STB STK4,I ISZ HSTPT LDB TEMPS INB JMP EREAD ** *** INITIALIZE FOR PRINT ** ** PRNIN NOP CLA JSB SEXU,I CCA INITIALIZE ADA .BUFA BUFFER STA BADDR POINTER LDA TYPE INITIALIZE CMA,INA -CHARACTERS OUTPUTTED- STA CCNT COUNTER SLA,RSS START ON ODD CHARACTER POSITION? JMP PRNIN,I NO ADA M1 YES, BIAS STA CCNT COUNTER CLA OUTPUT A JSB OUTCR NULL CHARACTER JMP PRNIN,I * *** EXECUTE PRINT * EPRIN JSB PRNIN SET FOR PRINT CLA JMP EPRI1+1 EPRI0 CLA CPA EOL JSB EDELM EPRI1 CCA STA EOL LDA TEMPS,I AND OPDMK SZA JMP EPRI3 EPRI2 ISZ TEMPS LDB TEMPS CPB PRADD JMP EPRI7 LDA TEMPS,I AND OPMSK CPA B2000 JMP EPRI0 CPA B3000 NO, SEMICOLON? JMP EPRI1 CPA B1000 NO, QUOTE? JMP EPRI4 YES CCA ADA TEMPS STA TEMPS EPRI3 CCA STA EOL CLA,INA JSB SEXU,I JSB FETCA,I STA ENOUT CLA JSB SEXU,I LDA ENOUT ISZ EOL JMP EPRI2 JSB ENOUT JMP EPRI2 EPRI4 CLA STA EOL STA STK5 STA STK4 EPRI5 LDA 1,I AND MSK0 SZA,RSS JMP EPRI6 ISZ STK4 INB QUOTE LDA 1,I AND OPMSK CPA B1000 JMP EPRI6 ISZ STK4 JMP EPRI5 EPRI6 LDB STK4 ADB CCNT WILL LINE ADB M73 SSB,RSS CHARACTERS? JSB OUTLN YES, GET FRESH LINE JSB OUTSA,I OUTPUT STRING JMP EPRI1+2 EPRI7 ISZ EOL JMP EPRI8 LDB TYPE CMB,INB CHARACTERS OUTPUTTED LDA CCNT LOAD LINE LENGTH CMA,INA SAVE NEW COUNT OF STA TYPE CHARACTERS OUTPUTTED ADA 1 COMPUTE CHARACTERS NOT YET OUT SLB CORRECT FOR START ON ADA M1 ODD PRINT POSITION LDB .BUFA OUTPUT SZA JSB WRITE,I RSS EPRI8 JSB OUTLN CLA,INA SET EXU FLAG JSB SEXU,I TO EXECUTION MODE JMP XEC4 ** *** TAB TELEPRINTER ** ** ETAB JSB IENTA,I JMP ETAB1 CLB STB EOL ADA M72 EXCEED SSA,RSS 72? JMP ETAB1 YES CMA,INA NO, COMPUTE ADA M72 BLANKS? ADA CCNT REQUIRED SSA,RSS ANY? JMP FR12A,I STA STK4 LDA .32 OUTPUT JSB OUTCR REQUIRED ISZ STK4 JMP *-3 OF BLANKS JMP FR12A,I ETAB1 CLA JSB SEXU,I JSB OUTLN CLA,INA JSB SEXU,I JMP FR12A,I IENTA DEF .IENT * *** EXECUTE INPUT * EINP1 INA,SZA JSB DRQSA,I EINP2 JSB CONST JMP EINP1 LDB TEMPS INB CPB PRADD JMP EINP3 CPA .10 JMP *+4 JMP *+4 EINPT CLA JSB SEXU,I JSB DRQSA,I JSB FORMA,I CCA ADA HSTPT,I ISZ HSTPT STA SBPTR JMP EINP2 EINP3 CLA STA TYPE CLA,INA JSB SEXU,I JMP XEC4 ** *** EXIT FORMULA ON EMPTY STACK ** ** DEF FORM&,I ** *** EXECUTE RESTORE ** ERSTR LDB DSTRT GET FIRST DATA STATEMENT ADDRESS CPB M1 IMPOSSIBLE ADDRESS? JMP XEC4 YES, DONE JSB SETDP NO, SET DATA POINTER JMP XEC4 DONE ** *** FORMULA OPERATOR JUMP TABLE ** ** AROTB DEF ESCMA SUBSCRIPT SEPARATOR DEF ESTR ASSIGNMENT OPERATOR DEF EFAD '+' DEF EFSB '-' DEF EFMP '*' DEF EFDV '/' DEF EPWR '^' DEF EGTRT '>' DEF ELST '<' DEF ENEQL '#' DEF EEQL '=' DEF EUMIN UNARY '-' DEF ELBRC '[' DEF FOR1A,I '(' DEF FOR0B,I UNARY '+' DEF EOR OR DEF EAND AND DEF ENOT NOT DEF EGORE '>=' DEF ELORE '<=' ** *** EXECUTE A BINARY OPERATOR ** ** BINOP NOP SAVE LDA BINOP,I SUBROUTINE STA BINO1 CALL ISZ BINOP SET RETURN ADDRESS JSB OPCHK SAVE ADDRESS OF STB BINO2 TOP OPERAND ISZ HSTPT UNSTACK ADDRESS JSB STTOP LOAD SECOND OPERAND BINO1 NOP PERFORM OPERATION BINO2 NOP ADDRESS OF SECOND OPERAND JMP BINOP,I ** *** EXECUTE SUBSCROPT COMMA ** ** ESCMA JSB ESBS INTEGERIZE COLUMN SUBSCRIPT ISZ LSTPT JSB ESBS INTEGERIZE ROW SUBSCRIPT LDB HSTPT,I FETCH ADB .2 SUBSCRIPT LDA 1,I BOUNDS AND MSK0 SAVE STA STK4 LDA 1,I EXTRACT ALF,ALF ROW AND MSK0 BOUND CMA,INA ACTUAL ADA LSTPT,I ROW SUBSCRIPT SSA,RSS LEGAL? JMP E6-1 NO LDA STK4 CPA .1 COLUMN MATRIX? JMP ESCM1 YES JSB MPY NO, COMPUTE ADDRESS DEF LSTPT,I DISPLACEMENT RSS DUE TO ROWS ESCM1 LDA LSTPT,I CCB UNSTACK ADB LSTPT ROW STB LSTPT SUBSCRIPT LDB STK4 CMB,INB COLUMN ADB LSTPT,I SUBSCRIPT SSB,RSS LEGAL? JSB ERROR NO E6 ADA LSTPT,I YES, ADD IN COLUMN DISPLACEMENT ALS DOUBLE DISPLACEMENT LDB HSTPT,I COMPUTE ADA 1,I ACTUAL STA HSTPT,I ADDRESS LDB LSTPT UNSTACK ADB M1 STB LSTPT I JMP FOR1A,I ** *** INTERGERIZE A SUBSCRIPT ** ** ESBS NOP JSB OPCHK VALIDATE SUBSCRIPT LDA 1,I FETCH INB SUBSCRIPT LDB 1,I JSB SBFIX INTEGERIZE STB LSTPT,I ISZ HSTPT POP OPERAND STACK JMP ESBS,I ** *** EXECUTE STORE ** ** ESTR LDB TEMPS+7 IS NEXT OPERATOR SZB AN END-OF-FORMULA? JMP FOR1B,I NO, DEFER STORE CPB TEMPS+6 YES, FIRST STORE OPERATOR USED? JMP ESTR2 YES ESTR1 LDA HSTPT,I SET STA TEMPS+9 DESTINATION LDA TEMPS+6 SOURCE ADDRESS IN (A) LDB 0,I TRANSFER HIGH STB TEMPS+9,I PART OF SOURCE ISZ TEMPS+9 UPDATE INA POINTERS LDB 0,I TRANSFER LOW STB TEMPS+9,I PART OF SOURCE ISZ HSTPT POP STACK JMP FOR0B,I ESTR2 JSB OPCHK SAVE ADDRESS STB TEMPS+6 OF QUANTITY ISZ HSTPT YES, POP HIGH-CORE JMP ESTR1 STACK AND EXECUTE STORE ** *** CALL ADD ** ** EFAD JSB BINOP JSB .FAD JMP FOR0A,I ** *** CALL SUBTRACT ** ** EFSB JSB BINOP JSB .FSB JMP FOR0A,I ** *** CALL MULTIPLY ** ** EFMP JSB BINOP JSB .FMP JMP FOR0A,I ** *** CALL DIVIDE ** ** EFDV JSB BINOP JSB .FDV JMP FOR0A,I ** *** EXECUTE ^ *** ** EPWR LDB HSTPT,I LOAD LDA 1,I INB POWER LDB 1,I JSB IFIX JMP *+3 SOS INTEGER? JMP EPWR1 YES JSB BINOP NO JMP RPWR RPWR JSB PCHK CHECK ARGUMENTS SSA NEGATIVE BASE? JSB ERROR YES BASER EQU * LDB BINO1 NO, LOAD BASE JSB .LOGA,I TAKE NATURAL LOG JSB .FMP MULTIPLY DEF BINO2,I BY POWER JSB .EXPA,I EXPONENTIATE JMP FOR0A,I RESULT EPWR1 STB TT1 SSB CMB,INB STB TT2 JSB BINOP JMP IPWR IPWR JSB PCHK CHECK ARGUMENTS LDB BINO1 STORE STA BINO1 STB BINO2 BASE LDA HONE INITIALIZE STA TT3 RESULT LDA .2 TO STA TT4 1.0 IPWR1 LDB TT2 DIVIDE POWER SLB,BRS BY 2 JMP IPWR3 WAS ODD STB TT2 WAS EVEN IPWR2 SZB ZERO? JMP IPWR4 NO LDA TT1 YES SSA POSITIVE POWER? JMP IPWR5 NO LDA TT3 YES, LOAD LDB TT4 RESULT JMP FOR0A,I IPWR5 LDA HONE LOAD LDB .2 1.0 JSB .FDV DIVIDE BY DEF TT3 RESULT JMP FOR0A,I IPWR3 STB TT2 SAVE POWER LDA BINO1 LOAD LDB BINO2 BASE JSB .FMP MULTIPLY BY DEF TT3 RESULT-SO-FAR STA TT3 SAVE PARTIAL STB TT4 LDB TT2 LOAD POWER JMP IPWR2 IPWR4 LDA BINO1 LOAD LDB BINO2 BASE JSB .FMP SQUARE DEF BINO1 IT STA BINO1 SAVE STB BINO2 RESULT JMP IPWR1 ** *** INSURE VALID OPERATION ** ** PCHK NOP STB BINO1 LOAD LDB BINO2,I POWER SZA BASE ZERO? JMP PCHK1 NO SZB,RSS YES, POWER ZERO? JSB ERROR YES POWER EQU * SSB,RSS NO, POWER POSITIVE? JMP FALSE YES JSB ERROR NO ZRTNG LDA INF USE POSITIVE LDB M2 INFINITY JMP FOR0A,I PCHK1 SZB,RSS POWER ZERO? JMP TRUE YES, RETURN 1,0 JMP PCHK,I NO ** ** EXECUTE > ** ** EGTRT JSB BINOP COMPUTE OPERAND JSB .FSB DIFFERENCE SSA NEGATIVE? JMP FALSE YES JMP ENEQ1 NO ** ** EXECUTE < ** ** ELST JSB BINOP COMPUTE OPERAND JSB .FSB DIFFERENCE SSA NEGATIVE? JMP TRUE YES JMP FALSE NO ** *** EXECUTE = ** ** EEQL JSB BINOP COMPUTE OPERAND JSB .FSB DIFFERENCE EEQL1 SZA ZERO? JMP FALSE NO JMP TRUE YES ** ** EXECUTE >= ** ** EGORE JSB BINOP COMPUTE OPERAND JSB .FSB DIFFERENCE SSA POSITIVE? JMP FALSE NO JMP TRUE YES ** *** EXCUTE <= ** ** ELORE JSB BINOP COMPUTE OPERAND JSB .FSB DIFFERENCE SSA NEGATIVE? JMP TRUE YES JMP EEQL1 NO ** ** EXECUTE # ** ** ENEQL JSB BINOP COMPUTE OPERAND JSB .FSB DIFFERENCE ENEQ1 SZA NON-ZERO? JMP TRUE YES ** *** SET LOGICAL VALUES ** ** FALSE CLA LOAD CLB ZERO JMP FOR0A,I TRUE LDA HONE LOAD LDB .2 ONE JMP FOR0A,I ** *** EXECUTE UNARY - ** ** EUMIN JSB STTOP LOAD NUMBER JSB ARINV NEGATE NUMBER JMP FOR0A,I ** *** EXECUTE LEFT BRACKET ** ** ELBRC ISZ LSTPT LOAD SUBSCRIPT COMMA LDB SCCNT INFORMATION WORD JSB SLWST STACK IT JSB BHSTP STACK JSB RSCHK JMP TRUE 1 ** *** EXECUTE OR ** ** EOR JSB BINOP VALIDATE JMP ORS OPERANDS ORS SZA SECOND OPERAND NON-ZERO? JMP TRUE YES ORS1 LDA BINO2,I NO, CHECK SECOND JMP ENEQ1 OPERAND ** *** EXECUTE AND ** ** EAND JSB BINOP VALIDATE JMP ANDS OPERANDS ANDS SZA,RSS SECOND OPERAND ZERO? JMP FALSE YES JMP ORS1 NO ** *** EXECUTE NOT ** ** ENOT JSB STTOP LOAD OPERAND SZA ZERO? JMP FALSE NO JMP TRUE YES 22255-80014 D