MQA=7501 MQL=7421 SWP=7521 / ############ ######### ######### / ############ ######### ######### / ### ### ### ### ### ### / ### ### ### ### ### ### / ### ### ### ### ### / ### ### ### ### ### / ############ ############### ######### / ############ ############### ######### / ### ### ### ### / ### ### ### ### / ### ### ### ### ### / ### ### ### ### ### / ### ### ### ######### / ### ### ### ######### / / / ######### ######### ### / ######### ######### ### / ### ### ### ### ### / ### ### ### ### ### / ### ### ### ### / ### ### ### ### / ### ############### ### / ### ############### ### / ### ### ### ### / ### ### ### ### / ### ### ### ### ### / ### ### ### ### ### / ######### ### ### ############### / ######### ### ### ############### / / / ######### / ######### / ### ### / ### ### / ### / ### / ######### ######### FROM N.WIRTH / ######### ######### ETH - ZUERICH / ### / ### / ### ### / ### ### / ######### / ######### / / /IMPLEMENTED ON A PDP-8/E COMPUTER WITH 28K-WORDS OF MEMORY /BY /PROF. HEINZ STEGBAUER /HTL-MOEDLING, IN 1979 EJECT P A S C A L - S VERSION=2 /C O R E L A Y O U T : /FIELD 0 0000 - 5777 INTERPRETER / 6000 - 6777 FILE- AND DEVICE BUFFERS / 7000 - 7577 COMPILER (INSYMBOL, NEXTCH) / 7600 - 7777 OS/8 - RESIDENT PART /FIELD 1 0000 - 7577 INTERMEDIATE CODE / 7600 - 7777 OS/8 - RESIDENT PART /FIELD 2 0000 - 3777 SYMBOL-TABLE / 4000 - XXXX STRING-TABLE / XXXX - 6377 CONSTANT-TABLE / 6400 - 7377 ARRAY-TABLE / 7400 - 7777 BLOCK-TABLE /AT COMPILETIME: /FIELD 3 0000 - 3777 NAMES OF SYMBOL-TABLE / 4000 - 7177 FSYS, SET-CONSTANTS, LISTS AND / TABLES, ERROR ROUTINES /FIELD 4 0000 - 6377 COMPILER / 6400 - 7777 AUXILIARY ROUTINES /FIELD 5 0000 - 7777 STACK FOR COMPILER OPERATION /FIELD 6 0000 - 7777 LONG ERROR MESSAGES /AT RUNTIME: /FIELD 3 0000 - 7777 /S T A C K (4K WORDS OF 48 BITS) /FIELD 4 0000 - 7777 /FIELD 5 0000 - 7777 /FIELD 6 0000 - 7777 CODEFIELD=10 TABLEFIELD=20 NAMEFIELD=30 SETFIELD=30 COMPFIELD=40 PUSHFIELD=50 ERRFIELD=60 STACKFIELD=30 /S T R U C T U R E O F T A B L E S : /SYMBOL-TABLE (4 WORDS PER ENTRY, MAX. 512 ENTRIES) /------------ TAB=0000 LINK=TAB /WORD 0, BITS 0-11 OBJ=TAB+1 /WORD 1, BITS 0-5 TYP=TAB+1 /WORD 1, BITS 6-11 REF=TAB+2 /WORD 2, BITS 0-5 NORMAL=TAB+2 /WORD 2, BIT 6 LEV=TAB+2 /WORD 2, BITS 7-11 ADR=TAB+3 /WORD 3, BITS 0-11 /STRING-TABLE (ARRAY[0:N] OF CHAR, 6 BITS/CHAR,FROM 4000 UPWARDS) /------------ /CONSTANT-TABLE (4 WORDS PER ENTRY, FROM 6400 DOWNWARDS) /-------------- /ARRAY-TABLE (8 WORDS PER ENTRY, MAX. 64 ENTRIES) /----------- ATAB=6400 / /WORD 0 UNUSED! INXTYP=ATAB+1 /WORD 1 ELTYP=ATAB+2 /WORD 2 ELREF=ATAB+3 /WORD 3 LOW=ATAB+4 /WORD 4 HIGH=ATAB+5 /WORD 5 ELSIZE=ATAB+6 /WORD 6 SIZE=ATAB+7 /WORD 7 /BLOCK-TABLE (4 WORDS PER ENTRY, MAX. 64 ENTRIES) /----------- BTAB=7400 LAST=BTAB /WORD 0 LASTPAR=BTAB+1 /WORD 1 PSIZE=BTAB+2 /WORD 2 VSIZE=BTAB+3 /WORD 3 /A S S E M B L E R D E F I N I T I O N S: L0001=CLA CLL IAC L0002=CLA STL RTL L0003=CLA STL IAC RAL L0004=CLA CLL IAC RTL L0006=CLA STL IAC RTL L0100=CLA CLL IAC BSW L2000=CLA STL RTR L4000=CLA STL RAR L7777=CLA CLL CMA L7776=CLA CLL CMA RAL L7775=CLA CLL CMA RTL L3777=CLA CLL CMA RAR L5777=CLA CLL CMA RTR /A R I T H M E T I C D E F I N I T I O N S: /MEMORY REFERENCED INSTRUCTIONS: FIXMRI GET=0000 FIXMRI ADD=1000 FIXMRI SUB=2000 FIXMRI MUL=3000 FIXMRI DIV=4000 FIXMRI MOD=5000 /ALSO: JMP=5000 FIXMRI PUT=6000 /OPERATE CLASS INSTRUCTIONS: NORM=7200 /REAL READREAL=7201 WRITEREAL=7202 TRUNC=7203 ROUND=7206 RSQUARE=7205 ZERO=7204 /BOTH TYPES ABSVAL=7000 NEGATE=7004 WRITELINE=7006 READINTEGER=7001 /INTEGER WRITEINTEGER=7002 FLOAT=7003 ISQUARE=7005 /SKIP - INSTRUCTIONS: SKIP=SKP SKEQ=SZA SKNE=SNA SKLT=SMA SKLE=SMA SZA SKGT=SPA SNA SKGE=SPA AAAAAA=JMS I 44 /ENTER MACRO MODE EEEEEE=0000 /RETURN TO PDP8 MODE INT=0177 REAL=7777 /C O M P I L E R D E F I N I T I O N S: DECIMAL /S Y M B O L S: INTCON=0 REALCON=1 CHARCON=2 STRING=3 NOTSY=4 PLUS=5 MINUS=6 TIMES=7 IDIVSY=8 RDIVSY=9 IMODSY=10 ANDSY=11 ORSY=12 EQL=13 NEQ=14 GTR=15 GEQ=16 LSS=17 LEQ=18 LPARENT=19 RPARENT=20 LBRACK=21 RBRACK=22 COMMA=23 SEMICOLON=24 PERIOD=25 COLON=26 BECOMES=27 CONSTSY=28 TYPESY=29 VARSY=30 FUNCTIONSY=31 PROCEDURESY=32 ARRAYSY=33 RECRDSY=34 PROGRAMSY=35 IDENT=36 BEGINSY=37 IFSYM=38 CASESY=39 REPTSY=40 WHILSY=41 FORSY=42 ENDSY=43 ELSESY=44 UNTILSY=45 OFSY=46 DOSY=47 TOSY=48 DOWNTOSY=49 THENSY=50 /O B J E C T S: KONSTANT=0 VARIABLE=1 TYPE1=2 PROZEDURE=3 FUNKTION=4 /T Y P E S: NOTYP=0 INTS=1 REALS=2 BOOLS=3 CHARS=4 ARRAY=5 RECORD=6 /P R O C E D U R E S: BLOCK=0 STATEMENT=1 ASSIGNMENT=2 COMPOUNDSTATEMENT=3 IFSTATEMENT=4 CASESTATEMENT=5 REPEATSTATEMENT=6 WHILESTATEMENT=7 FORSTATEMENT=8 STANDPROC=9 SELECTOR=10 CALL=11 STANDFCT=12 FACTOR=13 TERM=14 SIMPLEEXPRESSION=15 EXPRESSION=16 CONDECLARE=17 TYPDECLARE=18 VARDECLARE=19 PRODECLARE=20 CONSTANT=21 ARRAYTYP=22 TYPE=23 PARAMETERLIST=24 ONECASE=25 /P R O G R A M P A R A M E T E R S: TMAX=512 /MAX. NUMBER OF IDENTIFIERS AMAX=64 /MAX. NUMBER OF ARRAYS BMAX=64 /MAX. NUMBER OF BLOCKS (PROCEDURES+RECORDS) CMAX=1980 /MAX. SIZE OF INTERMEDIATE CODE CSMAX=30 /MAX. NUMBER OF CASES LMAX=16 /MAX. NUMBER OF LEVELS LLNG=80 /MAX. LENGTH OF INPUT LINE ALNG=8 /NO. OF SIGNIFICANT CHAR'S IN IDENTIFIERS OCTAL FIELD 0 /P A G E Z E R O : *4 EOF, 0 /END OF FILE SWITCH (BOOLEAN) EOLN, 1 /END OF LINE SWITCH ( - " - ) CC, 0 /CHARACTER-COUNTER ERRSW, 0 /ERROR IN LINE SWITCH *10 XR10, 0 /ONE AUTOINDEX REGISTER *20 PC, 0 /P R O G R A M - C O U N T E R /I N S T R U C T I O N - R E G I S T E R IRF, 0 /OP-CODE IRX, 0 /LEVEL IRY, 0 /ADDRESS OR VALUE /S T A C K - P O I N T E R S B, 0 /BASE INDEX T, 0 /STACK POINTER (SIMPLE INDEX) T3, 0 /= 4*T + 3 (ADDRESS OF WORD 3) T3T, 0 /T3 FOR ROUTINE 'TOSTACK' LOOK, 240 /NEXT CHARACTER (LOOK AHEAD) /----------- PAGE 0 LOC'S OF ARITHMETIC PACKAGE ---------------- *32 BCD, 0 /BINARY CODED DECIMAL DIGIT CHAR, 240 /CURRENT CHARACTER M, 22 /OUTPUT FORMAT PARAMETERS N, 0 /(DEFAULT VALUES: M=18, N=0) ACX, 0 / A C - R E G I S T E R ACS, 0 AC0, 0 AC1, 0 AC2, 0 AC3, 0 INTERPC /POINTER TO MACRO-INTERPRETER MQ1, 0 / M Q - R E G I S T E R MQ2, 0 MQ3, 0 OP0, 0 / O P - R E G I S T E R OP1, 0 OP2, 0 OP3, 0 OPX, 0 OPS, 0 MIN4, -4 /-4 (COUNTING WORDS) MIN44, -44 /-36 (COUNTING BITS) OS8, 7600 H1, 0 /4 GENERAL TEMPORARIES H2, 0 H3, 0 H4, 0 /NEW INSTRUCTIONS USED ALSO BY ARITHMETIC PACKAGE: HALVE=JMS I . /AC:=AC DIV 2 (SHIFT RIGHT) RACR DOUBLE=JMS I . /AC:=2*AC (SHIFT LEFT) RACL CLEAR=JMS I . /AC := 0 CLAC LOAD=CLEAR /AC := CONTENTS OF ACCUMULATOR (12 BIT INT.) READC=JMS I . /GET NEXT CHAR FROM INPUT DEVICE PTREAD, XNEXTCH /XREAD AT RUNTIME PRINTC=JMS I . /SEND CHAR TO OUTPUT DEVICE PTPRINT,XPRINT ZPRINT, XPRINT /CONSTANT POINTER TO XPRINT CRLF=JMS I . XCRLF SNALF=JMS I . /SKIP ON NOT ALFABETIC CHAR. (LETTER) XSNALF SKDIG=JMS I . /SKIP ON DIGIT XSKDIG BREAK=JMS I . /CHECK FOR CTRL-C XBREAK HALT=JMS I . /RUN-TIME ERROR HANDLING PTHALT, ERR21 /XHALT AT RUNTIME /--------------------------------------------------------------- /MACRO INSTRUCTIONS USED BY INTERPRETER: *100 ERROR=JMS I . /NON FATAL COMPILER ERRORS ZERROR FATAL=JMS I . /FATAL COMPILER ERRORS ZFATAL OFTAB=JMS I . /GET INFO FROM SYMBOL-TABLE ZOFTAB OFATAB=JMS I . /GET INFO FROM ARRAY-TABLE ZOFATAB OFBTAB=JMS I . /GET INFO FROM BLOCK-TABLE ZOFTAB OFDISPLAY=JMS I . /GET INFO FROM DISPLAY ZOFDISP TODISPLAY=JMS I . /PUT INFO INTO DISPLAY ZTODISP GETCONST=JMS I . /GET CONSTANT ZOFCONST CONTINUE=JMP I . ILOOP BUMP=JMS I . /MOVE STACK POINTER XBUMP SDF=JMS . /CHANGE TO TOP OF STACK - DATA FIELD 0 XSDF, CDF /VARIABLE! JMP I .-2 POPONE=JMS I . /POP ONE WORD (WORD 3 INTO AC) XPOPONE POPVAL=JMS I . /POP FOUR WORDS XPOPVAL POPNUM=JMS I . /POP NUMBER (=POP 4 WORDS AND UNPACK) XPOPNUM PUSHONE=JMS I . /PUSH ONE WORD XPUSHONE PUSHVAL=JMS I . /PUSH FOUR WORDS XPUSHVAL PUSHNUM=JMS I . /PUSH NUMBER (= PACK + PUSHVAL XPUSHNUM TOSTACK=JMS I . /INSERT ONE WORD INTO STACK[T3T] XTOSTACK OFCODE=JMS I . /GET INTERMEDIATE INSTRUCTION XOFCODE /LOCATIONS USED BY I/O-FILE HANDLING: IBUFFER=6000 /INPUT FILE BUFFER OBUFFER=7000 /OUTPUT FILE BUFFER IDEVBUF=6400 /PAGE OF INPUT DEVICE HANDLER ODEVBUF=6600 /PAGE OF OUTPUT DEVICE HANDLER IDEVH, 0 /ENTRY POINT OF INPUT DEVICE HANDLER ODEVH, 0 /ENTRY POINT OF OUTPUT DEVICE HANDLER NAME, ZBLOCK 4 /NAME OF OUTPUT FILE DEVNO, 0 /OUTPUT DEVICE NUMBER LEMPTY, 0 / -LENGTH OF EMPTY MBLOCKS,0 /COUNTING WRITTEN BLOCKS OBP, OBUFFER /BUFFER POINTER (SEE PUTC) OC3, -3 /3-CHARACTER SWITCH (SEE PUTC) I37, DCA CHAR /HALT PROGRAM - CLOSE OUTPUT FILE TAD [232 /WRITE EOF-MARK PRINTC /FILL REST OF BUFFER WITH ZEROES TAD [OBUFFER CIA TAD OBP SZA CLA JMP .-5 L7777 /COMPUTE ACTUAL LENGTH TAD LEMPTY /OF OUTPUT FILE CIA TAD MBLOCKS DCA ALOF CIF 10 TAD DEVNO JMS I [7700 /CALL USR TO CLOSE OUTPUT FILE 4 NAME ALOF, 0 ERRORD, HALT JMP I OS8 /RETURN TO KEYBOARD MONITOR /INSTRUCTION DECODER AND DISPATCH ROUTINE *200 ISTART, CLA CLL /STARTING ADDRESS DCA EOF L0001 DCA EOLN TAD [240 DCA CHAR TAD [240 DCA LOOK CLEAR DCA T /INITIALIZE THE STACK: BUMP PUSHVAL /S[1].I := 0 BUMP PUSHVAL /S[2].I := 0 BUMP PUSHVAL /S[3].I := 0 BUMP L0001 OFBTAB;LAST DCA H4 TAD H4 PUSHONE /S[4].I := BTAB[1].LAST DCA B /B := 0 L0001 DCA IRX TODISPLAY /DISPLAY[1] := 0 L0002 OFBTAB;VSIZE TAD MIN2 DCA T BUMP /T := BTAB[2].VSIZE - 1 TAD H4 OFTAB;ADR DCA PC /PC := TAB[ S[4].I ].ADR ILOOP, BREAK CLL /GET CURRENT INSTRUCTION TAD PC OFCODE MQL MQA BSW AND [77 DCA IRF MQA AND [77 DCA IRX STL TAD PC OFCODE DCA IRY ISZ PC /PC := PC + 1 TAD JUMP TAD IRF DCA .+1 HLT /JUMP TO INSTRUCTION ROUTINE JUMP, JMP I ILIST MIN2, -2 /INSTRUCTIONS OF STACK COMPUTER - ADDRESS TABLE: ILIST, I00 /LOAD ADDRESS I01 /LOAD VALUE I02 /LOAD INDIRECT I03 /UPDATE DISPLAY ZBLOCK 4 /CODES 4 - 7 UNUSED! I08 /CALL STANDERD FUNCTION I09 /OFFSET I10 /JUMP I11 /CONDITIONAL JUMP I12 /SWITCH CASE ILOOP /CODE 13 USED INTERNALLY! I14 /FOR1UP I15 /FOR2UP I16 /FOR1DOWN I17 /FOR2DOWN I18 /MARK STACK I19 /CALL I20 /INDEX1 I21 /INDEX I22 /LOAD BLOCK I23 /COPY BLOCK I24 /LITERAL I25 /LOAD CONSTANT I26 /FLOAT I27 /READ I28 /WRITE STRING I29 /WRITE1 (DEFAULT FIELD WIDTH) I30 /WRITE2 ( :M ) I31 /WRITE3 ( :M :N ) I32 /EXIT PROCEDURE I33 /EXIT FUNCTION I34 /LOAD ABSOLUTE I35 /LOGICAL NOT I36 /NEGATE PTI37, 7600 /HALT (BECOMES I37 IF FILE I/O!) I38 /STORE ZBLOCK 11 /CODES 39 - 47 UNUSED! I48 /ARITHMETIC OPERATIONS I49 /COMPARE INTEGERS I50 /COMPARE REALS I51 /LOGICAL OR I52 /LOGICAL AND ZBLOCK 10 /CODES 53 - 60 UNUSED! I61 /ASCII I62 /READLN I63 /WRITELN /INSTRUCTIONS OF STACK COMPUTER (A) I00, BUMP /LOAD ADDRESS OFDISPLAY TAD IRY PUSHONE CONTINUE I01, BUMP /LOAD VALUE OFDISPLAY TAD IRY POPVAL PUSHVAL CONTINUE I02, BUMP /LOAD INDIRECT OFDISPLAY TAD IRY POPONE POPVAL PUSHVAL CONTINUE I03, TAD IRX /UPDATE DISPLAY CIA TAD IRY DCA H1 TAD B DCA H3 UPDIS, TAD H3 TODISPLAY L7777 TAD IRX DCA IRX L0002 TAD H3 POPONE DCA H3 ISZ H1 JMP UPDIS CONTINUE I08, TAD IRY /CALL STANDARD FUNCTION TAD (JMS I STDFUNCT DCA .+2 POPNUM STFJMS, JMS . / J M S TO REQUESTED FUNCTION PUSHNUM CONTINUE STDFUNCT,XABS /0 XABS /1 XISQU /2 XRSQU /3 XODD /4 XCHR /5 STFJMS /6 XSUCC /7 XPRED /8 XROUND /9 RTRUNC /10 XSIN /11 XCOS /12 XEXP /13 XLOG /14 XSQRT /15 XATN /16 XEOF /17 XEOLN /18 XRAND /19 I09, POPONE /OFFSET TAD IRY PUSHONE CONTINUE I10, TAD IRY /JUMP DCA PC CONTINUE I11, POPONE /CONDITIONAL JUMP CLL RAR TAD IRY SNL DCA PC L7777 BUMP CONTINUE I12, POPVAL /SWITCH CASE L4000 AND AC1 CLL RAL TAD AC3 SZL CIA DCA H1 L7777 BUMP SCASE, CLL TAD IRY OFCODE TAD (-1500 /-1300 SZA CLA ERRORC, HALT /C A S E E R R O R ! STL TAD IRY OFCODE CIA TAD H1 SNA CLA JMP .+4 ISZ IRY ISZ IRY /(INCREMENTS, DOESN'T SKIP!) JMP SCASE IAC STL TAD IRY OFCODE DCA PC CONTINUE /I13 ... INTERNAL CODE (MARKS CASE SWITCH LIST) XEOF, 0 TAD EOF JMP .+3 XEOLN, 0 TAD EOLN LOAD BUMP JMP STFJMS+1 XSUCC, 0 L0001 JMP XCHR+1 XPRED, 0 L7777 JMP XCHR+1 XCHR, 0 TAD AC3 AND [77 LOAD JMP STFJMS+1 PAGE /INSTRUCTIONS OF STACK COMPUTER (B+C) I14, TAD UPSKIP /FOR1UP SKP I16, TAD DOSKIP /FOR1DOWN DCA FORUD1 L7777 /COMMON ROUTINE: TAD T POPNUM AAAAAAAAAAAAAAAA PUT INT&FORH1 EEEEEEEEEEEEEEEE POPNUM AAAAAAAAAAAAAAAA SUB INT&FORH1 FORUD1, SKGE /OR SKLE JMP FOR1EX GET INT&FORH1 EEEEEEEEEEEEEEEE L7776 TAD T POPONE PUSHNUM CONTINUE FOR1EX, EEEEEEEEEEEEEEEE TAD IRY DCA PC L7775 BUMP CONTINUE /NOTE THE STACK SITUATION: / / S[ T ] ... FINAL VALUE / S[T-1] ... INITIAL VALUE / S[T-2] ... ADDRESS OF CONTROL VARIABLE I15, TAD UPADD /FOR2UP DCA FORUD2 TAD UPSKIP JMP .+4 I17, TAD DOSUB /FOR2DOWN DCA FORUD2 TAD DOSKIP DCA FORUD3 L7776 /COMMON ROUTINE: TAD T POPONE DCA H2 TAD H2 POPNUM AAAAAAAAAAAAAAAA FORUD2, ADD INT&ONE /OR SUB INT&ONE PUT INT&FORH1 EEEEEEEEEEEEEEEE POPNUM AAAAAAAAAAAAAAAA SUB INT&FORH1 FORUD3, SKGE /OR SKLE JMP FOR2EX GET INT&FORH1 EEEEEEEEEEEEEEEE TAD H2 PUSHNUM TAD IRY DCA PC CONTINUE FOR2EX, EEEEEEEEEEEEEEEE L7775 BUMP CONTINUE UPSKIP, SKGE DOSKIP, SKLE UPADD, ADD INT&ONE DOSUB, SUB INT&ONE ONE, 0;0;0;1 FORH1, ZBLOCK 4 MINUS1, -1 BYTE, 77 LEVBITS,17 I18, L0004 /MARK STACK BUMP TAD IRY OFTAB;REF BSW AND BYTE OFTAB;VSIZE TAD MINUS1 PUSHONE BUMP TAD IRY PUSHONE CONTINUE I19, TAD IRY /CALL CIA TAD T DCA H1 L0004 TAD H1 POPONE DCA H2 TAD H2 OFTAB;LEV AND LEVBITS DCA H3 L0001 TAD H3 DCA IRX TAD H1 TODISPLAY L0003 TAD H1 POPONE TAD H1 DCA H4 L0001 TAD H1 DCA T3T TAD PC TOSTACK ISZ T3T TAD H3 DCA IRX OFDISPLAY TOSTACK ISZ T3T TAD B TOSTACK /-------------------- FALL THROUGH PAGE BOUNDARY ------------- CLEAR TAD T CMA CLL TAD H4 SNL CLA JMP .+4 BUMP PUSHVAL JMP .-7 TAD H1 DCA B TAD H2 OFTAB;ADR DCA PC CONTINUE I20, TAD (NOP /INDEX1 SKP I21, TAD (JMS MULTY /INDEX DCA INDEX1 TAD IRY /COMMON ROUTINE: OFATAB;HIGH CMA DCA H1 TAD IRY OFATAB;LOW TAD H1 CIA DCA H2 POPVAL L4000 AND AC1 CLL RAL TAD AC3 SZL CIA TAD H1 CLL TAD H2 DCA RELADR SNL ERRORB, HALT /INDEX OUT OF BOUNDS! INDEX1, NOP /OR JMS MULTY L7777 BUMP POPONE TAD RELADR PUSHONE CONTINUE RELADR=H4 MULTY, 0 TAD IRY OFATAB;ELSIZE CLL RAR MQL TAD (-14 /-12 (BITS) DCA H3 MBIT, SNL JMP .+3 CLL TAD RELADR RAR SWP RAR SWP ISZ H3 JMP MBIT SWP DCA RELADR JMP I MULTY I22, POPONE /LOAD BLOCK DCA H1 L7777 BUMP TAD IRY CMA DCA H2 JMP .+6 BUMP TAD H1 POPVAL PUSHVAL ISZ H1 ISZ H2 JMP .-6 CONTINUE I23, L7777 /COPY BLOCK TAD T POPONE DCA H1 POPONE DCA H2 TAD IRY CMA DCA H3 JMP .+7 TAD H2 POPVAL TAD H1 PUSHVAL ISZ H1 ISZ H2 ISZ H3 JMP .-7 L7776 BUMP CONTINUE I24, BUMP /LITERAL (ADDRESSES ONLY!) TAD IRY LOAD PUSHVAL CONTINUE I25, BUMP /LOAD CONSTANT TAD IRY GETCONSTANT PUSHVAL CONTINUE I61, POPONE /WRITE SPECIAL ASCII PRINTC L7777 BUMP CONTINUE PAGE /INSTRUCTIONS OF STACK COMPUTER (D) I26, TAD IRY /FLOAT CIA TAD T DCA H1 TAD H1 POPNUM JMS IFLOAT TAD H1 PUSHNUM CONTINUE I27, TAD (JMS I READX-1 /READ TAD IRY DCA .+1 JMS I READX POPONE PUSHNUM JMP EXI27 READX, IINP RINP NOP CINP I28, POPONE /WRITE STRING DCA M L7777 BUMP POPONE CIA DCA N TAD IRY CDF TABLEFIELD JMS WSTRING JMP EXI27 I29, TAD (TAD DFW-1 /WRITE (STANDARD FIELD WIDTH) TAD IRY DCA .+1 TAD DFW DCA M JMP WRGO I30, POPONE /WRITE (SPECIFIED FIELD WIDTH) DCA M L7777 BUMP WRGO, POPNUM L7777 BUMP DCA N TAD (JMS I WRITEX-1 TAD IRY DCA .+1 JMS I WRITEX CONTINUE WRITEX, IOUT ROUT BOUT COUT DFW, 12 22 12 1 I31, POPONE /WRITE ( X :M :N ) DCA N L7777 BUMP POPONE DCA M L7777 BUMP POPNUM JMS I WRITEX+1 /REAL ONLY! EXI27, L7777 BUMP CONTINUE I32, L7776 /EXIT PROCEDURE SKP I33, L7777 /EXIT FUNCTION TAD B DCA T BUMP L0001 TAD B POPONE DCA PC L0003 TAD B POPONE DCA B CONTINUE I34, POPONE /LOAD (ABSOLUTE) POPVAL PUSHVAL CONTINUE I35, POPONE /LOGICAL NOT CLL RAR CML RAL PUSHONE CONTINUE I36, POPNUM /NEGATE JMS XNEG PUSHNUM CONTINUE I38, POPVAL /STORE L7777 BUMP POPONE PUSHVAL L7777 BUMP CONTINUE /I39 - I47 U N U S E D ! /B O O L E A N O U T P U T BOUT, 0 TAD AC3 TAD (-5 DCA N TAD AC3 SNA CLA L0004 TAD (TRUEFALSE^2 JMS WSTRING JMP I BOUT PAGE /INSTRUCTIONS OF STACK COMPUTER (E) I48, POPNUM /ARITHMETIC: JMS ENTR /INTEGER: L7777 / + 48,1 BUMP / - 48,2 POPNUM / * 48,3 TAD (MRITABL / DIV 48,4 TAD IRY / MOD 48,5 DCA H1 TAD I H1 /REAL: DCA H1 / + 48,10 JMS I H1 / - 48,11 PUSHNUM / * 48,12 CONTINUE / / 48,13 I49, TAD (ISUB-RSUB /COMPARE (INTEGER) I50, TAD (RSUB /COMPARE (REAL) DCA H1 / = 50,7440 POPNUM / <> 50,7450 JMS ENTR / < 50,7500 L7777 / <= 50,7540 BUMP / > 50,7550 POPNUM / >= 50,7510 JMS I H1 /SUBTRACT TAD IRY JMS BOOL LOAD PUSHVAL CONTINUE I51, POPONE /LOGICAL OR DCA H1 L7777 BUMP SDF TAD H1 CMA AND I T3 TAD H1 DCA I T3 CDF CONTINUE I52, POPONE /LOGICAL AND DCA H1 L7777 BUMP SDF TAD H1 AND I T3 DCA I T3 CDF CONTINUE /I53 - I61 U N U S E D ! READC I62, TAD EOLN /READLN SNA CLA JMP .-3 READC CONTINUE I63, CRLF /WRITELN CONTINUE /AUXILIARY ROUTINES FOR 'WRITE STRING' AND 'BOOLEAN OUTPUT' WSTRING,0 DCA H1 RDF TAD CCDF0 DCA STRFLD CCDF0, CDF 0 TAD M SNA JMP NCHAR TAD N /M-N SPA SNA JMP PARTLY CIA DCA H2 TAD [240 PRINTC ISZ H2 JMP .-3 JMP NCHAR PARTLY, CIA / N-M TAD N /-N DCA N /= -M NCHAR, TAD H1 STL RAR /STRING TABLE STARTS AT 4000! DCA H2 STRFLD, CDF TABLEFIELD TAD I H2 CDF 0 SNL BSW JMS ASCII ISZ H1 ISZ N JMP NCHAR JMP I WSTRING ASCII, 0 AND [77 TAD [240 AND [77 TAD [240 PRINTC JMP I ASCII /C H A R A C T E R I N P U T AND O U T P U T CINP, 0 READC TAD CHAR AND [77 LOAD JMP I CINP COUT, 0 TAD M SPA SNA L0001 CIA DCA H2 JMP .+3 TAD [240 PRINTC ISZ H2 JMP .-3 TAD AC3 JMS ASCII JMP I COUT PAGE /STACK INSTRUCTIONS XBUMP, 0 SNA /IF (AC)=0 L0001 /THEN T:=T+1 CLL /ELSE T:=T+(AC) SPA CML TAD T DCA T SZL ERRORA, HALT /S T A C K O V E R F L O W ! TAD T CLL RAR BSW AND (70 TAD (CDF STACKFIELD DCA XSDF /SETUP CHANGE TO STACK FIELD INSTR. TAD T /AND BUILD STL RAL STL RAL DCA T3 /ADDRESS OF TOP ENTRY (LS WORD) JMP I XBUMP ST3, ADDRESS,0 /COMPUTE FULL ADDRESS MQL /OF STACK LOCATION MQA /AND CHANGE DATA FIELD CLL RAR BSW AND (70 TAD (CDF STACKFIELD DCA STCDF MQA STL RAL STL RAL STCDF, CDF STACKFIELD JMP I ADDRESS PACK, 0 /PACK REAL OR INTEGER NUMBER TAD ACX /INTO AC0-4 (FOR PUSHING) DCA AC0 TAD ACS TAD AC1 DCA AC1 JMP I PACK UNPACK, 0 /UNPACK POPPED NUMBER L4000 /(EXTRACT SIGN, EXPONENT) AND AC1 DCA ACS L3777 AND AC1 DCA AC1 TAD AC0 DCA ACX DCA AC0 JMP I UNPACK XPOPONE,0 SNA JMP TOPONE JMS ADDRESS DCA ST3 TAD I ST3 CDF JMP I XPOPONE TOPONE, SDF TAD I T3 CDF JMP I XPOPONE XPUSHONE,0 SDF DCA I T3 CDF JMP I XPUSHONE XPOPVAL,0 SNA JMP TOPVAL JMS ADDRESS TAD MIN4 DCA XR10 TAD I XR10 DCA AC0 TAD I XR10 DCA AC1 TAD I XR10 DCA AC2 TAD I XR10 DCA AC3 CDF JMP I XPOPVAL TOPVAL, TAD T3 SDF JMP XPOPVAL+4 XPUSHVAL,0 SNA JMP ONTOP JMS ADDRESS TAD MIN4 DCA XR10 TAD AC0 DCA I XR10 TAD AC1 DCA I XR10 TAD AC2 DCA I XR10 TAD AC3 DCA I XR10 CDF JMP I XPUSHVAL ONTOP, TAD T3 SDF JMP XPUSHVAL+4 XPOPNUM,0 JMS XPOPVAL JMS UNPACK JMP I XPOPNUM XPUSHNUM,0 MQL JMS PACK MQA JMS XPUSHVAL JMP I XPUSHNUM XTOSTACK,0 DCA PACK /TEMP. SAVE VALUE TAD T3T JMS ADDRESS DCA ST3 TAD PACK DCA I ST3 CDF JMP I XTOSTACK PAGE /TABLE INSTRUCTIONS ZOFTAB, / AC := TAB[ AC ].REF ZOFBTAB,0 / AC := BTAB[ AC ].REF CLL RTL TAD I ZOFTAB /SELECTOR FOLLOWS CALL DCA LOC ISZ ZOFTAB CDF TABLEFIELD TAD I LOC CDF JMP I ZOFTAB ZOFATAB,0 / AC := ATAB[ AC ].REF CLL RAL CLL RTL TAD I ZOFATAB /SELECTOR FOLLOWS CALL DCA LOC ISZ ZOFATAB CDF TABLEFIELD TAD I LOC CDF JMP I ZOFATAB ZOFDISP,0 / AC := DISPLAY[ IRX ] TAD (DISPLAY TAD IRX DCA LOC TAD I LOC JMP I ZOFDISP ZTODISP,0 / DISPLAY[ IRX ] := AC MQL TAD (DISPLAY TAD IRX DCA LOC MQA DCA I LOC JMP I ZTODISP XOFCODE,0 / AC := CODE[ AC.LINK ] RAL /LINK=0 ... 1ST WORD DCA LOC /LINK=1 ... 2ND WORD CDF CODEFIELD TAD I LOC CDF JMP I XOFCODE LOC, 0 /ADDRESS OF TABLE LOCATION ZOFCONST,0 /ENTER WITH ADDRESS-1 IN AC DCA XR10 CDF TABLEFIELD TAD I XR10 DCA AC0 TAD I XR10 DCA AC1 TAD I XR10 DCA AC2 TAD I XR10 DCA AC3 CDF JMP I ZOFCONST /PREDEFINED R A N D O M - NUMBER GENERATOR XRAND, 0 TAD DISMOV /DISABLE INTEGER- DCA INTMOV /MULTIPLY-OVERFLOW AAAAAAAAAAAAAAAA GET INT&RN MUL INT&ALFA /MOD 2^35 ! PUT INT&RN NORM /0 < RANDOM: REAL < 1 EEEEEEEEEEEEEEEE TAD ENAMOV /REENABLE DCA INTMOV BUMP JMP I XRAND DISMOV, DCA AC0 ENAMOV, JMSSNAC RN, 0000;3777;7777;7775 /2^35 - 3 (INTEGER) ALFA, 0000;0000;0100;0003 /2^18 + 3 (INTEGER) XODD, 0 L0001 AND AC3 LOAD JMP I XODD XSKDIG, 0 /SKIP ON DIGIT TAD CHAR TAD (-"9-1 CLL TAD ("9+1-"0 DCA BCD SZL CLA ISZ XSKDIG JMP I XSKDIG XPRINT, 0 /INTERNAL PRINTER HANDLER SNA TAD CHAR TLS TSF JMP .-1 TAD [-215 SZA CLA JMP I XPRINT TAD [212 JMP XPRINT+3 SPRINT, 0 /SILENT PRINTER CLA CLL JMP I SPRINT XCRLF, 0 /CARRIAGE RETURN & LINE FEED TAD [215 PRINTC JMP I XCRLF XBREAK, 0 /CHECK ^C AND ABORT KSF JMP I XBREAK CLA KRS AND [177 TAD (-3 SZA CLA JMP I XBREAK JMP I OS8 PAGE / A R I T H M E T I C P A C K A G E INTERPC,0000 /PROGRAM COUNTER FOR MACRO-INSTRUCTIONS CPAGE, 7600 SZA CLA NEXTINSTR, ISZ INTERPC /POINT TO NEXT INSTRUCTION TAD I INTERPC /GET CODE SNA /IF CODE=0000 JMP I INTERPC /THEN RETURN TO PDP8-MODE CLL RTL /ELSE SHIFT CODE NXXX RTL AND (7 /TO EXTRACT OPERATION CODE N DCA OPCODE TAD I INTERPC /GET CODE AGAIN, AND (177 /MASK OUT REL.ADDRESS (OR FUNCTION CODE) MQL TAD CPAGE C200, AND INTERPC /CURRENT PAGE BITS MQA /+ RELATIVE ADDRESS DCA OPADDR /= ABS. ADDRESS OF OPERAND (IF MRI) SNL /IF D\I-BIT SET JMP .+3 TAD I OPADDR /THEN DO INDIRECT ADDRESSING DCA OPADDR TAD OPCODE TAD (-7 SNA CLA /IF CODE=7XXX JMP OPRTYP /THEN OPERATE CLASS INSTRUCTION MRITYP, TAD I OPADDR /ELSE MEMORY REFERENCED INSTR.: DCA OPX /LOAD AND UNPACK OPERAND ISZ OPADDR /INTO OP-REGISTER L4000 AND I OPADDR DCA OPS L3777 AND I OPADDR DCA OP1 ISZ OPADDR TAD I OPADDR DCA OP2 ISZ OPADDR TAD I OPADDR DCA OP3 TAD I INTERPC /GET INSTRUCTION CODE AGAIN, AND C200 /CHECK INTEGER\REAL-BIT SZA CLA /AND BUILD A TAD (7 TAD OPCODE TAD (JMS I MRITABL DCA .+1 OPCODE, JMS . / J M S TO THE REQUESTED ROUTINE JMP NEXTINSTR OPADDR, 0 /TABLE OF INTEGER ARITHMETIC ROUTINES: MRITABL,OGET IADD ISUB IMUL IDIV IMOD OPUT /TABLE OF REAL ARITHMETIC ROUTINES: OGET RADD RSUB RMUL RDIV OJUMP OPUT OPRTYP, TAD I INTERPC /DECODE OPERATE INSTRUCTION SNL /BIT3 IS IN LINK (COMPLEMENTED!) JMP SKIPTYP /SKIP INSTR. CODES ARE 74XX, 75XX BSW /OPERATE INSTR. CODES ARE: RTR /7000 - 7006 (INTEGER) CLA MQA /7200 - 7206 (REAL) AND (7 /EXTENDED FUNCTIONS: 70X7 RAL TAD (JMS I OPRTABL DCA .+3 TAD INTERPC /SAVE PC, SINCE OPR'S MAY CAUSE DCA SAVEPC /RECURSIVE CALL OF INTERPRETER (1 LEVEL) OPRJMS, JMS . / J M S TO APPROPRIATE ROUTINE TAD SAVEPC /RESTORE PC DCA INTERPC JMP NEXTINSTR SAVEPC, 0 NOOP=OPCODE /TABLE OF OPERATE CLASS INSTRUCTIONS: OPRTABL,XABS; RNORM IINP; RINP IOUT; ROUT IFLOAT; RTRUNC XNEG; CLAC XISQU; XRSQU XCRLF; XROUND NOOP /LINK TO FUNCTION DISPATCH ROUTINE IFDEF FUNCTS < *.-1 FUNCTS /ENABLED ONLY IF FUNCTION PACKAGE PRESENT > SKIPTYP,JMS BOOL /ALL SKIP INSTR. (INT & REAL) DONE HERE ISZ INTERPC /(SEE ROUTINE 'BOOL' FOR COMMENTS) JMP NEXTINSTR-1 OJUMP, 0 /JUMP (WITHIN MACRO CODE!!!) L7775 TAD OPADDR DCA INTERPC JMP NEXTINSTR+1 OPUT, 0 /STORE CONTENTS OF AC-REGISTER L0004 /AT SPECIFIED MEMORY ADDRESS CIA /-4 (OPADDR WAS MOVED AT MRITYP) TAD OPADDR DCA XR10 TAD ACX DCA I XR10 TAD ACS TAD AC1 DCA I XR10 TAD AC2 DCA I XR10 TAD AC3 DCA I XR10 JMP I OPUT PAGE /R E A L N U M B E R I N P U T / /ACCEPTS A DECIMAL NUMBER IN ANY FORMAT, /CONVERTS IT TO INTERNAL BYNARY FLOATING POINT NOTATION /AND LEAVES IT IN THE AC-REGISTER. /LEADING BLANKS ARE IGNORED; THE FIRST /NON ACCEPTABLE CHARACTER TERMINATES THE NUMBER. DC=MQ2 /DIGIT COUNTER OC=MQ3 /DIGIT EXCESS COUNTER DP, 0 /DECIMAL POINT POSITION RINP, RETNUM /RETURN ADDR. SINCE COMPILER ENTERS AT 'FRACTN' SKP CLA READC /PASS OVER LEADING BLANKS TAD CHAR TAD (-240 SNA CLA JMP .-4 JMS PMXXX /PROCESS + - I N T E G E R PART TAD OC /COUNT LOOSEN DIGITS (IF THE INTERNAL CIA /REPRESENTATION EXCEEDS 35 BITS, DCA DC /FURTHER DIGITS ARE IGNORED, BUT TAD CHAR /THEIR CONTRIBUTION TO MAGNITUDE TAD (-". /MUST BE CONSIDERED!) SZA CLA /IF INTEGER FOLLOWED BY DECIMAL POINT JMP .+3 READC FRACTN, JMS BCONV /THEN PROCESS F R A C T I O N PART TAD DC /COUNT DIGITS AFTER DEC. POINT CIA DCA DP /TO REMEMBER POSITION OF DEC. POINT JMS IFLOAT /NORMALIZE THE NUMBER TAD CHAR TAD (-"E SZA CLA /IF NEXT CHARACTER IS "E" JMP ADJUST AAAAAAAAAAAAAAAA PUT NUMBUF /THEN STORE NUMBER TEMPORARELY EEEEEEEEEEEEEEEE READC JMS PMXXX /AND PROCESS S C A L E - F A C T O R TAD ACS CLL RAL TAD AC3 /GET IT FROM LOW ORDER WORD OF AC SZL /IF NEGATIVE SIGN CIA /THEN USE 2'S COMPLEMENT TAD DP /ADD IT TO CURRENT POS. OF DEC. POINT DCA DP AAAAAAAAAAAAAAAA GET NUMBUF /RECALL STORED MANTISSA EEEEEEEEEEEEEEEE ADJUST, TAD DP /NOW CONVERT DEC. FLOATING POINT TO JMS SUP1 /TO BINARY FLOATING POINT NOTATION JMP I RINP PMXXX, 0 /SIGNED INTEGER INPUT & CONVERSION CLEAR DCA DC DCA OC TAD CHAR TAD (-"+ SNA JMP .+6 CLL RTR SZA CLA JMP .+4 L4000 DCA ACS READC JMS BCONV JMP I PMXXX BCONV, 0 /UNSIGNED DIGIT STRING INPUT & CONVERSION SKDIG JMP I BCONV TAD AC0 SZA CLA JMP OVER CLL JMS MUL10 TAD BCD DCA OP3 DCA OP2 DCA OP1 JMS BADD ISZ DC SKP OVER, ISZ OC READC JMP BCONV+1 /F L O A T AND T R U N C ROUTINES DISPLC=. IFLOAT, 0 /COMPENSATE TAD (43 /35 BITS DISPLACEMENT OF BINARY POINT DCA ACX /WITH EXPONENT JMS RNORM /AND NORMALIZE JMP I IFLOAT RTRUNC, 0 CLA CLL TAD ACX SPA SNA /IF ABS(AC)<1 OR AC=0 JMP LESS0 /THEN TRUNC(AC):=0 TAD MIN44 DCA DISPLC /-(DISPLACEMENT OF BINARY POINT + 1) SZL CLA /IF ABS(AC)>MAXINT JMP ERROR2 /THEN O V E R F L O W SKP HALVE /ELSE ALIGN MANTISSA ISZ DISPLC JMP .-2 DCA ACX /EXP=0 FOR INTEGERS JMP I RTRUNC LESS0, CLA CLEAR JMP I RTRUNC XROUND, 0 L2000 DCA OP1 DCA OP2 DCA OP3 DCA OPX /X>=0: TAD ACS /ROUND(X) = TRUNC(X+0.5) DCA OPS /X<0: JMS RADD /ROUND(X) = TRUNC(X-0.5) JMS RTRUNC JMP I XROUND PAGE /R E A L N U M B E R O U T P U T / /PRINTS FLOATING POINT NUMBER X (CONTENTS OF AC-REGISTER) /IN THE FORMAT SPECIFIED BY THE PARAMETERS M,N (PAGE 0) /PERFORMS LIKE THE PASCAL-STATEMENT / W R I T E ( X :M :N ) /M /MINIMUM FIELD WIDTH /N /FRACTION LENGTH S=MQ1 /-NUMBER OF LEADING BLANKS P=MQ2 /-NUMBER OF DIGITS PRECEDING THE DEC. POINT F=MQ3 /-NUMBER OF DIGITS FOLLOWING THE DEC. POINT ROUT, 0 JMS FLCONV /BINARY TO DECIMAL FLOATING POINT JMS EXBCD /EXTRACT BCD-DIGITS OF MANTISSA TAD N SPA SNA /WHICH FORMAT REQUESTED? JMP FLOPNT FIXPNT, CIA / -99999.99999 DCA F /F:=-N TAD DEXP SPA /IF DEXP>0 CLA /THEN P:=-(DEXP+1) CMA /ELSE P:=-1 DCA P L7776 /S:=-(M-N-P-2) TAD F TAD P TAD M CIA DCA S TAD S SMA CLA /IF S>=0 THEN USE FLOATING POINT FORMAT JMP FLOPNT /(NUMBER TOO LARGE FOR FIXED POINT!) L0002 TAD N /ROUNDUP WITH (N+DEXP+1)TH DIGIT TAD DEXP SPA SNA /IF NOT WITHIN THE 11 DIGITS, THEN JMP .+3 TAD (-13 /ROUNDUP WITH 11TH DIGIT SMA CLA TAD (13 JMS UROUND JMP FIXPNT+2 /ROUNDED MANTISSA = 10, CHECK WIDTH! TAD DEXP /BEGINNING AT DIGIT POS. NUMBUF+DEXP SMA /OR NUMBUF IF NUMBER >= 1 CLA JMS XOUT /DO THE FIXED POINT OUTPUT JMP I ROUT FLOPNT, L7777 / -9.999999999E+999 DCA P /P:=-1 TAD M TAD (-12 SPA CLA TAD (12 DCA M /IF M<10 THEN M:=10 TAD (-11 DCA F /F:=-9 TAD M /S:=-(M-17) TAD (-21 CIA DCA S TAD S SPA CLA /IF S>=0 THEN JMP .+7 L7777 /S:=-1 DCA S /F:=-(M-9) TAD M TAD (-11 CIA DCA F L7776 TAD F CIA JMS UROUND /ROUNDUP WITH (-F+1)TH DIGIT STFW, 0022 /NOP (CARRY DOESN'T HARM!) JMS XOUT /OUTPUT THE MANTISSA TAD ("E PRINTC /E TAD DEXP SPA CLA L0002 TAD ("+ PRINTC /+ OR - TAD DEXP SPA CIA /MAKE DEXP POSITIVE JMS LDAC /LOAD IT IN AC-REGISTER (AS INTEGER) L0003 DCA M /SETUP A FIELD WIDTH OF 3, TAD ("0-240 /CHANGE LEADING BLANKS TO ZEROES JMS IOUT /AND USE INTEGER OUTPUT ROUTINE TAD STFW /TO PRINT THE CHARACTERISTIC. DCA M /THEN RESET STANDARD FIELD WIDTH JMP I ROUT /BUFFER FOR BCD-DIGITS: 0 /IMPORTANT! (SEE ROUNDING) NUMBUF, ZBLOCK 13 TEN, 0004 /REAL CONSTANT OF 10.0 2400 0000 0000 OPTEN, 7775 /REAL CONSTANT OF 0.1 (CURRENTLY NOT USED!) 3146 3146 3146 LDAC, CLAC, 0 /LOAD OR CLEAR AC-REGISTER DCA AC3 DCA AC2 DCA AC1 DCA AC0 DCA ACS DCA ACX JMP I CLAC PAGE /REAL NUMBER OUTPUT - AUXILIARY ROUTINES XDPOS=XR10 /AUTOINDEXING DIGITS /DPOS=EXBCD /SIMPLE POINTER TO DIGITS /DIG0=DOUT /NUMBUF-1 OR NUMBUF-2 (FIRST DIGIT OF MANTISSA) DEXP=BCD /DECIMAL CHARACTERISTIC OF X DCNT=. /DIGIT COUNTER FLCONV, 0 /CONVERT X*2^ACX ---> Z*10^DEXP, DCA DEXP /WITH 1<=Z<10: TAD AC1 SNA CLA /IF NUMBER=0 THEN NO CONVERSION NECESSARY! JMP I FLCONV JMS SUP2 /DO SUPER CONVERSION FLCLP, TAD DEXP DCA DEXP TAD ACX SPA SNA /NOTE INTERNAL BINARY NOTATION: JMP SMALL TAD (-4 / 1 ..... 0.1000B+1 SPA /10 ..... 0.1010B+4 JMP .+5 SZA CLA JMP LARGE TAD AC1 /HIGH ORDER WORD FOR 10 TAD (-2400 /IS 2400 OCTAL! SPA CLA JMP I FLCONV LARGE, AAAAAAAAAAAAAAAA DIV TEN /:10 (OR 'MUL OPTEN' *0.1) EEEEEEEEEEEEEEEE L0001 JMP FLCLP SMALL, AAAAAAAAAAAAAAAA MUL TEN /*10 EEEEEEEEEEEEEEEE L7777 JMP FLCLP DPOS=. EXBCD, 0 /EXTRACT BCD-DIGITS OF MANTISSA TAD ACX CMA DCA DCNT STL /(MIGHT CORRECT ILL 11TH DEC. DIGIT!) DOUBLE /SHIFT OUT FIRST DIGIT ISZ DCNT JMP .-3 TAD (NUMBUF-1 DCA XDPOS TAD (-12 /10 DIGITS REMAINING DCA DCNT DCA I (NUMBUF-1 /LEADING 0 FOR ROUNDING CARRY SKP JMS MUL10 TAD AC0 DCA I XDPOS DCA AC0 ISZ DCNT JMP .-5 TAD (NUMBUF-1 /POINT TO FIRST DIGIT DCA DIG0 JMP I EXBCD UROUND, 0 /ROUNDUP. ENTRY WITH DIGIT NO. TAD DIG0 /WHERE TO START ROUNDING DCA DPOS /IN HARDWARE AC TAD (5 CARRY, TAD (-12 TAD I DPOS SPA CLA JMP OVR10 DCA I DPOS L7777 TAD DPOS DCA DPOS ISZ I DPOS JMP CARRY OVR10, TAD DIG0 CIA TAD DPOS SZA CLA /CARRY TO A NEW FIRST DIGIT? JMP SKIPEX /NO L7777 TAD DIG0 DCA DIG0 ISZ DEXP JMP I UROUND /MANTISSA=10 EXIT SKIPEX, ISZ UROUND /NORMAL EXIT JMP I UROUND XOUT, 0 /OUTPUT. ENTRY WITH DIGIT NO. TAD DIG0 /WHERE TO START PRINTING DCA XDPOS /IN HARDWARE AC TAD (240 PRINTC / -(S) BLANKS ISZ S JMP .-3 TAD ACS SPA CLA TAD ("--240 TAD (240 PRINTC / THE SIGN (- OR BLANK) JMS DOUT / -(P) DIGITS (OR ZERO) ISZ P JMP .-2 TAD (". / THE DECIMAL POINT PRINTC JMS DOUT / -(F) DIGITS (OR ZEROES) ISZ F JMP .-2 JMP I XOUT DIG0=. DOUT, 0 /IF XDPOS POINTS INTO BUFFER TAD XDPOS /THEN PRINT THE DIGIT TAD (-NUMBUF-12 /ELSE PRINT A ZERO CLL TAD (14 CLA TAD I XDPOS SNL CLA TAD ("0 PRINTC JMP I DOUT PAGE /R E A L A R I T H M E T I C / /RADD: AC:=AC+OP /RSUB: AC:=AC-OP /RMUL: AC:=AC*OP /RDIV: AC:=AC/OP / /RNORM: NORMALIZE AC TO STANDARD FLOATING POINT FORMAT RADD, 0 TAD OP1 SNA CLA /IF OP=0 THEN DON'T WASTE TIME! JMP I RADD TAD AC1 SNA CLA /IF AC=0 THEN SIMPLY ADD! JMP OPMAX TAD ACX /COMPARE MAGNITUDE OF OPERANDS CIA /AND STORE NEGATIVE DIFFERENCE TAD OPX SMA JMP OPMAX DCA RDIV /TO USE AS SHIFT COUNTER ACMAX, TAD OP1 /1/ ABS(AC)>ABS(OP) ---> SHIFT OP RIGHT CLL RAR DCA OP1 TAD OP2 RAR DCA OP2 TAD OP3 RAR DCA OP3 ISZ RDIV JMP ACMAX JMP SETSGN OPMAX, CMA /2/ ABS(OP)>=ABS(AC) DCA RDIV TAD OPX /RESULT IS OF MAGNITUDE OF OP DCA ACX SKP HALVE /SHIFT AC RIGHT ISZ RDIV JMP .-2 SETSGN, JMS OADD /MANTISSAS NOW ALIGNED! - ADD. JMS RNORM /NORMALIZE RESULT JMP I RADD RSUB, 0 JMS OSUB /OP:=-OP JMS RADD /AC:=AC+(-OP) JMP I RSUB OSUB, 0 L4000 TAD OPS DCA OPS JMP I OSUB RMUL, 0 TAD OP1 SNA CLA JMS CLAC TAD AC1 SNA CLA /IF OP=0 OR AC=0 JMP I RMUL /THEN DON'T WASTE TIME! DCA MQ1 DCA MQ2 /CLEAR MQ-REGISTER (FOR 'BMUL') DCA MQ3 TAD OPS /SETUP SIGN OF PRODUCT TAD ACS DCA ACS L7777 TAD OPX /COMPUTE EXPONENT OF PRODUCT TAD ACX DCA ACX L0001 JMS BMUL /MULTIPLY MANTISSAS JMS RNORM JMP I RMUL RDIV, 0 TAD OP1 SNA CLA ERROR0, HALT /D I V I S I O N BY Z E R O ! DCA MQ1 DCA MQ2 /CLEAR MQ-REGISTER (FOR 'BDIV') DCA MQ3 TAD OPS /SETUP SIGN OF QUOTIENT TAD ACS DCA ACS TAD OPX /COMPUTE EXPONENT OF QUOTIENT CIA TAD ACX DCA ACX JMS BDIV /DIVIDE MANTISSAS JMS RNORM JMP I RDIV RNORM, 0 CLA CLL TOOBIG, TAD AC1 AND (4000 /(NO 'L4000' BECAUSE OF LINK!) TAD AC0 SNA CLA /WHILE MANTISSA TOO BIG (>=1) JMP ROUNDUP HALVE /HALVE IT (SHIFT RIGHT) ISZ ACX /AND CORRECT THE EXPONENT (+1) NOP JMP TOOBIG ROUNDUP,SZL /IF A BINARY 1 WAS SHIFTED OUT ISZ AC3 /THEN ROUND MANTISSA JMP NULLAC ISZ AC2 JMP NULLAC ISZ AC1 /(CAN'T SKIP!) JMP RNORM+1 NULLAC, JMS SNAC /CHECK FOR NULL MANTISSA JMP ISNULL TOOSMALL,L2000 AND AC1 SZA CLA /WHILE MANTISSA TOO SMALL (<0.5) JMP ISNULL+1 DOUBLE /DOUBLE IT (SHIFT LEFT) L7777 /AND CORRECT THE EXPONENT (-1) TAD ACX DCA ACX JMP TOOSMALL ISNULL, JMS CLAC L2000 /CHECK FOR OVER- OR UNDERFLOW TAD ACX SMA CLA JMP I RNORM /OKAY! TAD ACX SPA CLA ERROR1, HALT /U N D E R F L O W ! ERROR2, HALT /O V E R F L O W ! PAGE /I N T E G E R I N P U T AND O U T P U T / / /M /MINIMUM FIELD WITH DI, 0 /-NUMBER OF DIGITS TO PRINT SI, 0 /-NUMBER OF LEADING BLANKS LDBLANK,240 /OR OTHER LEADING CHARACTER NEGATIV,0 /IF NUMBER NEGATIVE THEN -1 ELSE 0 IINP, 0 SKP CLA READC /IGNORE LEADING BLANKS TAD CHAR TAD (-240 SNA CLA JMP .-4 JMS PMXXX /INPUT +-0123456789 AND CONVERT TO BINARY JMS INORM /CHECK OVERFLOW (MAXINT=34359738367) JMP I IINP PTD=IINP IOUT, 0 TAD [240 /KLUDGE! CHOOSE THE LEADING CHARACTER DCA LDBLANK /WITH A TAD (XXX-240 BEFORE CALLING IOUT TAD ACS SPA CLA L7777 DCA NEGATIV TAD (NUMBUF+12 DCA PTD /POINT TO RIGHTMOST POS. OF BUFFER DCA I PTD /STORE A 0 CASE NUMBER=0 DECONV, JMS SNAC JMP OFORM L7777 TAD PTD /DECREMENT POINTER DCA PTD AAAAAAAAAAAAAAAA DIV INT&IO /AC:=AC DIV 10 EEEEEEEEEEEEEEEE TAD MQ3 CLL RAR /GET REST OF ABOVE DIVISION JMP DECONV-1 /AND STORE AS BCD-DIGIT OFORM, TAD (-NUMBUF-12 TAD PTD SMA L7777 /AT LEAST ONE DIGIT TO PRINT (THINK OF 0) DCA DI /DI:=-NUMBER OF DIGITS TAD NEGATIV /TAKE ACCOUNT OF EV. - SIGN TAD M TAD DI SPA /IF FIELD WIDTH < NO. OF DIGITS CLA /THEN SI:=-1 CMA /ELSE SI:=-(FIELD WIDTH - DIGITS) - 1 DCA SI JMP .+3 LDCHAR, TAD LDBLANK PRINTC /LEADING BLANKS ISZ SI JMP LDCHAR EVMINS, ISZ NEGATIV JMP ODIGS TAD ("- PRINTC /MINUS SIGN (IF ANY) ODIGS, TAD I PTD ISZ PTD TAD ("0 PRINTC /DIGIT STRING ISZ DI JMP ODIGS JMP I IOUT INORM, 0 /INTEGER CLEARING HOUSE ROUTINE L4000 AND AC1 TAD AC0 SZA CLA /IF AC0<>0 OR AC1>3777 THEN JMP ERROR2 /O V E R F L O W JMS SNAC DCA ACS /DON'T FORGET THE -0 PROBLEM! JMP I INORM IO, 0000 /INTEGER CONSTANT OF 10 0000 0000 0012 /VARIOUS SECONDARY ROUTINES: XABS, 0 /AC:=ABS(AC) DCA ACS JMP I XABS XNEG, 0 /AC:=-AC (REAL AND INTEGER) L4000 TAD ACS DCA ACS JMS INORM /BUT NOT AC:=-0 ! JMP I XNEG OGET, 0 /COPY CONTENTS OF DCA AC0 /OP-REGISTER INTO AC-REGISTER TAD OP1 /(AC0 IS CLEARED!) DCA AC1 TAD OP2 DCA AC2 TAD OP3 DCA AC3 TAD OPS DCA ACS TAD OPX DCA ACX JMP I OGET ENTR, 0 /COPY CONTENTS OF TAD AC1 /AC-REGISTER INTO OP-REGISTER DCA OP1 /(AC0 UNCHANGED!) TAD AC2 DCA OP2 TAD AC3 DCA OP3 TAD ACS DCA OPS TAD ACX DCA OPX JMP I ENTR BOOL, 0 /ENTER WITH SKIP-INSTRUCTION DCA OSKIP /IN HARDWARE AC JMS SNAC SKP L0001 TAD ACS OSKIP, 0000 SKP CLA L0001 JMP I BOOL /EXIT WITH HARDWARE AC=1 IF TRUE (SKIP) /OR AC=0 IF FALSE PAGE /I N T E G E R A R I T H M E T I C / /IADD: AC:=AC+OP /ISUB: AC:=AC-OP /IMUL: AC:=AC*OP /IDIV: AC:=AC DIV OP /IMOD: AC:=AC MOD OP IADD, 0 JMS OADD JMS INORM JMP I IADD OADD, 0 TAD ACS TAD OPS SNA CLA /IF BOTH OPERANDS HAVE THE SAME SIGN JMP SAMESGN /THEN SIMPLY ADD THEM JMS CMOP /ELSE COMPLEMENT ONE OF THEM (OP) JMS BADD /AND ADD TAD AC1 /BUT TAKE CARE: SMA CLA /IF RESULT POSITIVE (IN 2'S COMPLEMENT) JMP .+4 /THEN OKAY JMS CMAC /ELSE COMPLEMENT AC TAD OPS /AND USE SIGN OF OP DCA ACS DCA AC0 /NO OVERFLOW IN THIS CASE! JMP I OADD SAMESGN,JMS BADD JMP I OADD ISUB, 0 JMS OSUB /OP:=-OP JMS IADD /AC:=AC+(-OP) JMP I ISUB IMUL, 0 JMS SNOP /IF OP=0 CLEAR /THEN PRODUCT IS 0 DCA MQ1 DCA MQ2 /CLEAR MQ-REGISTER (BMUL NEEDS THAT!) DCA MQ3 TAD OPS /SETUP SIGN OF PRODUCT TAD ACS DCA ACS JMS BMUL /MULTIPLY INTMOV, JMS SNAC /IF HIGH ORDER WORDS OF PRODUCT <>0 SKP JMP ERROR2 /THEN O V E R F L O W ! JMS SWAP /GET LOW ORDER PART INTO AC HALVE /(BMUL GIVES 2*PRODUCT!) JMS INORM JMP I IMUL MODSGN=IMUL IDIV, 0 JMS SNOP JMP I [ERROR0 /D I V I S I O N BY Z E R O ! DOUBLE JMS SWAP /PUT 2*DIVIDEND INTO MQ-REGISTER DCA AC1 /AND CLEAR AC (SEE BDIV INSTRUCTIONS) DCA AC2 DCA AC3 TAD OPS /SETUP SIGN OF QUOTIENT TAD ACS DCA ACS TAD ACS /PATCH: SERVES DCA MODSGN /FOR MOD-FUNCTION JMS BDIV /DIVIDE JMS INORM JMP I IDIV IMOD, 0 JMS IDIV /DIVIDE OP INTO AC JMS SWAP /GET 2*REST FROM MQ-REGISTER HALVE /AND HALVE IT (SEE BDIV INSTR.) TAD MODSGN SPA CLA /IF REST NOT NEGATIVE JMS SNAC JMP MODOK /THEN OKAY JMS BADD /ELSE ADD OP TO MAKE IT POSITIVE JMS CMAC /MORE PRECISELY: AC:=-(AC-OP) MODOK, DCA ACS /SIGN IS + DCA AC0 JMP I IMOD /FOUR SECONDARY ROUTINES: SNAC, 0 /SKIP ON NONZERO AC TAD AC3 SNA TAD AC2 SNA TAD AC1 SZA CLA ISZ SNAC JMP I SNAC SNOP, 0 /SKIP ON NONZERO OP TAD OP3 SNA TAD OP2 SNA TAD OP1 SZA CLA ISZ SNOP JMP I SNOP CMAC, 0 /2'S COMPLEMENT OF AC CLA CLL TAD AC3 CIA DCA AC3 TAD AC2 CMA SZL IAC CLL DCA AC2 TAD AC1 CMA SZL IAC CLL DCA AC1 JMP I CMAC CMOP, 0 /2'S COMPLEMENT OF OP CLA CLL TAD OP3 CIA DCA OP3 TAD OP2 CMA SZL IAC CLL DCA OP2 TAD OP1 CMA SZL IAC CLL DCA OP1 JMP I CMOP JMSSNAC=JMS SNAC PAGE /B I N A R Y A D D I T I O N / /AC0!AC1!AC2!AC3 := AC1!AC2!AC3 + OP1!OP2!OP3 TEMP3=. BADD, 0 CLA CLL TAD AC3 TAD OP3 DCA AC3 RAL TAD AC2 TAD OP2 DCA AC2 RAL TAD AC1 TAD OP1 DCA AC1 RAL TAD AC0 DCA AC0 JMP I BADD /B I N A R Y M U L T I P L I C A T I O N / /OP=FACTOR /FLOATING POINT: AC=FACTOR, MQ=0; AC=PRODUCT (HIGH ORDER) /INTEGER: AC=FACTOR, MQ=0; MQ=2*PRODUCT (LOW ORDER) BMUL, 0 TAD MIN44 /-36 DCA BDIV JMS SWAP MULLP, JMS RACR TAD MQ1 RAR DCA MQ1 TAD MQ2 RAR DCA MQ2 TAD MQ3 RAR DCA MQ3 SZL JMS BADD ISZ BDIV JMP MULLP JMP I BMUL /B I N A R Y D I V I S I O N / /OP=DIVISOR /FLOATING POINT: AC=DIVIDEND, MQ=0; AC=QUOTIENT /INTEGER: AC=0, MQ=2*DIVIDEND; AC=QUOTIENT, MQ=2*REST BDIV, 0 TAD MIN44 /-36 DCA BMUL JMS CMOP DIVLP, CLL /COMPARE AC AND OP TAD AC3 TAD OP3 DCA TEMP3 /SAVE DIFFERENCE RAL TAD AC2 TAD OP2 DCA TEMP2 RAL TAD AC1 TAD OP1 SNL /AC > OP? JMP .+6 DCA AC1 /YES, SETUP DIFFERENCE TAD TEMP2 DCA AC2 TAD TEMP3 DCA AC3 CLA TAD MQ3 /SHIFT IN NEW BIT OF QUOTIENT RAL /AND DOUBLE DIVIDEND DCA MQ3 TAD MQ2 RAL DCA MQ2 TAD MQ1 RAL DCA MQ1 JMS RACL ISZ BMUL JMP DIVLP JMS SWAP JMP I BDIV /OTHER BINARY OPERATIONS: MUL2, RACL, 0 /SHIFT AC ONE BIT LEFT (=DOUBLE) TAD AC3 /TAKE CARE OF LINK CALLING RACL!!! RAL DCA AC3 TAD AC2 RAL DCA AC2 TAD AC1 RAL DCA AC1 TAD AC0 RAL DCA AC0 JMP I RACL TEMP2=. MUL10, 0 /AC TIMES 10 JMS ENTR /LINK MUST BE 0 ON ENTRY!!! JMS MUL2 JMS MUL2 JMS BADD JMS MUL2 JMP I MUL10 RACR, 0 /SHIFT AC ONE BIT RIGHT (=HALVE) TAD AC0 CLL RAR DCA AC0 TAD AC1 RAR DCA AC1 TAD AC2 RAR DCA AC2 TAD AC3 RAR DCA AC3 JMP I RACR SWAP, 0 /SWAP AC- AND MQ-REGISTER TAD AC1 MQL TAD MQ1 DCA AC1 TAD AC2 SWP DCA MQ1 TAD MQ2 DCA AC2 TAD AC3 SWP DCA MQ2 TAD MQ3 DCA AC3 MQA DCA MQ3 JMP I SWAP PAGE / A R I T H M E T I C P A C K A G E /OPTION: / S U P E R C O N V E R S I O N O V E R L A Y /POWERS OF TEN TABLE: P1E1, 0004;2400;0000;0000 / 1.0E+001 0007;3100;0000;0000 / 1.0E+002 0016;2342;0000;0000 / 1.0E+004 0033;2765;7020;0000 / 1.0E+008 0066;2160;6744;6770 / 1.0E+016 0153;2356;1326;6501 / 1.0E+032 0325;3023;6017;5120 / 1.0E+064 0652;2235;6443;7114 / 1.0E+128 P1E256, 1523;2523;7565;7735 / 1.0E+256 3245;3430;6320;2565 / 1.0E+512 (SERVES AS A GUARD) P1E2N, 0 /POINTER INTO TABLE DECP, 0 /DECIMAL CHARACTERISTIC /DEXP=BCD / --- " --- (SEE 'FLCONV') SUP1, 0 /INPUT CONVERSION (OVERLAYS 'ADJUST') SPA /IF DECIMAL CHARACTERISTIC >= 0 JMP .+4 DCA DECP /THEN STORE AS IT IS TAD (MUL P1E1 /AND SETUP FOR MULTIPLY JMP .+4 /WITH POWERS OF 10 CIA DCA DECP /ELSE MAKE IT POSITIVE TAD (DIV P1E1 /AND SETUP FOR DIVIDE DCA MD1E2N /BY POWERS OF 10 ADJLP, TAD DECP SNA /WHILE DECP<>0 DO: JMP I SUP1 CLL RAR /DECP:=DECP DIV 2 DCA DECP SNL /IF DECP WAS ODD JMP .+4 AAAAAAAAAAAAAAAA MD1E2N, MUL . /THEN MULTIPLY WITH (DIVIDE BY) 1.0E+2N EEEEEEEEEEEEEEEE L0004 TAD MD1E2N /POINT TO NEXT POWER OF TEN DCA MD1E2N JMP ADJLP SUP2, 0 /OUTPUT CONVERSION (OVERLAYS 'FLCONV') AAAAAAAAAAAAAAAA PUT XAC /SAVE NUMBER IN AC EEEEEEEEEEEEEEEE TAD XAC /GET BINARY EXPONENT SPA /(2'S COMPLEMENT!) CIA /AND LOAD IT AS POSITIVE INTEGER LOAD /INTO AC-REGISTER AAAAAAAAAAAAAAAA/NOTE: LG(2) IS APPROXIMATED BY 1233/4096 MUL INT&O1233 /*1233 EEEEEEEEEEEEEEEE L4000 AND XAC CLL RAL TAD AC2 /DIV 4096 SZL /IF XAC<0 CMA /THEN DEXP := -XAC*1233 DIV 4096 - 1 DCA DEXP /ELSE DEXP := XAC*1233 DIV 4096 AAAAAAAAAAAAAAAA GET XAC /RESTORE NUMBER EEEEEEEEEEEEEEEE TAD DEXP CIA JMS SUP1 /DO CONVERSION TO DECIMAL FLOATING POINT JMP I SUP2 XAC, ZBLOCK 4 O1233, 0000;0000;0000;2321 /1233 (INTEGER) TRUEFALSE, TEXT /TRUEFALSE/ XISQU, 0 /AC := AC^2 (INTEGER) JMS ENTR JMS IMUL JMP I XISQU XRSQU, 0 /AC := AC^2 (REAL) JMS ENTR JMS RMUL JMP I XRSQU PAGE /********************** / S Q U A R E R O O T / / AC := SQRT(AC) /********************** XSQRT, 0 TAD ACS SPA CLA ERROR3, HALT /SQUARE ROOT OF N E G A T I V E NUMBER! TAD AC1 SNA CLA JMP I XSQRT /DON'T WASTE TIME FOR SQRT(0)! L0001 TAD ACX /TRANSFORM ARGUMENT TO THE FORM SPA SZL / 2^(2*N) * F WITH 0.25 <= F < 1 CML RAR DCA ROOTX /SAVE N SNL /IF ODD(EXPONENT) L7777 /THEN ACX:=-1 (0.25 <= F < 0.5) DCA ACX /ELSE ACX:= 0 (0.5 <= F < 1 ) AAAAAAAAAAAAAAAA PUT SQARG /SAVE F EEEEEEEEEEEEEEEE TAD ACX /COMPUTE INITIAL VALUE X0 FOR NEWTON: DCA OPOINT5 /X0:=F + 0.25 (0.25 <= F < 0.5) L7777 /X0:=F/2 + 0.5 (0.5 <= F < 1 ) DCA ACX AAAAAAAAAAAAAAAA ADD OPOINT5 EEEEEEEEEEEEEEEE L7775 /3 ITERATION LOOPS GUARANTEE DCA NEWTON /FULL PRECISION! (MAX. ERROR: 8.0E-13) SQLOOP, AAAAAAAAAAAAAAAA PUT X123 GET SQARG DIV X123 ADD X123 /X[I+1] := (F/X[I] + X[I])/2 EEEEEEEEEEEEEEEE L7777 /HALVE BY ACX:=ACX - 1 TAD ACX DCA ACX ISZ NEWTON /IF DONE 3 LOOPS JMP SQLOOP TAD ROOTX /THEN INSERT EXPONENT N OF ROOT TAD ACX DCA ACX JMP I XSQRT NEWTON=. /LOOP COUNTER OPOINT5,0000 /CONSTANT OF 0.5 OR 0.25 (EXPONENT WORD 2000 /SET AT EXECUTION TIME) 0000 0000 SQARG, 0 /REDUCED ARGUMENT F 0 0 0 X123, 0 /TEMPORARY FOR APPROXIMATE VALUE 0 0 0 ROOTX, 0 /TEMPORARY FOR ROOT EXPONENT N /********************************** / N A T U R A L L O G A R I T H M / / AC := LN(AC) /********************************** /TABLE OF CONSTANTS: A0, 0001 /1.84375 3540 0000 0000 LNA0, 0000 /0.611801541106 2344 7603 2325 A1, 0001 /1.65625 3240 0000 0000 LNA1, 0000 /0.504556010752 2011 2512 4551 A2, 0001 /1.5 3000 0000 0000 LNA2, 7777 /0.405465108108 3174 6217 5457 A3, 0001 /1.375 2600 0000 0000 LNA3, 7777 /0.318453731119 2430 3057 0207 A4, 0001 /1.25 2400 0000 0000 LNA4, 7776 /0.223143551314 3443 7737 0746 A5, 0001 /1.1875 2300 0000 0000 LNA5, 7776 /0.171850256927 2577 6301 6051 A6, 0001 /1.09375 2140 0000 0000 LNA6, 7775 /0.0896121586897 2674 1512 1271 A7, 0001 /1.03125 2040 0000 0000 LNA7, 7773 /0.0307716586668 3740 5154 1636 PAGE XLOG, 0 TAD ACS TAD AC1 SPA SNA CLA ERROR4, HALT /LOGARITHM OF ZERO OR NEGATIVE NUMBER! AAAAAAAAAAAAAAAA PUT LNARG /SAVE ARGUMENT X = 2^N * F EEEEEEEEEEEEEEEE DCA LNARG /REDUCE TO FRACTION PART (0.5 <= F < 1) CLL TAD ACX /GET N (IN TWO'S COMPLEMENT!) SPA CIA STL JMS LDAC /LOAD IT AS INTEGER RAR DCA ACS AAAAAAAAAAAAAAAA FLOAT /CONVERT TO REAL MUL LN2 /TIMES LN(2) PUT LNTEMP /AND SAVE IT EEEEEEEEEEEEEEEE LNLOOP, TAD LNARG+1 /FOR FURTHER REDUCTION OF THE ARGUMENT AND BIT234 /SELECT THE APPROPRIATE MULTIPLIERS A(K) CLL RTR /AND THEIR LOGARITHMS FROM A TABLE, RTR /ACCORDING TO THE RANGE OF F. TAD (A0 DCA PTAK L0004 TAD PTAK DCA PTLNAK AAAAAAAAAAAAAAAA GET LNTEMP SUB I PTLNAK /SUBTRACT LN( A(K) ) TO COMPENSATE PUT LNTEMP GET I PTAK /THE MULTIPLICATION WITH A(K) MUL LNARG /F' = A(K)* .... *F PUT LNARG EEEEEEEEEEEEEEEE TAD ACX SNA CLA JMP LNLOOP /IT IS GUARANTEED, THAT AFTER NO MORE AAAAAAAAAAAAAAAA/THAN T H R E E E MULTIPLICATIONS SUB ONEPT0 /F' FITS IN THE RANGE PUT LNARG / 0 <= F'-1 < 2^(-5) MUL LTC6 /NOW COMPUTE LN(F') VIA TAYLOR SERIES ADD LTC5 MUL LNARG ADD LTC4 MUL LNARG ADD LTC3 MUL LNARG ADD LTC2 MUL LNARG ADD ONEPT0 MUL LNARG ADD LNTEMP /LN(X) = N*LN(2) - LN(A(K)) ... + LN(F') EEEEEEEEEEEEEEEE JMP I XLOG BIT234, 1600 /MASK TO EXTRACT BITS 00XXX0000000 PTAK, A0 /POINTER INTO TABLE PTLNAK, LNA0 / --- " --- LNARG, 0 /ARGUMENT REGISTER 0 0 0 LNTEMP, 0 /TEMPORARY 0 0 0 LN2, 0000 /0.69314718 2613 4413 7676 LTC6, 7776 / -1/6 6525 2525 2525 LTC5, 7776 / 1/5 3146 3146 3146 LTC4, 7777 / -1/4 6000 0000 0000 LTC3, 7777 / 1/3 2525 2525 2525 LTC2, 0000 / -1/2 6000 0000 0000 /**************************************** / E X P O N E N T I A L F U N C T I O N / / AC := EXP(AC) /**************************************** ONEPT0, EX0B8, 0001 / 2^(0/8) = 1 2000 0000 0000 EX1B8, 0001 / 2^(1/8) 2134 5340 7437 EX2B8, 0001 / 2^(2/8) 2301 5770 1214 EX3B8, 0001 / 2^(3/8) 2457 7553 2515 EX4B8, 0001 / 2^(4/8) 2650 1171 4637 EX5B8, 0001 / 2^(5/8) 3053 1625 0212 EX6B8, 0001 / 2^(6/8) 3272 1176 3126 EX7B8, 0001 / 2^(7/8) 3526 0143 3476 PAGE XEXP, 0 DCA TWO2N TAD (ONEPT0 DCA TWO2M8 AAAAAAAAAAAAAAAA SKNE JMP EXP0 /EXP(0)=1 MUL LOG2E /X*LB(2) .... EXP(X) = 2^(X*LB(2)) PUT EXTEMP TRUNC /SPLIT PRODUCT INTO PUT INT&TWO2N-3 /INTEGER PART N FLOAT SUB EXTEMP /AND FRACTION F (0 <= F < 1) NEGATE SKLT JMP .+7 ADD ONEPT0 EEEEEEEEEEEEEEEE TAD TWO2N CMA DCA TWO2N AAAAAAAAAAAAAAAA SKNE JMP EXP0 EEEEEEEEEEEEEEEE L0003 TAD ACX SPA SNA /IF F>=1/8 THEN SPLIT F INTO JMP APPROX CMA CLL / M/8 + R (0 < M < 8, 0 <= R < 1/8) DCA EXREST DOUBLE ISZ EXREST JMP .-2 TAD AC0 CLL RTL TAD (ONEPT0 DCA TWO2M8 /POINT TO 2^(M/8) IN TABLE DCA AC0 TAD (-4 DCA ACX JMS RNORM /NORMALIZE APPROX, AAAAAAAAAAAAAAAA/COMPUTE 2^R BY A CONTINUED FRACTION SKNE JMP EXP0 PUT EXREST GET EXD3 DIV EXREST ADD EXREST PUT EXTEMP GET EXC3 DIV EXTEMP SUB EXREST ADD EXB3 PUT EXTEMP GET EXA3 DIV EXTEMP SUB ONEPT0 SKIP EXP0, GET ONEPT0 MUL I TWO2M8 /MULTIPLY WITH 2^(M/8) EEEEEEEEEEEEEEEE TAD ACX TAD TWO2N /INSERT 2^N DCA ACX JMS RNORM /CHECK FOR OVERFLOW JMP I XEXP /EXP(X) = 2^N * 2^(M/8) * 2^R TWO2M8, 0 /POINTER TO TABLE EXTEMP, 0 /ARGUMENT AND TEMPORARY 0 0 0 EXREST, 0 /TEMPORARY REGISTER 0 0 0 TWO2N, 0000 /HOLDS N (MUST BE HERE!!!) LOG2E, 0001 /1.442695040889 2705 2435 4512 EXA3, 0006 /34.624680981335 2123 7726 1367 EXB3, 0005 /17.312340490668 2123 7726 1367 EXC3, 0007 /-104.068449050280 7201 0605 7007 EXD3, 0005 /20.813689810056 2464 0467 7155 /**************************** / S I N E AND C O S I N E / / AC := SIN(AC) / AC := COS(AC) = SIN(AC+PI/2) /**************************** XCOS, 0 AAAAAAAAAAAAAAAA ADD PIS2 EEEEEEEEEEEEEEEE JMS XSIN JMP I XCOS OPT5, 0000 /0.5 2000 0000 0000 PIS2, 0001 / PI/2 3110 3755 2421 PI, 0002 / PI 3110 3755 2421 COS2, 0003 /-PI^2/2! 6357 2363 1157 SIN3, 0003 /-PI^3/3! 6452 7363 4611 PAGE COS4, 0003 / PI^4/4! 2017 0174 1006 SIN5, 0002 / PI^5/5! 2431 5361 4734 COS6, 0001 /-PI^6/6! 6527 2361 7617 SIN7, 0000 /-PI^7/7! 6313 2263 1630 COS8, 7776 / PI^8/8! 3607 6501 5044 SIN9, 7775 / PI^9/9! 2501 7015 1040 COS10, 7773 /-PI^10/10! 7233 2174 5210 SCARG=EXTEMP /ARGUMENT REGISTER XSIN, 0 TAD ACS /SIN(-X) = -SIN(X), THUS DCA SCS /SAVE SIGN DCA ACS /AND MAKE ARGUMENT POSITIVE AAAAAAAAAAAAAAAA/NOW REDUCE ARGUMENT: DIV PI / X/PI = N + F (0 <= F < 1) PUT SCARG /SIN(X) = (-1)^N * SIN(PI*F) TRUNC EEEEEEEEEEEEEEEE L0001 AND AC3 /IF ODD(N) THEN CHANGE SIGN CLL RTR TAD SCS DCA SCS AAAAAAAAAAAAAAAA FLOAT SUB SCARG /-F SKNE JMP SCRET EEEEEEEEEEEEEEEE TAD ACX SZA CLA /IF F>=0.5 THEN JMP .+4 AAAAAAAAAAAAAAAA ADD ONEPT0 /F := 1 - F EEEEEEEEEEEEEEEE/ SIN(PI*F) = SIN(PI*(1-F)) DCA ACS /NOW ARG. REDUCED TO 0 <= F <= 0.5 L0002 TAD ACX SPA CLA /IF F<0.125 JMP TAYSIN /THEN USE SINE-SERIES AAAAAAAAAAAAAAAA/ELSE SIN(PI*F) = COS(PI*(0.5-F)) SUB OPT5 EEEEEEEEEEEEEEEE DCA ACS /F := 0.5 - F L0002 TAD ACX SPA CLA /IF F<0.125 JMP TAYCOS-1 /THEN USE COSINE-SERIES DIRECTLY L7777 /ELSE COS(PI*F) = 2 * COS(PI*F/2)^2 - 1 TAD ACX DCA ACX /F := F/2 (1/16 <= F <= 3/16) L7777 DCA HFLAG /SET HALVE ARGUMENT FLAG TAYCOS, AAAAAAAAAAAAAAAA PUT SCARG MUL SCARG PUT FQU /SQUARE ARG. MUL COS10 ADD COS8 MUL FQU ADD COS6 MUL FQU ADD COS4 MUL FQU ADD COS2 MUL FQU ADD ONEPT0 EEEEEEEEEEEEEEEE ISZ HFLAG /WAS F>=0.125? JMP SCRET+1 AAAAAAAAAAAAAAAA/YES PUT FQU MUL FQU / (COS^2 - SUB OPT5 / - 0.5) EEEEEEEEEEEEEEEE ISZ ACX / *2 HFLAG, NOP JMP SCRET+1 TAYSIN, AAAAAAAAAAAAAAAA PUT SCARG MUL SCARG PUT FQU MUL SIN9 ADD SIN7 MUL FQU ADD SIN5 MUL FQU ADD SIN3 MUL FQU ADD PI MUL SCARG SCRET, EEEEEEEEEEEEEEEE TAD AC1 SZA CLA TAD SCS /INSERT SIGN (AVOID -0 !) DCA ACS JMP I XSIN SCS, 0 /SIGN OF RESULT FQU, 0 /TEMPORARY FOR SQUARES ARG. 0 0 0 PAGE /******************** / A R C T A N G E N T / / AC := ARCTAN(AC) /******************** XATN, 0 TAD ACX TAD (14 SPA CLA /IF ARGUMENT VERY SMALL ( < 2^(-12) ) JMP I XATN /THEN ARCTAN(X)=X TAD ACS DCA ATNS /SAVE SIGN ... ARCTAN(-X) = -ARCTAN(X) DCA ACS /AND MAKE ARGUMENT POSITIVE AAAAAAAAAAAAAAAA PUT ATARG EEEEEEEEEEEEEEEE TAD ACX SPA SNA CLA /IF X>=1 JMP .+7 AAAAAAAAAAAAAAAA GET ONEPT0 /THEN X := 1/X DIV ATARG /ARCTAN(X) = PI/2 - ARCTAN(1/X) PUT ATARG EEEEEEEEEEEEEEEE/NOW ARGUMENT REDUCED TO 0 < X <= 1 L7777 DCA GT1FLAG /FLAG ARGUMENT > 1 TAD ACX SPA CLA /IF X>=0.5 THEN USE ADD.THEOREM: JMP ATN05 ISZ ATARG /2*X ADDFLAG,NOP AAAAAAAAAAAAAAAA/ARCTAN(X) = ARCTAN(0.5) + ARCTAN( ... ) ADD TWOPT0 /X := (2*X-1)/(X+2) PUT EXTEMP GET ATARG SUB ONEPT0 DIV EXTEMP PUT ATARG /ARGUMENT RANGE NOW 0 < X < 0.5 EEEEEEEEEEEEEEEE L7777 ATN05, DCA ADDFLAG AAAAAAAAAAAAAAAA/COMPUTE ARCTAN(X) BY CONTINUED FRACTION MUL ATARG PUT FQU ADD ATB3 PUT EXTEMP GET ATA3 DIV EXTEMP ADD ATB2 ADD FQU PUT EXTEMP GET ATA2 DIV EXTEMP ADD ATB1 ADD FQU PUT EXTEMP GET ATA1 DIV EXTEMP ADD ATB0 ADD FQU PUT EXTEMP GET ATA0 MUL ATARG DIV EXTEMP EEEEEEEEEEEEEEEE ISZ ADDFLAG /CORRECT RESULT IF NECESSARY JMP .+4 AAAAAAAAAAAAAAAA ADD ATN0P5 EEEEEEEEEEEEEEEE ISZ GT1FLAG /WAS X>1 ? JMP .+6 L4000 /YES DCA ACS / -ARCTAN(X) AAAAAAAAAAAAAAAA ADD PIS2 / +PI/2 EEEEEEEEEEEEEEEE TAD ATNS DCA ACS /INSERT SIGN JMP I XATN ATNS, 0 /TEMPORARY FOR SIGN GT1FLAG,0 ATARG, 0 /ARGUMENT REGISTER 0 0 0 ATA0, 0004 /12.37469388 3057 7537 4017 ATA1, 0007 /-80.34270560 6405 3673 4343 ATA2, 0001 /-1.191447224 6304 0253 6665 ATA3, 7775 /-0.078335428 6403 3451 4461 ATB0, 0005 /26.27277525 3221 3522 3121 ATB1, 0003 /6.36441688 3135 1757 0565 ATB2, 0002 /2.104518952 2065 4070 1015 ATB3, 0001 /1.258464113 2410 5255 0370 ATN0P5, 7777 /ARCTAN(0.5) 3553 0634 0530 TWOPT0, 0002 /2.0 2000 0000 0000 PAGE /I N P U T - O U T P U T ROUTINES FOR STANDARD FILES GETC, 0 CLA CLL TAD LOOK DCA CHAR ISZ IC3 JMP G12 G3, L7775 DCA IC3 L7776 TAD IBP DCA IBP TAD I IBP ISZ IBP K377, AND (7400 /FIRST LITERAL ON THIS PAGE ---> 0377 CLL RTL RTL DCA CHECK TAD I IBP AND (7400 TAD CHECK RTL RTL RAL JMP GEXIT G12, TAD IBP AND K377 SZA CLA JMP GEXIT-1 TAD (IBUFFER DCA IBP JMS I IDEVH 0200 IBUFFER IBLOCK, 0 JMP RDERR ISZ IBLOCK L7776 DCA IC3 TAD I IBP GEXIT, ISZ IBP JMS CHECK JMP GETC+4 JMP I GETC RDERR, SMA CLA JMP GEXIT-3 FATAL0, FATAL /FATAL READ ERROR! IC3, -3 IBP, IBUFFER PUTC, 0 SNA TAD CHAR DCA CHECK TAD CHECK ISZ OC3 JMP PUT12 DCA CC L7776 TAD OBP DCA OBP JMS PUT3L JMS PUT3R L7775 DCA OC3 TAD OBP AND K377 SZA CLA JMP PUXIT ISZ MBLOCKS SKP JMP ERRORD JMS I ODEVH 4200 OBUFFER OBLOCK, 0 JMP ERRORD ISZ OBLOCK TAD [OBUFFER DCA OBP JMP PUXIT PUT12, AND K377 DCA I OBP ISZ OBP PUXIT, TAD CHECK TAD [-215 SZA CLA JMP I PUTC TAD [212 JMP PUTC+1 PUT3L, PUT3R, 0 TAD CC CLL RTL RTL DCA CC TAD CC AND (7400 TAD I OBP DCA I OBP ISZ OBP JMP I PUT3R /OC3, 0 /ON PAGE 0! /OBP, 0 / - " - CHECK, 0 AND [177 SNA JMP I CHECK TAD (-15 SNA JMP CR TAD (15-32 SNA JMP CR-2 TAD (-6 CLL TAD [240 DCA LOOK CHEXIT, DCA EOLN SNL ISZ CHECK JMP I CHECK L0001 /END OF FILE DCA EOF CR, TAD [240 /END OF LINE DCA LOOK L0001 /LINK=0! JMP CHEXIT PAGE /THE ORGANIZATION OF THE FOLLOWING PAGES OF FIELD 0 /DEMANDS SOME EXPLANATION: / AT COMPILE TIME / AT RUNTIME / / / / /06000--------------------------/-------------------------------/ / STARTUP CODE, THEN / / / / I N P U T / /06200- I N P U T (SOURCE) -----/----- -----/ / F I L E B U F F E R / F I L E B U F F E R / / / / /06400--------------------------/-------------------------------/ / / INPUT / / I N P U T (SOURCE) / DEVICE HANDLER / /06600- -----/-------------------------------/ / D E V I C E / OUTPUT / / H A N D L E R / DEVICE HANDLER / /07000--------------------------/-------------------------------/ / / / / COMPILER PROCEDURES: / O U T P U T / /07200----- -----/----- -----/ / I N S Y M B O L / F I L E B U F F E R / / / / /07400----- AND -----/-------------------------------/ / / RUNTIME ERRORS / / N E X T C H / / /-------------------------------/-------------------------------/ /AT COMPILATION TIME FOUR PAGES OF FIELD 6 ARE USED AS FOLLOWS: /66400--- TEMPORARY STORAGE OF INPUT DEVICE HANDLER / /66600--- TEMPORARY STORAGE OF OUTPUT DEVICE HANDLER / /67400--- RUNTIME ERRORS / /67600--- INITIALIZATION OF RUNTIME SYSTEM /DURING INITIALIZATION OF THE RUNTIME SYSTEM /THE FIRST THREE PAGES ARE SWAPPED INTO THEIR PLACE IN FIELD 0! /#############################################################/ /#############################################################/ /##### #####/ /##### S T A R T #####/ /##### #####/ /#############################################################/ /#############################################################/ /IMPORTANT POINTS OF PROGRAM FLOW: /S T A R T (06000) /STARTING ADDRESS OF ENTIRE SYSTEM, /PROCESS I/O-SPECIFICATIONS /M A I N (40200) /START OF COMPILER PROGRAM /E X P L A I N (60200) /COMPILATION REPORT /I N I T (67600) /INITIALIZATION OF RUNTIME SYSTEM /I S T A R T (00200) /START OF INTERPRETER /ONCE ONLY CODE!!! USR=200 *IBUFFER START, CLA CLL /S T A R T I N G A D D R E S S CIF 10 JMS I [7700 /LOCK USR IN MEMORY 10 TAD (1000 /RESET JOB STATUS WORD DCA I (7746 CD, CIF 10 JMS I (USR /CALL THE COMMAND DECODER 5 2023 /ASSUMED INPUT EXTENSION: .PS JMS HEADER CDF 10 TAD I (7600 SNA /OUTPUT FILE SPECIFIED? JMP NOOUT DCA DEVNO /YES, SAVE DEVICE NUMBER TAD (7600 DCA XR10 TAD I XR10 /TRANSFER THE FILENAME DCA NAME TAD I XR10 DCA NAME+1 TAD I XR10 DCA NAME+2 TAD I XR10 DCA NAME+3 CDF 0 CIF 10 TAD DEVNO JMS I (USR /FETCH OUTPUT DEVICE HANDLER 1 OHEP, ODEVBUF /1 PAGE ONLY! JMP CDERR CIF 10 TAD DEVNO JMS I (USR /OPEN OUTPUT FILE 3 SBNO, NAME LEMP, 0 JMP CDERR TAD OHEP /GET ENTRY POINT DCA ODEVH TAD SBNO /GET STARTING BLOCK NUMBER DCA I (OBLOCK TAD LEMP /GET LENGTH OF EMPTY DCA LEMPTY TAD LEMPTY SZA TAD (-1 /SETUP BLOCK COUNTER DCA MBLOCKS /(=0 IF NOT A FILE DEVICE) SKP NOOUT, ISZ IHEP /ALLOW 2-PAGE INPUT HANDLER /IF NO OUTPUT FILE SPECIFIED! CDF 10 TAD I (7621 SNA /INPUT FILE SPECIFIED? JMP NOINP /NO, USE INTERN KEYBOARD HANDLER! CDF 0 CIF 10 JMS I (USR /FETCH INPUT DEVICE HANDLER 1 IHEP, IDEVBUF JMP CDERR CDF 10 TAD I (7622 /GET STARTING BLOCK NUMBER CDF 60 DCA I (IIBLOCK TAD IHEP /GET ENTRY POINT DCA I (IIDEVH NOINP, CDF 0 /SAVE DEVICE HANDLERS TAD I F0T6 /IN FIELD 6 TO MAKE ROOM CDF 60 /FOR HANDLER OF SOURCE FILE DCA I F0T6 ISZ F0T6 ISZ C400 JMP .-6 CDF 10 TAD I (7617 SNA /SOURCE FILE SPECIFIED? JMP CDERR CDF 0 CIF 10 JMS I (USR /FETCH HANDLER OF SOURCE FILE 1 SHEP, IDEVBUF+1 JMP CDERR TAD SHEP /GET ENTRY POINT DCA IDEVH CDF 10 TAD I (7620 CDF 0 DCA I (IBLOCK JMP STARTC F0T6, IDEVBUF C400, -400 PAGE STARTC, CDF 10 /CHECK /S - OPTION TAD I (7644 CDF 0 AND (40 SNA CLA JMP .+3 TAD (SPRINT DCA PTPRINT CDF CIF COMPFIELD JMP I (MAIN /START COMPILER CDERR, CLA CLL CDF CIF 0 CRLF TAD I CTEXT SNA JMP .+7 BSW JMS ASCII TAD I CTEXT JMS ASCII ISZ CTEXT JMP CDERR+3 CRLF JMP I (7605 CTEXT, .+1 TEXT /DATEIANGABEN FEHLERHAFT BZW. UNVOLLSTAENDIG (EV. AUCH SYSTEMFEHLER)!/ 0 PAGE /K E Y B O A R D I N P U T H A N D L E R *IDEVBUF XREAD, 0 CLA CLL TAD LOOK DCA CHAR TAD EOLN SZA CLA JMP XLINE REXIT, TAD I BP ISZ BP JMS CHECK JMP .-3 JMP I XREAD ERASE, TAD [215 JMS I ZPRINT XLINE, TAD (IBUFFER DCA BP TAD ("? JMS I ZPRINT TAD [240 JMS I ZPRINT XCHAR, JMS KEYBOARD DCA I BP TAD I BP TAD (-377 SNA CLA / 'RUBOUT'? JMP RUBOUT TAD I BP TAD (-203 SNA / 'CTRL-C'? JMP I OS8 TAD (203-212 SNA / 'LINE FEED'? JMP REPLAY TAD (212-215 SNA / 'RETURN'? JMP RETURN TAD (215-225 SNA / 'CTRL-U'? JMP ERASE TAD (225-232 SNA / 'CTRL-Z'? JMP EOFILE TAD (232-240 SPA CLA JMP XCHAR TAD I BP JMS I ZPRINT ISZ BP JMP XCHAR RUBOUT, TAD ("\ JMS I ZPRINT TAD BP TAD (-IBUFFER SNA CLA JMP YCHAR L7777 TAD BP DCA BP TAD I BP JMS I ZPRINT YCHAR, JMS KEYBOARD DCA I BP TAD I BP TAD (-377 SNA CLA JMP RUBOUT+2 TAD ("\ JMS I ZPRINT JMP XCHAR+2 REPLAY, TAD BP TAD (-IBUFFER SNA JMP XCHAR CIA DCA RC TAD (IBUFFER DCA BP TAD [215 JMS I ZPRINT TAD ("? JMS I ZPRINT TAD [240 JMS I ZPRINT TAD I BP JMS I ZPRINT ISZ BP ISZ RC JMP .-4 JMP XCHAR EOFILE, TAD [240 JMS I ZPRINT TAD ("E JMS I ZPRINT TAD ("O JMS I ZPRINT TAD ("F JMS I ZPRINT RETURN, TAD [215 JMS I ZPRINT TAD (IBUFFER DCA BP JMP REXIT KEYBOARD,0 KSF JMP .-1 KRB AND [177 SNA JMP KEYBOARD+1 TAD (200 JMP I KEYBOARD BP, IBUFFER RC=KEYBOARD PAGE /H E A D E R L I N E *ODEVBUF HEADER, 0 /ONCE ONLY CODE! CDF 10 TAD I (7666 /GET DATE WORD FROM MONITOR CDF 0 SNA JMP WHEAD-1 MQL TAD (HDATE DCA XR10 MQA /YEAR AND (7 TAD (116 /78 JMS YYMMDD MQA /MONTH BSW RTR AND (17 JMS YYMMDD MQA /DAY RTR RAR AND (37 JMS YYMMDD SKP DCA HDATE WHEAD, TAD (PASCAL-1 DCA XR10 TAD I XR10 SNA WHEND, JMP .+3 /BECOMES: JMP WHEXIT PRINTC JMP .-4 TAD H240 PRINTC ISZ BLANKS JMP .-3 TAD (JMP WHEXIT DCA WHEND JMP WHEAD+2 WHEXIT, CRLF CRLF JMP I HEADER YYMMDD, 0 DCA DAT01 DCA DAT10 JMP .+3 DCA DAT01 ISZ DAT10 TAD DAT01 TAD (-12 SMA JMP .-5 CLA ISZ XR10 TAD DAT10 TAD H260 DCA I XR10 TAD DAT01 TAD H260 DCA I XR10 JMP I YYMMDD H215=. PASCAL, 215;"P;240;"A;240;"S;240;"C;240;"A;240;"L 240;"-;240;"S;240;240;240 "C;"O;"M;"P;"I;"L;"E;"R H240, 240 "V H260, "0 VERSION+"0 0000 HTLMOE, "H;"T;"L;"-;"M;"O;"E;"D;"L;"I;"N;"G HDATE, ", /BECOMES: 0000 IF NO DATE SPECIFIED 240 0000 /YEAR 0000 "- 0000 /MONTH 0000 "- DAT10, 0000 /DAY DAT01, 0000 BLANKS, -30 /BECOMES 0000 PAGE /BEGIN OF COMPILER PROGRAM: T H E S C A N N E R NEXTCH=READC SY0=H1 /FIELD 0 REPRESENTATIVE OF 'SY' KSY=H2 SPS=H3 K=H4 INTORINP=PC *7000 INSY0, SKP CLA NEXTCH TAD CHAR TAD [-240 SNA CLA JMP .-4 SNALF JMP WSYMBOL SKDIG JMP SPSYM NUMBER, TAD (FRACTN DCA INTORINP DCA SY0 /0=INTCON JMS IINP TAD CHAR TAD (-". SZA CLA JMP ECHAR NEXTCH TAD CHAR TAD (-". SNA CLA JMP RETNUM-2 REALGO, L0001 DCA SY0 /1=REALCON TAD OC CIA DCA DC JMP I INTORINP ECHAR, ISZ INTORINP TAD CHAR TAD (-"E SNA CLA JMP REALGO JMP RETNUM TAD (": DCA CHAR RETNUM, JMS PACK TAD (NUM-1 RETID, DCA XR10 CDF COMPFIELD TAD AC0 DCA I XR10 TAD AC1 DCA I XR10 TAD AC2 DCA I XR10 TAD AC3 DCA I XR10 RETSYM, TAD SY0 CDF CIF COMPFIELD JMP I (EXSY3 WSYMBOL,DCA K /USE AC FOR ID IN FIELD 0 CLEAR AZ09, TAD K TAD (-ALNG SMA CLA JMP .+4 L0100 /=2*AC0, LINK=0 JMS CPACK ISZ K NEXTCH SKDIG SNALF JMP AZ09 L0001 /BUILD HASH-CODE TAD AC0 BSW RTL CLA TAD AC0 BSW TAD AC1 AND [77 RAL MQL /IN MQ MQA TAD (KSYTABLE DCA KSY MQA CLL RTL TAD (HASHTABLE-1 DCA XR10 CDF NAMEFIELD TAD I XR10 CIA TAD AC0 SZA CLA JMP XIDENT TAD I XR10 CIA TAD AC1 SZA CLA JMP XIDENT TAD I XR10 CIA TAD AC2 SZA CLA JMP XIDENT TAD I XR10 CIA TAD AC3 SZA CLA JMP XIDENT TAD I KSY JMP RETSYM+1 XIDENT, TAD (IDENT DCA SY0 TAD (ID-1 JMP RETID PAGE SPSYM, TAD CHAR TAD (CHARTABLE-240 DCA SPS CDF NAMEFIELD TAD I SPS CDF 0 SNA JMP ILLCHAR SPA JMP DBLCHAR RETSPS, DCA SY0 NEXTCH TAD SY0 RETSNGL,CDF CIF COMPFIELD JMP I (EXSY3 ILLCHAR,ERROR;30 /24 JMP I (INSY0+1 DBLCHAR,DCA .+3 NEXTCH TAD CHAR HLT /JMP X JMPCOL=JMP . CCOL, TAD (-"= SZA CLA JMP .+3 TAD (BECOMES JMP RETSPS TAD (COLON JMP RETSNGL JMPLSS=JMP . CLSS, TAD (-"= SNA JMP .+6 TAD ("=-"> SNA CLA JMP .+4 TAD (LSS JMP RETSNGL L0004 /LEQ=NEQ+4 TAD (NEQ JMP RETSPS JMPGTR=JMP . CGTR, TAD (-"= SNA CLA JMP .+3 TAD (GTR JMP RETSNGL TAD (GEQ JMP RETSPS JMPPER=JMP . CPER, TAD (-". SNA CLA JMP .+3 TAD (PERIOD JMP RETSNGL TAD (COLON JMP RETSPS JMPLPAR=JMP . CLPAR, TAD (-"* SNA CLA JMP .+3 TAD (LPARENT JMP RETSNGL NEXTCH TAD CHAR TAD (-"* SZA CLA JMP .-4 NEXTCH TAD CHAR TAD (-") SZA CLA JMP .-10 JMP I (INSY0+1 JMPAPOS=JMP I . CAPOS CPACK, 0 TAD K RAR DCA CPP TAD CHAR AND [77 SZL JMP .+3 BSW JMP .+5 MQL TAD I CPP AND [7700 MQA DCA I CPP CDF 0 JMP I CPACK CPP, 0 XSNALF, 0 TAD CHAR TAD (-"Z-1 CLL TAD ("Z+1-"A SNL CLA ISZ XSNALF JMP I XSNALF PAGE DISPLAY=7400 /-------- D I S P L A Y --------/ /DISPLAY,ZBLOCK 20 /AT RUNTIME ONLY /---------------------------------/ CAPOS, AND [77 LOAD DCA K SKP LBL2, NEXTCH TAD CHAR TAD (-"" SZA CLA JMP .+6 NEXTCH TAD CHAR TAD (-"" SZA CLA JMP LBL3 STL CDF COMPFIELD TAD I (SX CDF TABLEFIELD JMS CPACK ISZ K TAD EOLN SNA CLA JMP LBL2 DCA K LBL3, L0002 /2=CHARCON DCA SY0 L7777 TAD K SNA JMP RETNUM SPA CLA JMP ERR38 ISZ SY0 /3=STRING CDF COMPFIELD TAD I (SX LOAD TAD K DCA I (SLENG TAD I (SX TAD K DCA I (SX TAD I (SX STL RAR CIA TAD I (C SPA CLA FATAL7, FATAL JMP RETNUM ERR38, ERROR;46 /38 JMP .+3 ERR21, ERROR;25 /21 CLEAR JMP RETNUM ZERROR, 0 CLA CLL TAD I ZERROR CIF SETFIELD JMS I (F3ERROR JMP I ZERROR ZFATAL, 0 TAD ZFATAL CDF CIF SETFIELD JMP I (F3FATAL XNEXTCH,0 BREAK ISZ LL JMP NCH TAD ERRSW SNA CLA JMP NLN TAD (ERRLINE-1 DCA XR10 CDF SETFIELD TAD I XR10 CDF 0 TAD [240 PRINTC ISZ ERRSW JMP .-6 CRLF NLN, TAD EOF SZA CLA FATAL9, FATAL /PROGRAM INCOMPLETE! DCA CC TAD (5 DCA M CDF COMPFIELD TAD I (LC CDF 0 LOAD JMS IOUT PRINTC /CHAR = 240 ! PRINTC NCH, ISZ CC TAD EOLN SNA CLA JMP .+6 CRLF L7777 DCA LL JMS GETC JMP I XNEXTCH JMS GETC PRINTC JMP I XNEXTCH LL, 0 PAGE FIELD 2 *TAB /ENTRIES FOR PREDEFINED SYMBOLS: -1; VARIABLE^100+NOTYP; 0040; 0 0; KONSTANT^100+BOOLS; 0040; 0 1; KONSTANT^100+BOOLS; 0040; 1 2; TYPE1^100+REALS; 0040; 1 3; TYPE1^100+CHARS; 0040; 1 4; TYPE1^100+BOOLS; 0040; 1 5; TYPE1^100+INTS; 0040; 1 6; FUNKTION^100+REALS; 0040; 0 7; FUNKTION^100+REALS; 0040; 2 10; FUNKTION^100+BOOLS; 0040; 4 11; FUNKTION^100+CHARS; 0040; 5 12; FUNKTION^100+INTS; 0040; 6 13; FUNKTION^100+CHARS; 0040; 7 14; FUNKTION^100+CHARS; 0040; 10 15; FUNKTION^100+INTS; 0040; 11 16; FUNKTION^100+INTS; 0040; 12 17; FUNKTION^100+REALS; 0040; 13 20; FUNKTION^100+REALS; 0040; 14 21; FUNKTION^100+REALS; 0040; 15 22; FUNKTION^100+REALS; 0040; 16 23; FUNKTION^100+REALS; 0040; 17 24; FUNKTION^100+REALS; 0040; 20 25; FUNKTION^100+BOOLS; 0040; 21 26; FUNKTION^100+BOOLS; 0040; 22 27; PROZEDURE^100+NOTYP; 0040; 1 30; PROZEDURE^100+NOTYP; 0040; 2 31; PROZEDURE^100+NOTYP; 0040; 3 32; PROZEDURE^100+NOTYP; 0040; 4 33; PROZEDURE^100+NOTYP; 0040; 5 34; PROZEDURE^100+NOTYP; 0040; 6 35; FUNKTION^100+REALS; 0040; 23 36; PROZEDURE^100+NOTYP; 0040; 0 FIELD 3 /N A M E S OF S Y M B O L - T A B L E /THE FOLLOWING NAMES ARE PREDEFINED: *0 TEXT /@@@@@@@@/ *.-1 TEXT /FALSE@@@/ *.-1 TEXT /TRUE@@@@/ *.-1 TEXT /REAL@@@@/ *.-1 TEXT /CHAR@@@@/ *.-1 TEXT /BOOLEAN@/ *.-1 TEXT /INTEGER@/ *.-1 TEXT /ABS@@@@@/ *.-1 TEXT /SQR@@@@@/ *.-1 TEXT /ODD@@@@@/ *.-1 TEXT /CHR@@@@@/ *.-1 TEXT /ORD@@@@@/ *.-1 TEXT /SUCC@@@@/ *.-1 TEXT /PRED@@@@/ *.-1 TEXT /ROUND@@@/ *.-1 TEXT /TRUNC@@@/ *.-1 TEXT /SIN@@@@@/ *.-1 TEXT /COS@@@@@/ *.-1 TEXT /EXP@@@@@/ *.-1 TEXT /LN@@@@@@/ *.-1 TEXT /SQRT@@@@/ *.-1 TEXT /ARCTAN@@/ *.-1 TEXT /EOF@@@@@/ *.-1 TEXT /EOLN@@@@/ *.-1 TEXT /READ@@@@/ *.-1 TEXT /READLN@@/ *.-1 TEXT /WRITE@@@/ *.-1 TEXT /WRITELN@/ *.-1 TEXT /HALT@@@@/ *.-1 TEXT /ASCII@@@/ *.-1 TEXT /RANDOM@@/ *.-1 TEXT /@@@@@@@@/ /F S Y S AND S E T - C O N S T A N T S *4000 /---------------- FSYS, ZBLOCK 5 / M U S T BE AT 4000!!! /---------------- S1US2, ZBLOCK 5 SET0, 0;0;0;0;0 SET1, CONBGS, 7140;0000;0000;4000;0000 SET2, TYPBGS, 0000;0000;0006;4000;0000 SET3, BLOBGS, 0000;0000;0370;2000;0000 SET4, FACBGS, 7200;0020;0000;4000;0000 SET5, STATBGS,0000;0000;0000;3740;0000 SET6, 0000;0001;1000;0000;0000 SET7, 0000;0000;0370;6000;0000 SET8, 0140;0000;0000;0000;0000 SET9, 0000;0012;1000;0002;0000 SET10, 0000;0013;0000;0002;0000 SET11, 0000;0001;4000;4020;0000 SET12, 0000;0000;4000;4020;0000 SET13, 0000;0000;0040;4000;0000 SET14, 0000;0010;0000;0000;0000 SET15, 0000;0010;4000;0000;0000 SET16, 0000;0001;0000;4000;0000 SET17, 0000;0000;5000;0000;0000 SET18, 0000;0000;0000;4000;0000 SET19, 0000;0001;4000;4000;0000 SET20, 0000;0000;4000;0000;0000 SET21, 0000;0003;0000;0000;0000 SET22, 0000;0024;2000;0000;0000 SET23, 0000;0011;1000;0000;0000 SET24, 0000;0011;0000;0000;0000 SET25, 7000;0000;0000;0000;0000 SET26, 0037;0000;0000;0000;0000 SET27, 0140;4000;0000;0000;0000 SET28, 0000;3740;0000;0000;0000 SET29, 0000;2000;0400;0000;0000 SET30, 0000;0000;4000;0020;0000 SET31, 0000;0000;4000;3740;0000 SET32, 0000;0000;0000;0001;1000 SET33, 0000;0000;0000;0010;0000 SET34, 0000;0001;1000;0002;0000 SET35, 0000;0000;4000;0004;0000 SET36, 0000;0000;0000;0001;0000 SET37, 0000;0000;0400;0001;6000 SET38, 0000;0000;0000;0001;6000 SET39, 0000;0000;0000;0000;6000 SET40, 0000;0000;0000;7740;0000 SET41, 0000;0020;5000;0000;0000 SET42, 0000;0000;0030;0000;0000 SET43, 0000;0000;0000;2000;0000 SET44, 0000;0000;0370;3740;0000 SET45, 0000;0000;2000;0000;0000 SET46, 0000;0001;4000;4000;0000 /WORD- AND BIT-POSITION TABLE USED BY SET-ROUTINES: SETTABL,0;4000 0;2000 0;1000 0;0400 0;0200 0;0100 0;0040 0;0020 0;0010 0;0004 0;0002 0;0001 1;4000 1;2000 1;1000 1;0400 1;0200 1;0100 1;0040 1;0020 1;0010 1;0004 1;0002 1;0001 2;4000 2;2000 2;1000 2;0400 2;0200 2;0100 2;0040 2;0020 2;0010 2;0004 2;0002 2;0001 3;4000 3;2000 3;1000 3;0400 3;0200 3;0100 3;0040 3;0020 3;0010 3;0004 3;0002 3;0001 4;4000 4;2000 4;1000 4;0400 4;0200 4;0100 4;0040 4;0020 4;0010 4;0004 4;0002 4;0001 /H A S H - T A B L E OF K E Y W O R D S HASHTABLE=. DECIMAL /ADDRESSES SPECIFIED IN DECIMAL! ZBLOCK 128^4 /CLEAR UNUSED LOCATIONS! KSYTABLE=. /REMEMBER END OF HASHTABLE *2^4+HASHTABLE TEXT /AND/ *5^4+HASHTABLE TEXT /ARRAY/ *8^4+HASHTABLE TEXT /DIV/ *9^4+HASHTABLE TEXT /DO/ *10^4+HASHTABLE TEXT /END/ *13^4+HASHTABLE TEXT /FOR/ *16^4+HASHTABLE TEXT /CASE/ *18^4+HASHTABLE TEXT /IF/ *19^4+HASHTABLE TEXT /FUNCTION/ *20^4+HASHTABLE TEXT /ELSE/ *22^4+HASHTABLE TEXT /BEGIN/ *27^4+HASHTABLE TEXT /MOD/ *29^4+HASHTABLE TEXT /NOT/ *30^4+HASHTABLE TEXT /OF/ *31^4+HASHTABLE TEXT /OR/ *37^4+HASHTABLE TEXT /DOWNTO/ *39^4+HASHTABLE TEXT /PROCEDUR/ *41^4+HASHTABLE TEXT /TO/ *44^4+HASHTABLE TEXT /VAR/ *45^4+HASHTABLE TEXT /CONST/ *46^4+HASHTABLE TEXT /REPEAT/ *47^4+HASHTABLE TEXT /PROGRAM/ *51^4+HASHTABLE TEXT /TYPE/ *60^4+HASHTABLE TEXT /UNTIL/ *66^4+HASHTABLE TEXT /RECORD/ *68^4+HASHTABLE TEXT /THEN/ *70^4+HASHTABLE TEXT /WHILE/ /S Y M B O L - V A L U E S OF K E Y W O R D S *KSYTABLE ZBLOCK 128 /FOR SAFETY! PUSHTABLE=. /REMEMBER END OF KSYTABLE *2+KSYTABLE ANDSY *5+KSYTABLE ARRAYSY *8+KSYTABLE IDIVSY *9+KSYTABLE DOSY *10+KSYTABLE ENDSY *13+KSYTABLE FORSY *16+KSYTABLE CASESY *18+KSYTABLE IFSYM *19+KSYTABLE FUNCTIONSY *20+KSYTABLE ELSESY *22+KSYTABLE BEGINSY *27+KSYTABLE IMODSY *29+KSYTABLE NOTSY *30+KSYTABLE OFSY *31+KSYTABLE ORSY *37+KSYTABLE DOWNTOSY *39+KSYTABLE PROCEDURESY *41+KSYTABLE TOSY *44+KSYTABLE VARSY *45+KSYTABLE CONSTSY *46+KSYTABLE REPTSY *47+KSYTABLE PROGRAMSY *51+KSYTABLE TYPESY *60+KSYTABLE UNTILSY *66+KSYTABLE RECRDSY *68+KSYTABLE THENSY *70+KSYTABLE WHILSY OCTAL /P U S H T A B L E /CONTAINS THE NECESSARY INFORMATIONS (USED BY PUSHJUMP AND POPJUMP) /TO CALL THE COMPILER PROCEDURES RECURSIVELY, /TO SAVE THE LOCAL VARIABLES, TO PASS EVENTUAL PARAMETERS /AND RETURN CONTROL TO MAINLINE. / /FOR EACH PROCEDURE THERE IS ONE ENTRY OF 4 WORDS: /WORD 1: ADDRESS OF FIRST LOCAL VARIABLE (= 1ST PARAMETER) - 1 /WORD 2: - NUMBER OF LOCAL VAR'S (LOCATIONS) TO SAVE /WORD 3: NUMBER OF PARAMETERS ( + FSYS IF 1ST ONE IS A SET) / ( + 100*NO. OF VAR-PARAMETERS) /WORD 4: STARTING ADDRESS OF PROCEDURE *PUSHTABLE /BLOCK ISFUN-1; -5; FSYS+2; XBLOCK /STATEMENT 0; 0; FSYS; XSTATEMENT /ASSIGNMENT LV-1; -6; 2; XASSIGNMENT /COMPOUNDSTATEMENT 0; 0; 0; XCOMPOUND /IFSTATEMENT IXTYP-1; -4; 0; XIFSTATEMENT /CASESTATEMENT CASETAB-1; -137; 0; XCASESTATEMENT /REPEATSTATEMENT RXTYP-1; -3; 0; XREPEAT /WHILESTATEMENT WXTYP-1; -4; 0; XWHILE /FORSTATEMENT FXTYP-1; -6; 0; XFORSTATEMENT /STANDPROC PRCN-1; -5; 1; XSTPROC /SELECTOR SELVAR-1; -5; FSYS+200+1; XSELECT /CALL CALI-1; -5; FSYS+1; XCALL /STANDFCT FCTN-1; -2; 1; XSTFUN /FACTOR FACVAR-1; -3; FSYS+200+1; XFACTOR /TERM TRMXTYP-1; -4; FSYS+1; XTERM /SIMPLEEXPRESSION SIMXTYP-1; -4; FSYS+1; XSIMPLE /EXPRESSION EXPRVAR-1; -6; FSYS+200+1; XEXPRESSION /CONDECLARE CONREC-1; 0; 0; XCONDECL /TYPDECLARE DECTP-1; 0; 0; XTYPDECL /VARDECLARE VARTP-1; 0; 0; XVARDECL /PRODECLARE PROFUN-1; -1; 0; XPRODECL /CONSTANT CCON-1; 0; FSYS+1; XCONSTANT /ARRAYTYP ARRVAR-1; -6; 200+1; XARRAYTYP /TYPE TYPVAR-1; -12; FSYS+300+1; XTYPE /PARAMETERLIST PARTP-1; 0; 0; XPARAM /ONECASE 0; 0; 0; XONECASE /TABLE OF S P E C I A L S Y M B O L S / /ONE ENTRY FOR EACH ASCII CHARACTER: / =0 ... FOR ILLEGAL CHAR'S / >0 ... (=SYMBOL VALUE) FOR SINGLE SPECIAL CHAR'S / <0 ... (=JMP TO ROUTINE) FOR DOUBLE CHAR'S, COMMENTS OR STRINGS CHARTABLE=. /SPACE ! " # $ % & ' ( ) * + , - . / 0 0 JMPAPOS NEQ 0 0 ANDSY 0 JMPLPAR RPARENT TIMES PLUS COMMA MINUS JMPPER RDIVSY ZBLOCK "9-"0+1 /DIGITS ARE PROCESSED SEPARATELY! /: ; < = > ? @ JMPCOL SEMICOLON JMPLSS EQL JMPGTR 0 0 ZBLOCK "Z-"A+1 /LETTERS ARE PROCESSED SEPARATELY! /[ \ ] ^ _ LBRACK 0 RBRACK 0 0 /C O M P I L E R E R R O R S (NOT FATAL) /ERROR LINE BUFFER: ERRLINE,"#-240; "#-240; "#-240; "#-240; "#-240; 0; 0 ZBLOCK LLNG PAGE /ERROR ROUTINE: ERRNO, 0 /ERROR NUMBER ERRN01, 0 /ERROR NUMBER - UNITS ERRN10, 0 /ERROR NUMBER - TENS ERRPOS, 0 /POSITION OF ERROR ERRP, 0 ERRC, 0 /ERRSW, 0 /IN FIELD 0 /ERRSUM,0 /IN FIELD 6 F3ERROR,0 DCA ERRNO RDF TAD (CDF CIF DCA ERRCDI CDF 0 TAD I (CC TAD (ERRLINE+5 DCA ERRPOS TAD I (ERRSW CDF SETFIELD SZA CLA JMP ERRENT TAD (ERRLINE+5 DCA ERRP TAD (-LLNG DCA ERRC ISZ ERRP DCA I ERRP ISZ ERRC JMP .-3 ERRENT, TAD ERRNO DCA ERRN01 DCA ERRN10 JMP .+3 DCA ERRN01 ISZ ERRN10 TAD ERRN01 TAD (-12 /-10 SMA JMP .-5 CLA TAD I ERRPOS SZA CLA JMP ERREXIT /NO ROOM! TAD ("#-240 DCA I ERRPOS ISZ ERRPOS TAD ERRN10 SNA JMP .+4 TAD ("0-240 DCA I ERRPOS ISZ ERRPOS TAD ERRN01 TAD ("0-240 DCA I ERRPOS TAD ERRPOS TAD (-ERRLINE CMA CDF 0 DCA I (ERRSW ERREXIT,CDF ERRFIELD ISZ I ERRNO /REMEMBER THIS ERROR ISZ I (ERRSUM /COUNT ERRORS ERRCDI, CDF CIF 0 JMP I F3ERROR PAGE /C O M P I L E R E R R O R S (FATAL) FATADR, 0 FATPOS, 0 F3FATAL,DCA FATADR TAD FHEAD DCA FTEXT JMS FCRLF JMS FCRLF JMS FMESG TAD FLIST DCA FATPOS ISZ FATPOS TAD I FATPOS TAD FATADR SZA CLA JMP .-4 TAD FATPOS TAD FMFL DCA FATPOS TAD I FATPOS DCA FTEXT JMS FMESG JMS FCRLF CDF CIF ERRFIELD JMP I .+1 FXPLAIN FPRINT, 0 TLS TSF JMP .-1 CLA CLL JMP I FPRINT FCRLF, 0 TAD F215 JMS FPRINT TAD F212 JMS FPRINT JMP I FCRLF FMESG, 0 TAD I FTEXT BSW JMS FASCII TAD I FTEXT JMS FASCII ISZ FTEXT JMP FMESG+1 FASCII, 0 AND F77 SNA JMP I FMESG TAD F240 AND F77 TAD F240 JMS FPRINT JMP I FASCII FTEXT, 0 FLIST, FATLIST-1 FMFL, FATMESG-FATLIST FHEAD, FNN F215, 215 F212, 212 F240, 240 F77, 77 FATLIST,-FATAL0-1 -FATAL1-1 -FATAL2-1 -FATAL3-1 -FATAL4-1 -FATAL5-1 -FATAL6-1 -FATAL7-1 -FATAL8-1 -FATAL9-1 -FATALC-1 FATMESG,F00 F01 F02 F03 F04 F05 F06 F07 F08 F09 F0C FNN, TEXT /KOMPILATION ABGEBROCHEN - / F00, TEXT /MAGNETBAND-LESEFEHLER!/ F01, TEXT /ZU VIELE NAMEN!/ F02, TEXT /ZU VIELE PROZEDUREN UND\ODER RECORDS!/ F03, TEXT /ZU VIELE KONSTANTE!/ F04, TEXT /ZU VIELE ARRAYS!/ F05, TEXT /ZU VIELE UNTERPROGRAMMEBENEN!/ F06, TEXT /PROGRAMM ZU GROSS!/ F07, TEXT /ZU VIEL TEXT!/ F08, TEXT /PROGRAMM ZU KOMPLEX!/ F09, TEXT /PROGRAMM UNVOLLSTAENDIG!/ F0C, TEXT /ZU VIELE CASE-MARKEN!/ PAGE FIELD 4 /P A G E Z E R O /LOC'S 1 - 7 USED FOR TEMPORARY STORAGE! *7 L, 0 *10 /XR10, /AUTOINDEX REGISTER (SEE FIELD 0!) 0 XR11, 0 / --- " --- XR12, 0 *20 LC, 0 /L O C A T I O N C O U N T E R TEMP, 0 /I N S T R U C T I O N - R E G I S T E R /IRX, 0 /LEVEL /IRY, 0 /ADDRESS OR VALUE /I N D I C E S T O T A B L E S /B, /BLOCK TABLE 0001 /T, /SYMBOL TABLE 0037 A, /ARRAY TABLE 0 C, /CONSTANT TABLE ATAB-1 SX, /STRING TABLE 0 J, 0 /TEMPORARY FOR T JA, 0 /TEMPORARY FOR A JB, 0 /TEMPORARY FOR B LO, 0 /LOW BOUND OF ARRAY HI, 0 /HIGH BOUND OF ARRAY SLENG, 0 /LENGTH OF STRING SY, 0 /C U R R E N T S Y M B O L ID, 0;0;0;0 /C U R R E N T I D E N T I F I E R NUM, 0;0;0;0 /C O N S T A N T N U M B E R *50 /U N P A C K E D E N T R Y OF SYMBOL TABLE LINK0, 0 OBJ0, 0 TYP0, 0 REF0, 0 NORM0, 0 LEV0, 0 ADR0, 0 JW, 0 /ADDRESS OF ENTRY (REMEMBERED FOR 'WITHEND') *50 /U N P A C K E D E N T R Y OF ARRAY TABLE INXTP0, 0 ELTYP0, 0 ELREF0, 0 LOW0, 0 HIGH0, 0 ELSIZ0, 0 SIZE0, 0 JAW, 0 /ADDRESS OF ENTRY (REMEMBERED FOR 'WITHAEND') /LOCAL VAR'S OF PROCEDURE B L O C K ISFUN, 0 LEVEL, 0 DX, 0 PRT, 0 PRB, 0 /LOCAL VAR'S OF PROCEDURE F A C T O R FACVAR, 0 FACXTYP,0 FACXREF,0 /LOCAL VAR'S OF PROCEDURE C A L L CALI, 0 CALXTYP,0 CALXREF,0 CALASTP,0 CALCP, 0 /LOCAL VAR'S OF P U S H J U M P AND P O P J U M P LOCAL, 0 LENGTH, 0 PARAM, 0 /M A C R O I N S T R U C T I O N S USED BY COMPILER *100 /ERROR=JMS I . /PARALLEL DEFINED WITH FIELD 0! XERROR /FATAL=JMS I . / -"- XFATAL /OFTAB=JMS I . / -"- XOFTAB /OFATAB=JMS I . / -"- XOFATAB /OFBTAB=JMS I . / -"- XOFBTAB /OFDISPLAY=JMS I . / -"- XOFDISP /TODISPLAY=JMS I . / -"- XTODISP /GETCONSTANT=JMS I . / -"- XOFCONST TOTAB=JMS I . /PUT INFO INTO SYMBOL TABLE XTOTAB TOATAB=JMS I . /PUT INFO INTO ARRAY TABLE XTOATAB TOBTAB=JMS I . /PUT INFO INTO BLOCK TABLE XTOBTAB WITHTABDO=JMS I . /GET AND UNPACK ENTRY OF SYMBOL TABLE XWITHTAB ENDWITH=JMS I . /PACK AND STORE ENTRY OF SYMBOL TABLE XENDWITH WITHATABDO=JMS I . /GET AND UNPACK ENTRY OF ARRAY TABLE XWITHATAB ENDAWITH=JMS I . /PACK AND STORE ENTRY OF ARRAY TABLE XENDAWITH TOCODE=JMS I . /INSERT ADDRESS INTO CODE[LC].IRY XTOCODE EMIT=JMS I . /OUTPUT INSTRUCTION OF INTERMEDIATE CODE XEMIT ENTER=JMS I . /ENTER ITEM INTO SYMBOL TABLE XENTER ENTERVARIABLE=JMS I . /ENTER VARIABLE INTO SYMBOL TABLE XENTVAR ENTERARRAY=JMS I . /INTO ARRAY TABLE XENTARR ENTERBLOCK=JMS I . /INTO BLOCK TABLE XENTBLO ENTERCONSTANT=JMS I . /INTO CONSTANT TABLE XENTCON SIGNEDINTEGER=JMS I . /MAKE SIGNED 12-BIT INTEGER OF (NUM) XSGNINT TEST=JMS I . /CHECK AND SKIP TO LEGAL FOLLOW SYMBOL XTEST TESTSEMICOLON=JMS I . XTSTSEM SKIP=JMS I . /SKIP TO LEGAL FOLLOW SYMBOL XSKIP SKIPIFSYIN=JMS I . /SKIP NEXT INSTR. IF SY IN SETX INSET UNION=JMS I . /SET UNION XUNION IFSY=JMS I . /IF SY=SYMBOL THEN NEXT INSTR. ELSE SKIP XIFSY IFSYNOT=JMS I . /IF SY<>SYMBOL THEN NEXT INSTR. ELSE SKIP XIFSYNOT LOCATE=JMS I . /LOCATE IDENTIFIER IN SYMBOL TABLE XLOCATE PUSHJUMP=JMS I . /RECURSIVE PROCEDURE CALL XPUSHJUMP POPJUMP=JMS I . /RETURN FROM PROCEDURE XPOPJUMP RESULTTYPE=JMS I . XRESULT INSYMBOL=JMS I . /SCANNER XINSYMBOL /LOCAL VAR'S OF PROCEDURE T Y P E TYPVAR, 0 TP, 0 RF, 0 SZ, 0 ELTP, 0 ELRF, 0 ELSZ, 0 OFFSET, 0 TT0, 0 TT1, 0 /LOCAL VAR'S OF PROCEDURE W H I L E - STATEMENT WXTYP, 0 WXREF, 0 WLC1, 0 WLC2, 0 /M A I N P R O G R A M OF COMPILER *200 MAIN, INSYMBOL IFSYNOT;PROGRAMSY;JMP MAIN3 INSYMBOL IFSYNOT;IDENT;JMP MAIN2 INSYMBOL IFSY;LPARENT;JMP .+4 ERROR;11 /9 JMP ENDOFH IOFILES,INSYMBOL IFSY;IDENT;JMP .+4 ERROR;2 /2 SKP INSYMBOL IFSY;COMMA;JMP IOFILES ENDOFH, IFSY;RPARENT;JMP .+4 ERROR;4 /4 SKP INSYMBOL MAINBL, TAD (BTAB+3 DCA XR10 CDF TABLEFIELD TAD T DCA I XR10 L0001 DCA I XR10 DCA I XR10 DCA I XR10 CDF COMPFIELD PUSHJUMP;BLOCK SET44 0 /FALSE 1 IFSYNOT;PERIOD;ERROR;26 /22 EMIT;45 /(37) CDF CIF ERRFIELD JMP I (EXPLAIN /DO THE COMPILATION REPORT MAIN2, ERROR;2 /2 JMP MAINBL MAIN3, ERROR;3 /3 JMP MAINBL /EXTENSION OF P U S H J U M P AND P O P J U M P ROUTINES VARIN, 0 TAD PARAM AND (700 SNA JMP I VARIN BSW CIA DCA LENGTH ISZ LOCAL L7777 TAD I LOCAL DCA XR11 TAD I XR11 DCA I XR10 ISZ LENGTH JMP .-3 JMP I VARIN VARTM, 0 DCA VARVAR TAD PARAM AND (700 SNA JMP I VARTM BSW CIA DCA VARIN TAD VARIN DCA VARVAR TAD LOCAL DCA XR10 L7777 TAD I XR10 DCA XR11 DCA XR12 /USE LOC'S 1 - 7 FOR TEMP. STORAGE TAD I XR10 DCA I XR12 ISZ VARIN JMP .-3 JMP I VARTM VAREX, 0 TAD VARVAR SNA CLA JMP I VAREX DCA XR10 TAD I XR10 DCA I XR11 ISZ VARVAR JMP .-3 JMP I VAREX VARVAR, 0 PAGE /PROCEDURE C O N S T A N T / --------------- / /CALL: PUSHJUMP;CONSTANT / SETX / C /ADDRESS / /LOCAL VAR'S: FSYS CCON, 0 SIGN, 0 XCONSTANT, DCA I CCON TAD CCON DCA XR10 DCA I XR10 DCA I XR10 DCA I XR10 DCA I XR10 TEST;CONBGS;FSYS;62 /50 SKIPIFSYIN;CONBGS JMP CON6 IFSYNOT;CHARCON;JMP .+4 L0004 /4=CHARS DCA I CCON JMP CON4 DCA SIGN /+ SKIPIFSYIN;SET8 JMP CON1 IFSY;MINUS;L4000 DCA SIGN INSYMBOL CON1, IFSYNOT;IDENT;JMP CON2 LOCATE SNA JMP CON5-1 DCA J OFTAB;OBJ MQL MQA BSW AND [77 TAD (-KONSTANT SNA CLA JMP .+4 ERROR;31 /25 JMP CON5-1 MQA AND [77 DCA I CCON OFTAB;ADR DCA NUM+3 DCA NUM+2 DCA NUM+1 DCA NUM L7776 /2=REALS TAD I CCON SZA IAC /1=INTS SZA CLA JMP CON3 TAD NUM+3 GETCONSTANT JMP CON3 CON2, IFSY;INTCON;JMP CON3-2 IFSY;REALCON;JMP CON3-3 SKIP;FSYS;62 /50 JMP CON5 L0001 IAC DCA I CCON CON3, TAD SIGN TAD NUM+1 DCA NUM+1 CON4, TAD CCON DCA XR10 TAD NUM DCA I XR10 TAD NUM+1 DCA I XR10 TAD NUM+2 DCA I XR10 TAD NUM+3 DCA I XR10 INSYMBOL CON5, TEST;FSYS;SET0;6 /6 CON6, POPJUMP;CONSTANT PAGE /PROCEDURE A R R A Y T Y P / --------------- / /CALL: PUSHJUMP;ARRAYTYP / REF /ADDRESS / SIZE /ADDRESS / /LOCAL VAR'S: ARRVAR, 0 AREF, 0 ARSZ, 0 ALTP, 0 ALRF, 0 ALSZ, 0 LOWB, ZBLOCK 5 HIGHB, ZBLOCK 5 MULT=HIGHB XARRAYTYP, PUSHJUMP;CONSTANT FSYS+SET9 LOWB L7776 /2=REALS TAD LOWB SZA CLA JMP ARR1 ERROR;33 /27 L0001 /1=INTS DCA LOWB DCA LOWB+1 DCA LOWB+2 DCA LOWB+3 DCA LOWB+4 ARR1, IFSY;COLON;JMP .+4 ERROR;15 /13 SKP INSYMBOL PUSHJUMP;CONSTANT FSYS+SET10 HIGHB TAD HIGHB CIA TAD LOWB SNA CLA JMP ARR2 ERROR;33 /27 TAD LOWB+1 DCA HIGHB+1 TAD LOWB+2 DCA HIGHB+2 TAD LOWB+3 DCA HIGHB+3 TAD LOWB+4 DCA HIGHB+4 ARR2, SIGNEDINTEGER;LOWB DCA LO SIGNEDINTEGER;HIGHB DCA HI TAD LOWB ENTERARRAY TAD A DCA AREF IFSYNOT;COMMA;JMP ARR3 INSYMBOL TAD [ARRAY DCA ALTP PUSHJUMP;ARRAYTYP ALRF /ALSZ JMP ARR4 ARR3, IFSY;RBRACK;JMP .+5 ERROR;14 /12 IFSY;RPARENT;INSYMBOL IFSY;OFSY;JMP .+4 ERROR;10 /8 SKP INSYMBOL PUSHJUMP;TYPE FSYS ALTP /ALRF /ALSZ ARR4, TAD AREF DCA JA WITHATABDO TAD LOW0 CIA TAD HIGH0 IAC DCA TEMP TAD ALSZ CIA DCA MULT TAD TEMP ISZ MULT JMP .-2 DCA ARSZ TAD ARSZ DCA SIZE0 TAD ALTP DCA ELTYP0 TAD ALRF DCA ELREF0 TAD ALSZ DCA ELSIZ0 ENDAWITH POPJUMP;ARRAYTYP PAGE /PROCEDURE T Y P E / ------- / /CALL: PUSHJUMP;TYPE / SETX / TYP /ADDRESS / REF / --"-- / SIZE / --"-- / /LOCAL VAR'S (ON PAGE ZERO!): / FSYS / TYPVAR, 0 / TP, 0 / RF, 0 / SZ, 0 / ELTP, 0 / ELRF, 0 / ELSZ, 0 / OFFSET, 0 / TT0, 0 / TT1, 0 XTYPE, DCA TP /0=NOTYP DCA RF DCA SZ TEST;TYPBGS;FSYS;12 /10 SKIPIFSYIN;TYPBGS POPJUMP;TYPE IFSYNOT;IDENT;JMP TYP1 LOCATE SNA JMP TYP1-2 DCA J WITHTABDO TAD OBJ0 TAD [-TYPE1 SNA CLA JMP .+4 ERROR;35 /29 JMP TYP1-2 TAD TYP0 DCA TP TAD REF0 DCA RF TAD ADR0 DCA SZ TAD TYP0 SNA CLA ERROR;36 /30 INSYMBOL JMP TYP7 TYP1, IFSYNOT;ARRAYSY;JMP TYP2 INSYMBOL IFSY;LBRACK;JMP .+5 ERROR;13 /11 IFSY;LPARENT;INSYMBOL TAD [ARRAY DCA TP PUSHJUMP;ARRAYTYP RF /SZ JMP TYP7 TYP2, INSYMBOL ENTERBLOCK L0006 /6=RECORD DCA TP TAD B DCA RF TAD LEVEL TAD [-LMAX SNA CLA FATAL5, FATAL ISZ LEVEL TAD B TODISPLAY DCA OFFSET TYP3, SKIPIFSYIN;SET46;JMP TYP6 IFSYNOT;IDENT;JMP TYP5 TAD T DCA TT0 SKP INSYMBOL ENTERVARIABLE IFSY;COMMA;JMP .-4 IFSY;COLON;JMP .+4 ERROR;5 /5 SKP INSYMBOL TAD T DCA TT1 PUSHJUMP;TYPE FSYS+SET11 ELTP /ELRF /ELSZ TYP4, TAD TT0 CIA TAD TT1 SPA SNA CLA JMP TYP5 ISZ TT0 TAD TT0 WITHTABDO TAD ELTP DCA TYP0 TAD ELRF DCA REF0 TAD [40 DCA NORM0 TAD OFFSET DCA ADR0 TAD OFFSET TAD ELSZ DCA OFFSET ENDWITH JMP TYP4 PAGE TYP5, IFSY;ENDSY;JMP TYP6 IFSY;SEMICOLON;JMP .+5 ERROR;16 /14 IFSY;COMMA;INSYMBOL TEST;SET12;FSYS;6 /6 JMP TYP3 TYP6, TAD RF DCA JB TAD OFFSET TOBTAB;VSIZE TAD OFFSET DCA SZ TOBTAB;PSIZE INSYMBOL L7777 TAD LEVEL DCA LEVEL TYP7, TEST;FSYS;SET0;6 /6 POPJUMP;TYPE /PROCEDURE C O N D E C L / ------------- / /CALL: PUSHJUMP;CONDECL /NO ARG'S! / /LOCAL VAR'S: CONREC, ZBLOCK 5 XCONDECL, INSYMBOL TEST;SET18;BLOBGS;2 /2 CDEC1, IFSYNOT;IDENT;POPJUMP;CONDECL ENTER;KONSTANT INSYMBOL IFSY;EQL;JMP .+5 ERROR;20 /16 IFSY;BECOMES;INSYMBOL PUSHJUMP;CONSTANT FSYS+SET19 CONREC TAD T WITHTABDO TAD CONREC /TYP DCA TYP0 DCA REF0 L7776 TAD CONREC SZA IAC SZA CLA JMP .+4 ENTERCONSTANT;CONREC SKP TAD CONREC+4 DCA ADR0 ENDWITH TESTSEMICOLON JMP CDEC1 /PROCEDURE T Y P D E C L / ------------- / /CALL: PUSHJUMP;TYPDECL /NO ARG'S! / /LOCAL VAR'S: DECTP, 0 DECRF, 0 DECSZ, 0 DT1, 0 XTYPDECL, INSYMBOL TEST;SET18;BLOBGS;2 /2 TDEC1, IFSYNOT;IDENT;POPJUMP;TYPDECL ENTER;TYPE1 TAD T DCA DT1 INSYMBOL IFSY;EQL;JMP .+5 ERROR;20 /16 IFSY;BECOMES;INSYMBOL PUSHJUMP;TYPE FSYS+SET19 DECTP /DECRF /DECSZ TAD DT1 WITHTABDO TAD DECTP DCA TYP0 TAD DECRF DCA REF0 TAD DECSZ DCA ADR0 ENDWITH TESTSEMICOLON JMP TDEC1 PAGE /PROCEDURE P A R A M E T E R L I S T / ------------------------- / /CALL: PUSHJUMP;PARAMETERLIST /NO ARG'S! / /LOCAL VAR'S: PARTP, 0 PARRF, 0 PARSZ, 0 PT0, 0 VALPAR, 0 XPARAM, INSYMBOL DCA PARTP DCA PARRF DCA PARSZ TEST;SET13;FSYS+SET14;7 /7 PAR1, SKIPIFSYIN;SET13 JMP PAR5 IFSYNOT;VARSY;JMP .+3 INSYMBOL SKP TAD [40 DCA VALPAR TAD T DCA PT0 ENTERVARIABLE IFSYNOT;COMMA;JMP .+4 INSYMBOL ENTERVARIABLE JMP .-5 IFSY;COLON;JMP .+4 ERROR;5 /5 JMP PAR3 INSYMBOL IFSY;IDENT;JMP .+4 ERROR;2 /2 JMP PAR2 LOCATE DCA J INSYMBOL TAD J SNA CLA JMP PAR2 WITHTABDO TAD OBJ0 TAD [-TYPE1 SNA CLA JMP .+4 ERROR;35 /29 JMP PAR2 TAD TYP0 DCA PARTP TAD REF0 DCA PARRF TAD VALPAR SZA CLA JMP .+3 L0001 SKP TAD ADR0 DCA PARSZ PAR2, TEST;SET15;FSYS+SET16;16 /14 PAR3, TAD PT0 CIA TAD T SPA SNA CLA JMP PAR4 ISZ PT0 TAD PT0 WITHTABDO TAD PARTP DCA TYP0 TAD PARRF DCA REF0 TAD VALPAR DCA NORM0 TAD DX DCA ADR0 TAD LEVEL DCA LEV0 ENDWITH TAD DX TAD PARSZ DCA DX JMP PAR3 PAR4, IFSY;RPARENT;JMP PAR6 IFSY;SEMICOLON;JMP .+5 ERROR;16 /14 IFSY;COMMA;INSYMBOL TEST;SET13;FSYS+SET14;6 /6 JMP PAR1 PAR5, IFSY;RPARENT;JMP PAR6 ERROR;4 /4 JMP .+6 PAR6, INSYMBOL TEST;SET17;FSYS;6 /6 POPJUMP;PARAMETERLIST PAGE /PROCEDURE V A R D E C L / ------------- / /CALL: PUSHJUMP;VARDECL /NO ARG'S! / /LOCAL VAR'S: VARTP, 0 VARRF, 0 VARSZ, 0 VT0, 0 VT1, 0 XVARDECL, INSYMBOL IFSYNOT;IDENT;POPJUMP;VARDECL TAD T DCA VT0 ENTERVARIABLE IFSYNOT;COMMA;JMP .+4 INSYMBOL ENTERVARIABLE JMP .-5 IFSY;COLON;JMP .+4 ERROR;5 /5 SKP INSYMBOL TAD T DCA VT1 PUSHJUMP;TYPE FSYS+SET19 VARTP /VARRF /VARSZ VAR1, TAD VT0 CIA TAD VT1 SPA SNA CLA JMP VAR2 ISZ VT0 TAD VT0 WITHTABDO TAD VARTP DCA TYP0 TAD VARRF DCA REF0 TAD LEVEL DCA LEV0 TAD DX DCA ADR0 TAD [40 DCA NORM0 ENDWITH TAD VARSZ TAD DX DCA DX JMP VAR1 VAR2, TESTSEMICOLON JMP XVARDECL+1 /PROCEDURE P R O D E C L / ------------- / /CALL: PUSHJUMP;PRODECL /NO ARG'S! / /LOCAL VAR'S: PROFUN, 0 /SEE BELOW! XPRODECL, IFSY;FUNCTIONSY;L0001 DCA PROFUN INSYMBOL IFSY;IDENT;JMP .+7 ERROR;2 /2 DCA ID DCA ID+1 DCA ID+2 DCA ID+3 TAD (PROZEDURE TAD PROFUN DCA .+2 ENTER;00 /FUNCTION OR PROCEDURE TAD T DCA J OFTAB;NORMAL AND (7737 TAD [40 TOTAB;NORMAL INSYMBOL L0001 TAD LEVEL DCA .+5 PUSHJUMP;BLOCK FSYS+SET20 PROFUN, 0 0 IFSY;SEMICOLON;JMP .+4 ERROR;16 /14 SKP INSYMBOL TAD [40 TAD PROFUN DCA .+2 EMIT;00 /*** (32) OR (33) ***/ POPJUMP;PRODECL PAGE /PROCEDURE S E L E C T O R / --------------- / /CALL: PUSHJUMP;SELECTOR / SETX / V /ADDRESS / /LOCAL VAR'S: FSYS SELVAR, 0 SELVTYP,0 SELVREF,0 SELXTYP,0 SELXREF,0 XSELECT, IFSYNOT;PERIOD;JMP SEL2 INSYMBOL /FIELD SELECTOR IFSY;IDENT;JMP .+4 ERROR;2 /2 JMP SEL5 TAD SELVTYP TAD [-RECORD SNA CLA JMP .+4 ERROR;37 /31 JMP SEL1 TAD SELVREF OFBTAB;LAST DCA J JMS ENTID JMS CHKID JMP .+5 OFTAB;LINK DCA J JMP .-5 TAD J SNA CLA ERROR;0 /0 WITHTABDO TAD TYP0 DCA SELVTYP TAD REF0 DCA SELVREF TAD ADR0 SNA JMP SEL1 DCA IRY EMIT;11 /*** (9) ***/ SEL1, INSYMBOL JMP SEL5 SEL2, IFSYNOT;LBRACK;ERROR;13 /11 SEL3, INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET21 SELXTYP TAD SELVTYP TAD [-ARRAY SNA CLA JMP .+4 ERROR;34 /28 JMP SEL4 TAD SELVREF /ARRAY INDEX DCA JA OFATAB;INXTYP CIA TAD SELXTYP SNA CLA JMP .+4 ERROR;32 /26 JMP SEL6 TAD JA DCA IRY OFATAB;ELSIZE CLL RAR /1 SCOMPARES! SZA CLA L0001 TAD (24 DCA .+2 EMIT;00 /*** (20) OR (21) ***/ SEL6, OFATAB;ELTYP DCA SELVTYP OFATAB;ELREF DCA SELVREF SEL4, IFSY;COMMA;JMP SEL3 IFSY;RBRACK;JMP .+5 ERROR;14 /12 IFSY;RPARENT;INSYMBOL SEL5, SKIPIFSYIN;SET22 SKP JMP XSELECT TEST;FSYS;SET0;6 /6 POPJUMP;SELECTOR PAGE /FUNCTION R E S U L T T Y P E / ------------------- / /CALL: TAD XTYP / MQL / TAD YTYP / RESULTTYPE / /RETURNS RESULTTYPE IN ACCUMULATOR XRESULT,0 SZA SWP SNA JMP I XRESULT TAD [-2 /HERE: XTYP<>0 AND YTYP<>0, XTYP IN AC SMA SZA JMP RES33 SWP /YTYP IN AC TAD [-2 SMA SZA JMP RES33 SNA /HERE ONLY INTS OR REALS, YTYP IN AC JMP .+5 /(7777 ... INTS, 0000 ... REALS) SWP SZA CLA JMP RES1 /INTS - INTS JMP .+5 /REALS - INTS SWP SNA CLA JMP .+5 /REALS - REALS L0001 /INTS - REALS DCA IRY EMIT;32 /*** (26,0) OR (26,1) ***/ IAC RES1, IAC JMP I XRESULT RES33, CLA CLL ERROR;41 /33 JMP I XRESULT /PROCEDURE C A L L / ------- / /CALL: PUSHJUMP;CALL / SETX / I /VALUE / /LOCAL VAR'S (ON PAGE ZERO!): / FSYS / CALI, 0 / CALXTYP,0 / CALXREF,0 / CALASTP,0 / CALCP, 0 XCALL, TAD CALI DCA IRY EMIT;22 /*** (18,I) ***/ TAD CALI OFTAB;REF BSW AND [77 OFBTAB;LASTPAR DCA CALASTP TAD CALI DCA CALCP IFSYNOT;LPARENT;JMP CAL5 CAL1, INSYMBOL TAD CALASTP CIA TAD CALCP SMA CLA JMP CAL4-2 ISZ CALCP TAD CALCP OFTAB;NORMAL AND [40 SNA CLA JMP CAL3 PUSHJUMP;EXPRESSION /VALUE PARAMETER FSYS+SET23 CALXTYP TAD CALCP OFTAB;TYP AND [77 DCA TEMP TAD TEMP CIA TAD CALXTYP SZA CLA JMP CAL2 TAD CALCP OFTAB;REF BSW AND [77 CIA TAD CALXREF SZA CLA JMP CAL36 TAD CALXTYP TAD [-ARRAY SZA JMP .+5 TAD CALXREF OFATAB;SIZE JMP .+7 CLL RAR /6=RECORD SZA CLA JMP CAL4 TAD CALXREF OFBTAB;VSIZE DCA IRY EMIT;26 /*** (22,SIZE) ***/ JMP CAL4 CAL2, L7777 /1=INTS TAD CALXTYP SZA CLA JMP .+10 L7776 /2=REALS TAD TEMP SZA CLA JMP .+4 EMIT;32 /*** (26,0) ***/ JMP CAL4 TAD CALXTYP SZA CLA JMP CAL36 JMP CAL4 PAGE CAL3, IFSY;IDENT;JMP .+4 /VARIABLE PARAMETER ERROR;2 /2 JMP CAL4 LOCATE DCA J INSYMBOL TAD J SNA CLA JMP CAL4 WITHTABDO L7777 /1=VARIABLE TAD OBJ0 SZA CLA ERROR;45 /37 TAD TYP0 DCA CALXTYP TAD REF0 DCA CALXREF TAD LEV0 DCA IRX TAD ADR0 DCA IRY TAD NORM0 SNA CLA IAC DCA .+2 EMIT;00 /*** (0,LEV,ADR) OR (1,LEV,ADR) ***/ SKIPIFSYIN;SET22 JMP .+5 PUSHJUMP;SELECTOR FSYS+SET23 CALXTYP TAD CALCP OFTAB;TYP AND [77 CIA TAD CALXTYP SZA CLA JMP CAL36 TAD CALCP OFTAB;REF BSW AND [77 CIA TAD CALXREF SZA CLA CAL36, ERROR;44 /36 JMP CAL4 ERROR;47 /39 CAL4, TEST;SET24;FSYS;6 /6 IFSY;COMMA;JMP CAL1 IFSY;RPARENT;JMP .+4 ERROR;4 /4 SKP INSYMBOL CAL5, TAD CALASTP CIA TAD CALCP SPA CLA ERROR;47 /39 TAD CALI OFTAB;REF DCA TEMP TAD TEMP BSW AND [77 OFTAB;PSIZE TAD (-1 DCA IRY EMIT;23 /*** (19,PSIZE-1) ***/ TAD TEMP AND [17 CIA TAD LEVEL SPA SNA CLA JMP CAL6 TAD LEVEL DCA IRX /SWAPPED CONTENTS OF IRX AND IRY HERE! TAD TEMP /(SEE INTERPRETER AT I03) AND [17 DCA IRY EMIT;3 /*** (3,LEV1,LEV2) ***/ CAL6, POPJUMP;CALL PAGE /PROCEDURE S T A N D F C T / --------------- / /CALL: PUSHJUMP;STANDFCT / N /VALUE / /LOCAL VAR'S: FCTN, 0 /NUMBER OF STANDARD FUNCTION FCTJ, 0 XSTFUN, TAD FCTN TAD (-20 /-16 SMA SZA CLA JMP STF17 IFSY;LPARENT;JMP .+4 ERROR;11 /9 SKP INSYMBOL TAD J /J IS SET IN FACTOR DCA FCTJ PUSHJUMP;EXPRESSION FSYS+SET14 FACXTYP TAD FCTJ DCA J L7776 TAD FCTN SMA SZA CLA JMP STF1 /FCTN: 0,2 L0004 /4=FUNKTION BSW /(MUST INSERT OBJ TAD FACXTYP /ALONG WITH TYP!) TOTAB;TYP L7776 /2=REALS TAD FACXTYP SNA CLA ISZ FCTN JMP STF2 STF1, TAD FCTN TAD (-10 SPA SNA CLA JMP STF2 /FCTN: 4,5,6,7,8 L7777 /FCTN: 9,10,11, ... ,16 TAD FACXTYP /1=INTS SNA CLA EMIT;32 /*** (26,0) ***/ STF2, TAD (TSET TAD FCTN DCA TEMP TAD FACXTYP STL RAL TAD (SETTABLE DCA ARGXTYP TAD I TEMP CDF SETFIELD AND I ARGXTYP CDF COMPFIELD SNA CLA JMP STF3 TAD FCTN DCA IRY EMIT;10 /*** (8,N) ***/ JMP .+5 STF3, TAD FACXTYP SZA CLA ERROR;60 /48 IFSY;RPARENT;JMP .+4 ERROR;4 /4 SKP INSYMBOL STF4, OFTAB;TYP /(J STILL OKAY!?) AND [77 DCA FACXTYP POPJUMP;STANDFCT STF17, TAD FCTN DCA IRY EMIT;10 /*** (8,17) OR (8,18) OR (8,19) ***/ JMP STF4 /TABLE OF LEGAL ARGUMENT TYPES: TSET, 3000 /0 3000 3000 /2 3000 2000 /4 2000 /5 2600 /6 0200 /7 0200 /8 3000 /9 3000 3000 3000 3000 3000 3000 3000 /16 ARGXTYP,0 PAGE /PROCEDURE F A C T O R / ----------- / /CALL: PUSHJUMP;FACTOR / SETX / X /ADDRESS / /LOCAL VAR'S (ON PAGE ZERO!): / FSYS / FACVAR, 0 / FACXTYP,0 / FACXREF,0 XFACTOR,DCA FACXTYP /0=NOTYP DCA FACXREF TEST;FACBGS;FSYS;72 /58 FAC1, SKIPIFSYIN;FACBGS POPJUMP;FACTOR IFSYNOT;IDENT;JMP FAC2 LOCATE DCA J INSYMBOL WITHTABDO TAD OBJ0 TAD (JMP I FACTABL DCA .+1 HLT FACTABL,FKON FVAR FTYP FPRO FFUN FKON, TAD TYP0 DCA FACXTYP DCA FACXREF TAD ADR0 DCA IRY L7777 /1=INTS TAD TYP0 CLL RAR /2=REALS SNA CLA IAC TAD (30 DCA .+2 EMIT;00 /*** (24,ADR) OR (25,ADR) ***/ JMP FAC3 FVAR, TAD TYP0 DCA FACXTYP TAD REF0 DCA FACXREF TAD LEV0 DCA IRX TAD ADR0 DCA IRY SKIPIFSYIN;SET22 JMP FVAR1 TAD NORM0 SNA CLA IAC DCA .+2 EMIT;00 /*** (0,LEV,ADR) OR (1,LEV,ADR) ***/ PUSHJUMP;SELECTOR FSYS FACXTYP TAD FACXTYP TAD [-4 /STANTYPS = NOTYP(0) ... CHAR(4) SPA SNA CLA EMIT;42 /*** (34) ***/ JMP FAC3 FVAR1, DCA .+11 /F=0 TAD FACXTYP TAD [-4 SPA SNA CLA ISZ .+5 /F:=F+1 (IN STANTYPS!) TAD NORM0 SNA CLA ISZ .+2 /F:=F+1 EMIT;00 /*** (F,LEV,ADR) ***/ JMP FAC3 FTYP, FPRO, ERROR;54 /44 JMP FAC3 FFUN, TAD TYP0 DCA FACXTYP TAD LEV0 SNA CLA JMP STFUN TAD J DCA .+4 PUSHJUMP;CALL FSYS 0 JMP FAC3 STFUN, TAD ADR0 DCA .+3 PUSHJUMP;STANDFCT 0 JMP FAC3 PAGE FAC2, SKIPIFSYIN;SET25 JMP FAC23 L7776 /2=CHARCON TAD SY SNA CLA JMP FAC21 L0001 TAD SY DCA FACXTYP /INTS OR REALS ENTERCONSTANT;NUM-1 DCA IRY EMIT;31 /*** (25,C) ***/ JMP FAC22 FAC21, L0004 /4=CHARS DCA FACXTYP TAD NUM+3 DCA IRY EMIT;30 /*** (24,NUM) ***/ FAC22, DCA FACXREF INSYMBOL JMP FAC3 FAC23, IFSYNOT;LPARENT;JMP FAC24 INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET14 FACXTYP IFSY;RPARENT;JMP .+4 ERROR;4 /4 JMP FAC3 INSYMBOL JMP FAC3 FAC24, IFSYNOT;NOTSY;JMP FAC3 INSYMBOL PUSHJUMP;FACTOR FSYS FACXTYP L7775 /3=BOOLS TAD FACXTYP SZA CLA JMP .+4 EMIT;43 /*** (35) ***/ JMP FAC3 TAD FACXTYP SZA CLA ERROR;40 /32 FAC3, TEST;FSYS;FACBGS;6 /6 JMP FAC1 PAGE /PROCEDURE T E R M / ------- / /CALL: PUSHJUMP;TERM / SETX / X /ADDRESS / /LOCAL VAR'S: FSYS TRMXTYP,0 TRMYTYP,0 TRMYREF,0 TRMOP, 0 XTERM, TAD TRMXTYP DCA .+4 PUSHJUMP;FACTOR FSYS+SET26 0 TRM1, SKIPIFSYIN;SET26 POPJUMP;TERM TAD SY DCA TRMOP INSYMBOL PUSHJUMP;FACTOR FSYS+SET26 TRMYTYP TAD TRMOP TAD (JMP I OPTABL-TIMES DCA .+1 HLT OPTABL, XTIMES XIDIV XRDIV XIMOD XAND XTIMES, TAD I TRMXTYP MQL TAD TRMYTYP RESULTTYPE DCA I TRMXTYP TAD I TRMXTYP SNA JMP TRM1 /NOTYP TAD (-1 SZA CLA TAD (12-3 /REALS TAD (3 /INTS DCA IRY EMIT;60 /*** (48,3) OR (48,12) ***/ JMP TRM1 XRDIV, L0001 DCA IRY L7777 /1=INTS TAD I TRMXTYP SZA CLA JMP .+5 EMIT;32 /*** (26,1) ***/ L0002 /2=REALS DCA I TRMXTYP DCA IRY L7777 /1=INTS TAD TRMYTYP SZA CLA JMP .+5 EMIT;32 /*** (26,0) ***/ L0002 /2=REALS DCA TRMYTYP L7776 /2=REALS TAD I TRMXTYP SZA CLA JMP XNOTYP-1 L7776 TAD TRMYTYP SZA CLA JMP XNOTYP-1 TAD (13 DCA IRY EMIT;60 /*** (48,13) ***/ JMP TRM1 XIDIV, XIMOD, L7777 /1=INTS TAD I TRMXTYP SZA CLA JMP XNOTYP-2 L7777 TAD TRMYTYP SZA CLA JMP XNOTYP-2 TAD TRMOP CLL RAR DCA IRY EMIT;60 /*** (48,4) OR (48,5) ***/ JMP TRM1 XAND, L7775 /3=BOOLS TAD I TRMXTYP SZA CLA JMP XNOTYP L7775 TAD TRMYTYP SZA CLA JMP XNOTYP EMIT;64 /*** (52) ***/ JMP TRM1 CLA IAC IAC XNOTYP, TAD [40 DCA ERRTYP TAD I TRMXTYP SZA CLA TAD TRMYTYP SZA CLA ERROR ERRTYP, 00 /32, 33 OR 34 DCA I TRMXTYP /0=NOTYP JMP TRM1 PAGE /PROCEDURE S I M P L E E X P R E S S I O N / ------------------------------- / /CALL: PUSHJUMP;SIMPLEEXPRESSION / SETX / X /ADDRESS / /LOCAL VAR'S: FSYS SIMXTYP,0 SIMYTYP,0 SIMYREF,0 SIMOP, 0 XSIMPLE,SKIPIFSYIN;SET8 JMP SIM1 TAD SY DCA SIMOP INSYMBOL TAD SIMXTYP DCA .+4 PUSHJUMP;TERM FSYS+SET8 0 L7776 /2=REALS TAD I SIMXTYP SPA SNA CLA JMP .+4 ERROR;41 /33 JMP SIM2 TAD SIMOP TAD (-MINUS SNA CLA EMIT;44 /*** (36) ***/ JMP SIM2 SIM1, TAD SIMXTYP DCA .+4 PUSHJUMP;TERM FSYS+SET27 0 SIM2, SKIPIFSYIN;SET27 POPJUMP;SIMPLEEXPRESSION TAD SY DCA SIMOP INSYMBOL PUSHJUMP;TERM FSYS+SET27 SIMYTYP TAD SIMOP TAD (-ORSY SZA CLA JMP SIM3 L7775 /3=BOOLS TAD I SIMXTYP SZA CLA JMP NOTBOOL L7775 TAD SIMYTYP SZA CLA JMP NOTBOOL EMIT;63 /*** (51) ***/ JMP SIM2 NOTBOOL,TAD I SIMXTYP SZA CLA TAD SIMYTYP SZA CLA ERROR;40 /32 DCA I SIMXTYP /0=NOTYP JMP SIM2 SIM3, TAD I SIMXTYP MQL TAD SIMYTYP RESULTTYPE DCA I SIMXTYP TAD I SIMXTYP SNA JMP SIM2 CLL RAR /NOW: 0...INTS, 1...REALS! SZA CLA TAD (7 TAD [-4 TAD SIMOP /+ ... 5, - ... 6 DCA IRY EMIT;60 /*** (48,1) OR (48,2) OR (48,10) OR (48,11) ***/ JMP SIM2 PAGE /PROCEDURE E X P R E S S I O N / ------------------- / /CALL: PUSHJUMP;EXPRESSION / SETX / X /ADDRESS / /LOCAL VAR'S: FSYS EXPRVAR,0 XTYP, 0 XREF, 0 YTYP, 0 YREF, 0 OP, 0 XEXPRESSION, PUSHJUMP;SIMPLEEXPRESSION FSYS+SET28 XTYP SKIPIFSYIN;SET28 POPJUMP;EXPRESSION TAD SY DCA OP INSYMBOL PUSHJUMP;SIMPLEEXPRESSION FSYS YTYP L7776 /2=REALS TAD XTYP SNA JMP EXPR1 TAD [-2 /2+2=4=CHARS SMA SZA CLA JMP EXPR1 TAD XTYP CIA TAD YTYP SNA CLA JMP IEXPR EXPR1, L0001 DCA IRY L7777 /1=INTS TAD XTYP SZA CLA JMP .+5 EMIT;32 /*** (26,1) ***/ L0002 /2=REALS DCA XTYP DCA IRY L7777 /1=INTS TAD YTYP SZA CLA JMP .+5 EMIT;32 /*** (26,0) ***/ L0002 /2=REALS DCA YTYP L7776 /2=REALS TAD XTYP SZA CLA JMP ILLTYP L7776 TAD YTYP SZA CLA JMP ILLTYP REXPR, L0001 IEXPR, TAD (61 DCA I61R62 TAD OP TAD (TAD RELTABL-EQL DCA .+1 0000 /TAD RELTABL (MODIFIED INSTR.!) DCA IRY EMIT I61R62, 00 /*** (49,OP) OR (50,OP) ***/ EXPR3, L0003 /3=BOOLS DCA XTYP POPJUMP;EXPRESSION ILLTYP, ERROR;43 /35 JMP EXPR3 RELTABL,SZA SNA SPA SNA SPA SMA SMA SZA PAGE /PROCEDURE A S S I G N M E N T / ------------------- / /CALL: PUSHJUMP;ASSIGNMENT / LEV /VALUE / ADR /- " - / /LOCAL VAR'S: LV, 0 AD, 0 AXTYP, 0 AXREF, 0 AYTYP, 0 AYREF, 0 XASSIGNMENT, OFTAB;TYP /J IS SET IN STATEMENT AND [77 DCA AXTYP OFTAB;REF BSW AND [77 DCA AXREF TAD LV DCA IRX TAD AD DCA IRY OFTAB;NORMAL AND [40 SNA CLA IAC DCA .+2 EMIT;00 /*** (0,LV,AD) OR (1,LV,AD) ***/ SKIPIFSYIN;SET22 JMP .+5 PUSHJUMP;SELECTOR FSYS+SET29 AXTYP IFSY;BECOMES;JMP .+5 ERROR;63 /51 IFSY;EQL;INSYMBOL PUSHJUMP;EXPRESSION FSYS AYTYP TAD AXTYP CIA TAD AYTYP SZA CLA JMP ASS1 TAD AXTYP TAD [-ARRAY SPA CLA JMP ASS2-2 TAD AXREF /ARRAY- OR RECORD-VARIABLE CIA TAD AYREF SZA CLA JMP ASSERR TAD AXTYP TAD [-ARRAY SZA CLA JMP .+5 TAD AXREF /ARRAY OFATAB;SIZE JMP .+4 TAD AXREF /RECORD OFBTAB;VSIZE DCA IRY EMIT;27 /*** (23,SIZE) ***/ JMP ASS2 ASS1, L7776 /2=REALS TAD AXTYP SZA CLA JMP ASS3 L7777 /1=INTS TAD AYTYP SZA CLA JMP ASS3 EMIT;32 /*** (26,0) ***/ EMIT;46 /*** (38) ***/ ASS2, POPJUMP;ASSIGNMENT ASS3, TAD AXTYP SZA CLA TAD AYTYP SZA CLA ASSERR, ERROR;56 /46 JMP ASS2 /PROCEDURE C O M P O U N D S T A T E M E N T / --------------------------------- / /CALL: PUSHJUMP;COMPOUNDSTATEMENT /NO ARG'S! / /NO LOCAL VAR'S! XCOMPOUNDSTATEMENT, INSYMBOL PUSHJUMP;STATEMENT FSYS+SET30 SKIPIFSYIN;SET31 JMP CMP1 IFSY;SEMICOLON;JMP XCOMPOUNDSTATEMENT ERROR;16 /14 JMP XCOMPOUNDSTATEMENT+1 CMP1, IFSY;ENDSY;JMP .+4 ERROR;71 /57 SKP INSYMBOL POPJUMP;COMPOUNDSTATEMENT PAGE /PROCEDURE C A S E L A B E L / ----------------- / /CALL: JMS CASELABEL /NOT RECURSIVE! / /LOCAL VAR'S: LAB, ZBLOCK 5 CASELABEL, 0 PUSHJUMP;CONSTANT FSYS+SET6 LAB TAD LAB CIA TAD I CCXTYP SZA CLA JMP LABERR TAD I CCI DCA XR11 TAD XR11 TAD CLIMIT SNA CLA FATALC, FATAL /TOO MUCH CASE-LABELS! SIGNEDINTEGER;LAB DCA TEMP TAD TEMP DCA I XR11 TAD LC DCA I XR11 TAD XR11 DCA I CCI TAD CTABM1 DCA XR11 TAD I XR11 ISZ XR11 CIA TAD TEMP SZA CLA JMP .-5 TAD XR11 CIA TAD I CCI SZA CLA ERROR;1 /1 JMP I CASELABEL LABERR, ERROR;57 /47 JMP I CASELABEL CCI, CI CCXTYP, CXTYP CLIMIT, -2^CSMAX-CASETAB+1 CTABM1, CASETAB-1 /PROCEDURE C A S E S T A T E M E N T / ------------------------- / /CALL: PUSHJUMP;CASESTATEMENT /NO ARG'S! / /LOCAL VAR'S: CASETAB, ZBLOCK CSMAX^2 EXITTAB, ZBLOCK CSMAX CXTYP, 0 CXREF, 0 CLC1, 0 CI, 0 CJ, 0 XCASESTATEMENT, INSYMBOL TAD (CASETAB-1 DCA CI TAD (EXITTAB-1 DCA CJ PUSHJUMP;EXPRESSION FSYS+SET34 CXTYP L7776 /2=REALS TAD CXTYP SNA JMP .+3 TAD [-2 /2+2=4=CHARS (LAST STANTYP) SMA SZA CLA ERROR;27 /23 TAD LC DCA CLC1 EMIT;14 /*** (12) ***/ IFSY;OFSY;JMP CAS1 ERROR;10 /8 SKP CAS1, INSYMBOL PUSHJUMP;ONECASE IFSY;SEMICOLON;JMP CAS1 TAD CLC1 TOCODE TAD (CASETAB-1 DCA XR11 CAS2, TAD XR11 CIA TAD CI SNA CLA JMP CAS3 TAD I XR11 DCA IRY EMIT;15 /*** (13) ***/ JMP CAS2 CAS3, EMIT;12 /*** (10) ***/ TAD (EXITTAB-1 DCA XR11 CAS4, TAD XR11 CIA TAD CJ SNA CLA JMP CAS5 TAD I XR11 TOCODE JMP CAS4 CAS5, IFSY;ENDSY;JMP .+4 ERROR;71 /57 SKP INSYMBOL POPJUMP;CASESTATEMENT /PROCEDURE O N E C A S E / ------------- / /CALL: PUSHJUMP;ONECASE /NO ARG'S! / /NO LOCAL VAR'S! (USES SOME VAR'S OF 'CASESTATEMENT') XONECASE, SKIPIFSYIN;CONBGS JMP ONE2 SKP ONE1, INSYMBOL JMS CASELABEL IFSY;COMMA;JMP ONE1 IFSY;COLON;JMP .+4 ERROR;5 /5 SKP INSYMBOL PUSHJUMP;STATEMENT FSYS+SET30 ISZ CJ TAD LC DCA I CJ EMIT;12 /*** (10) ***/ ONE2, POPJUMP;ONECASE PAGE /PROCEDURE I F S T A T E M E N T / --------------------- / /CALL: PUSHJUMP;IFSTATEMENT /NO ARG'S! / /LOCAL VAR'S: IXTYP, 0 IXREF, 0 ILC1, 0 ILC2, 0 XIFSTATEMENT, INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET32 IXTYP TAD IXTYP SNA JMP .+5 TAD [-BOOLS SZA CLA ERROR;21 /17 TAD LC DCA ILC1 EMIT;13 /*** (11) ***/ IFSY;THENSY;JMP .+5 ERROR;64 /52 IFSY;DOSY;INSYMBOL PUSHJUMP;STATEMENT FSYS+SET33 IFSYNOT;ELSESY;JMP IF1 INSYMBOL TAD LC DCA ILC2 EMIT;12 /*** (10) ***/ TAD ILC1 TOCODE /*** CODE[ILC1] := LC ***/ PUSHJUMP;STATEMENT FSYS TAD ILC2 TOCODE /*** CODE[ILC2] := LC ***/ POPJUMP;IFSTATEMENT IF1, TAD ILC1 JMP .-4 /*** CODE[ILC1] := LC ***/ /PROCEDURE R E P E A T S T A T E M E N T / ----------------------------- / /CALL: PUSHJUMP;REPEATSTATEMENT /NO ARG'S! / /LOCAL VAR'S: RXTYP, 0 RXREF, 0 RLC1, 0 XREPEAT,TAD LC DCA RLC1 INSYMBOL PUSHJUMP;STATEMENT FSYS+SET35 SKIPIFSYIN;SET31 JMP REP1 IFSY;SEMICOLON;JMP XREPEAT+2 ERROR;16 /14 JMP XREPEAT+3 REP1, IFSYNOT;UNTILSY;JMP REPERR INSYMBOL PUSHJUMP;EXPRESSION FSYS RXTYP TAD RXTYP SNA JMP .+5 TAD [-BOOLS SZA CLA ERROR;21 /17 TAD RLC1 DCA IRY EMIT;13 /*** (11,RLC1) ***/ JMP .+3 REPERR, ERROR;65 /53 POPJUMP;REPEATSTATEMENT /PROCEDURE W H I L E S T A T E M E N T / --------------------------- / /CALL: PUSHJUMP;WHILESTATEMENT /NO ARG'S! / /LOCAL VAR'S (ON PAGE ZERO!): / WXTYP, 0 / WXREF, 0 / WLC1, 0 / WLC2, 0 XWHILESTATEMENT, INSYMBOL TAD LC DCA WLC1 PUSHJUMP;EXPRESSION FSYS+SET36 WXTYP TAD WXTYP SNA JMP .+5 TAD [-BOOLS SZA CLA ERROR;21 /17 TAD LC DCA WLC2 EMIT;13 /*** (11) ***/ IFSY;DOSY;JMP .+4 ERROR;66 /54 SKP INSYMBOL PUSHJUMP;STATEMENT FSYS TAD WLC1 DCA IRY EMIT;12 /*** (10,WLC1) ***/ TAD WLC2 TOCODE /*** CODE[WLC2] := LC ***/ POPJUMP;WHILESTATEMENT PAGE /PROCEDURE F O R S T A T E M E N T / ----------------------- / /CALL: PUSHJUMP;FORSTATEMENT /NO ARG'S! / /LOCAL VAR'S: FXTYP, 0 FXREF, 0 CVT, 0 FLC1, 0 FLC2, 0 FF, 0 XFORSTATEMENT, INSYMBOL IFSYNOT;IDENT;JMP FOR2 LOCATE DCA J INSYMBOL TAD J SNA CLA JMP FOR1+2 WITHTABDO L7777 /1=VARIABLE TAD OBJ0 SZA CLA JMP FOR1 TAD TYP0 DCA CVT TAD LEV0 DCA IRX TAD ADR0 DCA IRY EMIT;0 /*** (0,LEV,ADR) ***/ L7776 /2=REALS TAD CVT SNA JMP .+3 TAD [-2 /2+2=4=CHARS (LAST STANTYP) SMA SZA CLA ERROR;22 /18 JMP FOR3 FOR1, ERROR;45 /37 L0001 /1=INTS DCA CVT JMP FOR3 FOR2, SKIP;FSYS+SET37;2 /2 FOR3, IFSYNOT;BECOMES;JMP FOR4 INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET38 FXTYP TAD FXTYP CIA TAD CVT SZA CLA ERROR;23 /19 JMP FOR5 FOR4, SKIP;FSYS+SET38;63 /51 FOR5, TAD (16 /14 DCA FF SKIPIFSYIN;SET39 JMP FOR6 IFSY;DOWNTOSY;L0002 TAD (16 DCA FF INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET36 FXTYP TAD FXTYP CIA TAD CVT SZA CLA ERROR;23 /19 JMP FOR7 FOR6, SKIP;FSYS+SET36;67 /55 FOR7, TAD LC DCA FLC1 TAD FF DCA .+2 EMIT;00 /*** (14) OR (16) ***/ IFSY;DOSY;JMP .+4 ERROR;66 /54 SKP INSYMBOL TAD LC DCA FLC2 PUSHJUMP;STATEMENT FSYS TAD FLC2 DCA IRY L0001 TAD FF DCA .+2 EMIT;00 /*** (15,FLC2) OR (17,FLC2) ***/ TAD FLC1 TOCODE /*** CODE[FLC1] := LC ***/ POPJUMP;FORSTATEMENT PAGE /PROCEDURE S T A N D P R O C / ----------------- / /CALL: PUSHJUMP;STANDPROC / I /VALUE / /LOCAL VAR'S: PRCN, 0 SPXTYP, 0 SPXREF, 0 SPYTYP, 0 SPYREF, 0 XSTPROC,TAD PRCN TAD (JMP I STPRTAB-1 DCA .+1 HLT STPRTAB,SPREAD SPREAD SPWRITE SPWRITE SPHALT SPASCII SPREAD, IFSYNOT;LPARENT;JMP SPR3 SPR1, INSYMBOL IFSY;IDENT;JMP .+4 ERROR;2 /2 JMP SPR2 LOCATE DCA J INSYMBOL TAD J SNA CLA JMP SPR2 WITHTABDO L7777 /1=VARIABLE TAD OBJ0 SNA CLA JMP .+4 ERROR;45 /37 JMP SPR2 TAD TYP0 DCA SPXTYP TAD REF0 DCA SPXREF TAD LEV0 DCA IRX TAD ADR0 DCA IRY TAD NORM0 SNA CLA IAC DCA .+2 EMIT;00 /*** (0,LEV,ADR) OR (1,LEV,ADR) ***/ SKIPIFSYIN;SET22 JMP .+5 PUSHJUMP;SELECTOR FSYS+SET24 SPXTYP L7775 /3=BOOLS TAD SPXTYP SNA JMP SPR2-2 TAD (-1 /4=CHARS (LAST STANTYP) SMA SZA CLA JMP SPR2-2 TAD SPXTYP DCA IRY EMIT;33 /*** (27,TYP) ***/ JMP SPR2 ERROR;50 /40 SPR2, TEST;SET24;FSYS;6 /6 IFSY;COMMA;JMP SPR1 IFSY;RPARENT;JMP .+4 ERROR;4 /4 SKP INSYMBOL SPR3, L7776 /-2 TAD PRCN SNA CLA EMIT;76 /*** (62) ***/ POPJUMP;STANDPROC SPASCII,IFSYNOT;LPARENT;JMP SPASC2 SPASC1, INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET24 SPXTYP L7777 /1=INTS TAD SPXTYP SZA CLA ERROR;53 /43 EMIT;75 /*** (61) ***/ IFSY;COMMA;JMP SPASC1 IFSY;RPARENT;JMP .+4 ERROR;4 /4 SKP INSYMBOL SPASC2, POPJUMP;STANDPROC SPHALT, EMIT;45 /*** (37) ***/ POPJUMP;STANDPROC PAGE SPWRITE,IFSYNOT;LPARENT;JMP SPW5 SPW1, INSYMBOL IFSYNOT;STRING;JMP SPW2 TAD SLENG DCA IRY EMIT;30 /*** (24,SLENG) ***/ TAD NUM+3 DCA STRNUM INSYMBOL IFSYNOT;COLON;JMP SPW1A INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET24 SPYTYP L7777 /1=INTS TAD SPYTYP SZA CLA ERROR;53 /43 JMP .+3 SPW1A, EMIT;30 /*** (24,0) ***/ TAD STRNUM DCA IRY EMIT;34 /*** (28,NUM) ***/ JMP SPW4 STRNUM, 0 SPW2, PUSHJUMP;EXPRESSION FSYS+SET23 SPXTYP TAD SPXTYP TAD [-CHARS SMA SZA CLA ERROR;51 /41 IFSYNOT;COLON;JMP SPW3+1 INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET23 SPYTYP L7777 /1=INTS TAD SPYTYP SZA CLA ERROR;53 /43 IFSYNOT;COLON;JMP SPW3 L7776 /2=REALS TAD SPXTYP SZA CLA ERROR;52 /42 INSYMBOL PUSHJUMP;EXPRESSION FSYS+SET24 SPYTYP L7777 /1=INTS TAD SPYTYP SZA CLA ERROR;53 /43 EMIT;37 /*** (31) ***/ JMP SPW4 SPW3, L0001 TAD (35 DCA .+4 TAD SPXTYP DCA IRY EMIT;00 /*** (29,TYP) OR (30,TYP) ***/ SPW4, IFSY;COMMA;JMP SPW1 IFSY;RPARENT;JMP .+4 ERROR;4 /4 SKP INSYMBOL SPW5, TAD PRCN TAD [-4 SNA CLA EMIT;77 /*** (63) ***/ POPJUMP;STANDPROC PAGE /PROCEDURE S T A T E M E N T / ----------------- / /CALL: PUSHJUMP;STATEMENT / SETX / /NO LOCAL VAR'S! XSTATEMENT, SKIPIFSYIN;SET40 JMP STAT2 IFSYNOT;IDENT;JMP STAT1 LOCATE DCA J INSYMBOL TAD J SNA CLA JMP STAT2 WITHTABDO TAD OBJ0 TAD JMPOBJ DCA .+1 HLT OBJTABL,IDCON IDVAR IDTYP IDPRO IDFUN JMPOBJ, JMP I OBJTABL IDCON, IDTYP, ERROR;55 /45 JMP STAT2 IDVAR, TAD LEV0 DCA .+5 TAD ADR0 DCA .+4 PUSHJUMP;ASSIGNMENT 0 0 JMP STAT2 IDPRO, TAD LEV0 SNA CLA JMP IDPRO1 TAD J DCA .+4 PUSHJUMP;CALL FSYS 0 JMP STAT2 IDPRO1, TAD ADR0 DCA .+3 PUSHJUMP;STANDPROC 0 JMP STAT2 IDFUN, OFDISPLAY CIA TAD REF0 SZA CLA JMP IDTYP L0001 TAD LEV0 DCA .+3 PUSHJUMP;ASSIGNMENT 0 0000 /ALWAYS 0! JMP STAT2 STAT1, TAD SY TAD STATNO DCA .+2 PUSHJUMP;00 STAT2, TEST;FSYS;SET0;16 /14 POPJUMP;STATEMENT STATNO, COMPOUNDSTATEMENT-BEGINSY /PROCEDURE B L O C K / --------- / /CALL: PUSHJUMP;BLOCK / SETX / ISFUN /VALUE / LEVEL /VALUE / /LOCAL VAR'S (ON PAGE ZERO!): / FSYS / ISFUN, 0 / LEVEL, 0 / DX, 0 / PRT, 0 / PRB, 0 MAXLEV, -LMAX /CONSTANT TOFAT5, FATAL5 C0005, 5 BLK1, BLO1 BLK2, BLO2 BLK2M2, BLO2-2 XBLOCK, TAD C0005 DCA DX TAD T DCA PRT TAD LEVEL TAD MAXLEV SMA SZA CLA JMP I TOFAT5 /TOO MUCH LEVELS! TEST;SET41;FSYS;7 /7 ENTERBLOCK TAD B TODISPLAY TAD B DCA PRB TAD PRT WITHTABDO DCA TYP0 /0=NOTYP TAD PRB DCA REF0 ENDWITH IFSY;LPARENT;PUSHJUMP;PARAMETERLIST TAD PRB DCA JB TAD T TOBTAB;LASTPAR TAD DX TOBTAB;PSIZE TAD ISFUN SNA CLA JMP I BLK2 IFSYNOT;COLON;JMP I BLK2M2 INSYMBOL IFSYNOT;IDENT;JMP I BLK1 LOCATE DCA J INSYMBOL TAD J SNA CLA JMP BLO2 OFTAB;OBJ BSW AND [77 TAD [-2 /2=TYPE1 SNA CLA JMP .+4 ERROR;35 /29 JMP BLO2 OFTAB;TYP AND [77 DCA TEMP TAD TEMP TAD [-4 SPA SNA CLA JMP .+4 ERROR;17 /15 JMP BLO2 TAD PRT DCA J L0003 /3=PROZEDURE TAD ISFUN BSW TAD TEMP TOTAB;TYP JMP BLO2 BLO1, SKIP;FSYS+SET20;2 /2 JMP BLO2 ERROR;5 /5 BLO2, IFSY;SEMICOLON;JMP .+4 ERROR;16 /14 SKP INSYMBOL BLO3, IFSY;CONSTSY;PUSHJUMP;CONDECL IFSY;TYPESY;PUSHJUMP;TYPDECL IFSY;VARSY;PUSHJUMP;VARDECL TAD PRB DCA JB TAD DX TOBTAB;VSIZE BLO4, SKIPIFSYIN;SET42 JMP .+4 PUSHJUMP;PRODECL JMP BLO4 TEST;SET43;SET44;70 /56 SKIPIFSYIN;STATBGS JMP BLO3 TAD PRT DCA J TAD LC TOTAB;ADR BLO5, INSYMBOL PUSHJUMP;STATEMENT FSYS+SET30 SKIPIFSYIN;SET31 JMP BLO6 IFSY;SEMICOLON;JMP BLO5 ERROR;16 /14 JMP BLO5+1 BLO6, IFSY;ENDSY;JMP .+4 ERROR;71 /57 SKP INSYMBOL TEST;FSYS+SET45;SET0;6 /6 POPJUMP;BLOCK PAGE /M A C R O - I N S T R U C T I O N S : /P U S H J U M P /RECURSIVE CALL OF COMPILER PROCEDURES /CALL: PUSHJUMP;NAME /P O P J U M P /RETURN FROM PROCEDURE /CALL: POPJUMP;NAME /LOCAL, 0 /START OF LOCAL VARIABLES - 1 /LENGTH, 0 / - NO. OF LOC'S TO PUSH (EXCL. FSYS) /PARAM, 0 /NO. OF PARAMETERS + 4000 (IF 1ST ONE IS A SET) PSTART, 0 /STARTING ADDRESS OF PROCEDURE PPP, 0 /STACK POINTER (POINTS ALWAYS TO 1ST FREE LOC.) CONTROL,0 CLL RTL TAD (PUSHTABLE-1 DCA XR10 CDF SETFIELD TAD I XR10 DCA LOCAL TAD I XR10 DCA LENGTH TAD I XR10 DCA PARAM TAD I XR10 DCA PSTART CDF COMPFIELD JMP I CONTROL PUSH, 0 CDF PUSHFIELD DCA I PPP CDF COMPFIELD ISZ PPP JMP I PUSH FATAL8, FATAL /PROGRAMM TOO COMPLEX ---> STACK FULL! POP, 0 L7777 TAD PPP DCA PPP CDF PUSHFIELD TAD I PPP CDF COMPFIELD JMP I POP XPUSHJ, 0 TAD I XPUSHJ ISZ XPUSHJ JMS CONTROL TAD LENGTH SNA CLA JMP PUFSYS TAD LOCAL DCA XR10 TAD I XR10 JMS PUSH /PUSH LOCAL VARIABLES (IF ANY) ISZ LENGTH JMP .-3 PUFSYS, TAD PARAM SMA CLA JMP GETPAR L3777 /FSYS-1 DCA XR10 TAD [-5 DCA LENGTH CDF SETFIELD TAD I XR10 JMS PUSH /PUSH FSYS (IF NECESSARY) ISZ LENGTH JMP .-4 GEFSYS, L4000 /GET SET-ARGUMENT (IF PRESENT) DCA SETA TAD I XPUSHJ SPA DCA SETA /<0: FSYS OR SETX ONLY TAD SETA />0: FSYS+SETX DCA SETB ISZ XPUSHJ UNION SETA, FSYS SETB, SET0 FSYS GETPAR, TAD PARAM /GET PARAMETERS AND [77 SNA JMP RECALL CIA DCA LENGTH TAD LOCAL DCA XR10 TAD I XPUSHJ ISZ XPUSHJ DCA I XR10 ISZ LENGTH JMP .-4 JMS VARIN /PASS VAR-PARAMETERS (IF ANY) RECALL, TAD XPUSHJ JMS PUSH /PUSH RETURN ADDRESS JMP I PSTART /AND J U M P TO PROCEDURE XPOPJUMP,0 TAD I XPOPJUMP JMS CONTROL JMS POP /GET RETURN ADDRESS DCA PSTART TAD PARAM SMA CLA JMP POVAR TAD (FSYS+4 DCA PUSH /(MIS)USE THIS FREE LOC. TAD [-5 DCA CONTROL JMS POP /POP FSYS (IF IT WAS PUSHED) CDF SETFIELD DCA I PUSH L7777 TAD PUSH DCA PUSH ISZ CONTROL JMP .-7 CDF COMPFIELD POVAR, JMS VARTM /TEMP. STORE VAR-PARAMETERS TAD LENGTH SNA JMP I PSTART CIA TAD LOCAL DCA PUSH JMS POP /POP LOCAL VARIABLES (IF ANY) DCA I PUSH L7777 TAD PUSH DCA PUSH ISZ LENGTH JMP .-6 JMS VAREX /PASS VAR-PARAMETERS (IF ANY) JMP I PSTART /R E T U R N PAGE /M A C R O - I N S T R U C T I O N S : /O F D I S P L A Y /AC := DISPLAY[LEVEL] /T O D I S P L A Y /DISPLAY[LEVEL] := AC /O F T A B /AC := TAB[AC].SEL, IF AC=0 GET TAB[J].SEL /T O T A B /TAB[J].SEL := AC /O F A T A B /AC := ATAB[AC].SEL, IF AC=0 GET ATAB[JA].SEL /T O A T A B /ATAB[JA].SEL := AC /O F B T A B /AC := BTAB[AC].SEL, IF AC=0 GET BTAB[JB].SEL /T O B T A B /BTAB[JB].SEL := AC /W I T H T A B D O /GET AND UNPACK TAB[AC] OR TAB[J] /E N D W I T H /PACK AND STORE UNPACKED ENTRY OF TAB XOFDISP,0 TAD (DISPLAY TAD LEVEL DCA QQ TAD I QQ JMP I XOFDISP XTODISP,0 MQL TAD (DISPLAY TAD LEVEL DCA QQ MQA DCA I QQ JMP I XTODISP XOFTAB, 0 SNA TAD J CLL RTL TAD I XOFTAB DCA QQ ISZ XOFTAB CDF TABLEFIELD TAD I QQ CDF COMPFIELD JMP I XOFTAB XTOTAB, 0 MQL TAD J CLL RTL TAD I XTOTAB DCA QQ ISZ XTOTAB CDF TABLEFIELD MQA DCA I QQ CDF COMPFIELD JMP I XTOTAB XOFATAB,0 SNA TAD JA CLL RAL CLL RTL TAD I XOFATAB DCA QQ ISZ XOFATAB CDF TABLEFIELD TAD I QQ CDF COMPFIELD JMP I XOFATAB QQ=. XTOATAB,0 MQL TAD XTOATAB DCA XTOTAB TAD JA CLL RAL JMP XTOTAB+3 XOFBTAB,0 SNA TAD JB CLL RTL TAD I XOFBTAB DCA QQ ISZ XOFBTAB CDF TABLEFIELD TAD I QQ CDF COMPFIELD JMP I XOFBTAB XTOBTAB,0 MQL TAD XTOBTAB DCA XTOTAB TAD JB JMP XTOTAB+3 XWITHTAB,0 SNA TAD J CLL RTL DCA JW /SYMBOL TABLE STARTS AT 0000 ! TAD JW DCA XR10 CDF TABLEFIELD TAD I JW DCA LINK0 TAD I XR10 MQL MQA BSW AND [77 DCA OBJ0 MQA AND [77 DCA TYP0 TAD I XR10 MQL MQA BSW AND [77 DCA REF0 MQA AND [40 DCA NORM0 MQA AND [17 DCA LEV0 TAD I XR10 DCA ADR0 CDF COMPFIELD JMP I XWITHTAB XENDWITH,0 TAD JW DCA XR10 CDF TABLEFIELD TAD LINK0 DCA I JW TAD OBJ0 BSW TAD TYP0 DCA I XR10 TAD REF0 BSW TAD NORM0 TAD LEV0 DCA I XR10 TAD ADR0 DCA I XR10 CDF COMPFIELD JMP I XENDWITH PAGE /M A C R O - I N S T R U C T I O N S : /W I T H A T A B D O /GET AND UNPACK ATAB[JA] /E N D A W I T H /PACK AND STORE UNPACKED ENTRY OF ATAB /E M I T /EMIT INTERMEDIATE CODE (F,IRX,IRY) /CALL: EMIT;F /T O C O D E /CODE[AC].IRY := LC /E N T E R C O N S T A N T /ENTER REAL OR INTEGER INTO CONSTANT TABLE /CALL: ENTERCONSTANT;ADDRESS-1 XWITHATAB,0 TAD JA CLL RAL CLL RTL TAD (ATAB DCA JAW TAD JAW DCA XR10 TAD [-7 DCA QR TAD (DCA INXTP0 DCA .+3 CDF TABLEFIELD TAD I XR10 0000 /DCA INXTP0 (MODIFIED INSTR.!) ISZ .-1 ISZ QR JMP .-4 CDF COMPFIELD JMP I XWITHATAB XENDAW, 0 TAD JAW DCA XR10 TAD [-7 DCA QR TAD (TAD INXTP0 DCA .+2 CDF TABLEFIELD 0000 /TAD INXTP0 (MODIFIED INSTR.!) DCA I XR10 ISZ .-2 ISZ QR JMP .-4 CDF COMPFIELD JMP I XENDAW XEMIT, 0 TAD LC CLL RAL DCA XTOCODE TAD I XEMIT /GET OP-CODE BSW TAD IRX CDF CODEFIELD DCA I XTOCODE ISZ XTOCODE TAD IRY DCA I XTOCODE CDF COMPFIELD ISZ LC TAD LC TAD (-CMAX SMA SZA CLA FATAL6, FATAL /PROGRAM TOO LONG! DCA IRX DCA IRY JMP I XEMIT QR=. XTOCODE,0 STL RAL DCA XEMIT CDF CODEFIELD TAD LC DCA I XEMIT CDF COMPFIELD JMP I XTOCODE CENTRY=XWITHATAB CTEMP=XENDAW FOUR=XEMIT XENTCON,0 TAD I XENTCON DCA XR10 ISZ XENTCON TAD C TAD [-4 DCA CENTRY TAD SX STL RAR CIA TAD CENTRY SPA CLA FATAL3, FATAL /TOO MUCH CONSTANTS! TAD [-4 DCA FOUR TAD CENTRY DCA XR12 TAD I XR10 CDF TABLEFIELD DCA I XR12 CDF COMPFIELD ISZ FOUR JMP .-5 TAD CENTRY DCA CTEMP CDF TABLEFIELD SEARCH, L0004 TAD CTEMP DCA CTEMP TAD CTEMP TAD (-ATAB+1 SMA CLA JMP NOTFOUND TAD [-4 DCA FOUR TAD CENTRY DCA XR10 TAD CTEMP DCA XR12 TAD I XR10 CIA TAD I XR12 SZA CLA JMP SEARCH ISZ FOUR JMP .-6 TAD CTEMP /FOUND JMP .+4 NOTFOUND,TAD CENTRY DCA C TAD CENTRY CDF COMPFIELD JMP I XENTCON PAGE /M A C R O - I N S T R U C T I O N S : /E N T E R /ENTER OBJEJT INTO SYMBOL TABLE /CALL: ENTER;OBJ /E N T E R V A R I A B L E /E N T E R B L O C K /E N T E R A R R A Y /S I G N E D I N T E G E R /MAKE 12-BIT SIGNED INTEGER OF CONSTANT /CALL: SIGNEDINTEGER;ADDRESS-1 XENTER, 0 TAD T TAD (-TMAX SMA CLA FATAL1, FATAL /SYMBOL TABLE FULL! JMS ENTID OFDISPLAY OFBTAB;LAST DCA J TAD J DCA L JMS CHKID JMP .+5 OFTAB;LINK DCA J JMP .-5 TAD J SNA CLA JMP .+4 ERROR;1 /1 JMP I XENTER ISZ T TAD T JMS ENTID TAD I XENTER MQL L3777 TAD T STL RTL /4*T - 1 DCA XR10 CDF TABLEFIELD TAD L /LINK DCA I XR10 MQA BSW /OBJ, TYP (0=NOTYP) DCA I XR10 TAD LEVEL /REF=0, NORMAL=0, LEVEL DCA I XR10 DCA I XR10 /ADR=0 CDF COMPFIELD OFDISPLAY DCA JB TAD T TOBTAB;LAST JMP I XENTER XENTVAR,0 IFSY;IDENT;JMP .+4 ERROR;2 /2 JMP I XENTVAR ENTER;VARIABLE INSYMBOL JMP I XENTVAR XENTBLO,0 TAD B TAD (-BMAX SMA CLA FATAL2, FATAL /TOO MUCH BLOCKS! ISZ B TAD B DCA JB TOBTAB;LAST TOBTAB;LASTPAR JMP I XENTBLO ATP=XENTBLO XENTARR,0 DCA ATP TAD LO CIA TAD HI SPA CLA ERROR;33 /27 TAD A TAD (-AMAX SMA CLA FATAL4, FATAL ISZ A TAD A DCA JA TAD ATP TOATAB;INXTYP TAD LO TOATAB;LOW TAD HI TOATAB;HIGH JMP I XENTARR XSGNINT,0 L0001 /LINK=0! TAD I XSGNINT ISZ XSGNINT DCA XR10 TAD I XR10 SZA TAD [4000 /LINK=1? ---> NEGATIVE SZA CLA JMP ERR49 TAD I XR10 SZA CLA JMP ERR49 TAD I XR10 SPA JMP ERR49 SZL CIA JMP I XSGNINT ERR49, ERROR;61 /49 JMP I XSGNINT PAGE /-------- D I S P L A Y --------/ / *7400 IFNZRO DISPLAY-. 1 /DISPLAY[0] := 1 ZBLOCK 17 /---------------------------------/ /M A C R O - I N S T R U C T I O N S : /L O C A T E /LOCATE IDENTIFIER IN SYMBOL TABLE /EXITS WITH TABLE INDEX IN AC /E N T I D /TAB[AC].NAME := ID /C H K I D /SKIP IF TAB[J].NAME <> ID /G E T C O N S T A N T /NUM := CTAB[AC] XLOCATE,0 TAD LEVEL DCA L JMS ENTID NSCOPE, TAD L TAD (TAD DISPLAY DCA .+1 0000 /TAD DISPLAY (MODIFIED INSTR.!) OFBTAB;LAST DCA J JMS CHKID JMP .+5 OFTAB;LINK DCA J JMP .-5 L7777 TAD L DCA L TAD J SZA JMP I XLOCATE TAD L SMA CLA JMP NSCOPE ERROR;0 0 JMP I XLOCATE ENTID, 0 CLL RTL TAD (-1 DCA XR10 CDF NAMEFIELD TAD ID DCA I XR10 TAD ID+1 DCA I XR10 TAD ID+2 DCA I XR10 TAD ID+3 DCA I XR10 CDF COMPFIELD JMP I ENTID CHKID, 0 TAD J CLL RTL TAD (-1 DCA XR10 CDF NAMEFIELD TAD I XR10 CIA TAD ID SZA CLA JMP NOTEQL TAD I XR10 CIA TAD ID+1 SZA CLA JMP NOTEQL TAD I XR10 CIA TAD ID+2 SZA CLA JMP NOTEQL TAD I XR10 CIA TAD ID+3 SZA CLA NOTEQL, ISZ CHKID CDF COMPFIELD JMP I CHKID XOFCONST,0 DCA XR10 CDF TABLEFIELD TAD I XR10 DCA NUM TAD I XR10 DCA NUM+1 TAD I XR10 DCA NUM+2 TAD I XR10 DCA NUM+3 CDF COMPFIELD JMP I XOFCONST XERROR, 0 CLA CLL TAD I XERROR CIF SETFIELD JMS I (F3ERROR JMP I XERROR XFATAL, 0 TAD XFATAL CDF CIF SETFIELD JMP I (F3FATAL XINSYMBOL,0 CDF CIF 0 JMP I (INSY0 EXSY3, DCA SY JMP I XINSYMBOL PAGE /M A C R O - I N S T R U C T I O N S : /T E S T S E M I C O L O N /S K I P /CALL: SKIP;SETX;N /T E S T /CALL: TEST;SETX;SETY;N /S K I P I F S Y I N /CALL: SKIPIFSYIN;SETX /I F S Y /CALL: IFSY;SYMBOL /I F S Y N O T /CALL: IFSYNOT;SYMBOL /U N I O N /CALL: UNION;SET1;SET2;S1US2 XTSTSEM,0 IFSY;SEMICOLON;JMP .+6 ERROR;16 /14 SKIPIFSYIN;SET6 SKP INSYMBOL TEST;SET7;FSYS;6 /6 JMP I XTSTSEM XSKIP, 0 TAD I XSKIP JMS FSYSUSETX DCA .+11 ISZ XSKIP TAD I XSKIP DCA .+2 ERROR;00 /N SKP INSYMBOL SKIPIFSYIN;00 JMP .-3 JMP I XSKIP XTEST, 0 TAD I XTEST JMS FSYSUSETX DCA .+3 ISZ XTEST SKIPIFSYIN;00 SKP JMP XTST1 TAD .-3 DCA S1 TAD I XTEST JMS FSYSUSETX DCA S2 ISZ XTEST UNION S1, 0 S2, 0 S1US2 TAD I XTEST DCA .+3 SKIP;S1US2;00 /N XTST1, ISZ XTEST JMP I XTEST FSYSUSETX, 0 SPA JMP I FSYSUSETX TAD [4000 DCA .+3 UNION FSYS 0 S1US2 TAD .-1 JMP I FSYSUSETX INSET, 0 TAD SY CLL RAL TAD (SETTABLE DCA S2 TAD I INSET ISZ INSET CDF SETFIELD TAD I S2 DCA S1 /ADDRESS OF RELATIVE SET WORD ISZ S2 /ADDRESS OF BIT POS. REL. TO SY TAD I S1 AND I S2 SZA CLA ISZ INSET CDF COMPFIELD JMP I INSET XIFSY, 0 TAD SY CIA TAD I XIFSY SZA CLA ISZ XIFSY ISZ XIFSY JMP I XIFSY XIFSYNOT,0 TAD SY CIA TAD I XIFSYNOT SNA CLA ISZ XIFSYNOT ISZ XIFSYNOT JMP I XIFSYNOT XSA=XIFSY /NORMAL LOC. XSB=XR10 /AUTO INDEX XSU=XR12 / - " - FIVE=XIFSYNOT XUNION, 0 TAD I XUNION DCA XSA ISZ XUNION L7777 TAD I XUNION DCA XSB ISZ XUNION L7777 TAD I XUNION DCA XSU ISZ XUNION TAD [-5 DCA FIVE CDF SETFIELD TAD I XSA CMA AND I XSB TAD I XSA DCA I XSU ISZ XSA ISZ FIVE JMP .-7 CDF COMPFIELD JMP I XUNION PAGE /L O N G E R R O R M E S S A G E S FIELD 6 *0 ZBLOCK 73 /ERROR COUNTERS 7777 /GUARD ERRSUM, 0 /NUMBER OF DETECTED ERRORS *100 /ADDRESS LIST OF ERROR MESSAGES E00 E01 E02 E03 E04 E05 E06 E07 E08 E09 E10 E11 E12 E13 E14 E15 E16 E17 E18 E19 E20 E21 E22 E23 E24 E25 E26 E27 E28 E29 E30 E31 E32 E33 E34 E35 E36 E37 E38 E39 E40 E41 E42 E43 E44 E45 E46 E47 E48 E49 E50 E51 E52 E53 E54 E55 E56 E57 E58 *200 EXPLAIN,CLA CLL TAD ERRSUM SNA CLA JMP EXCOMP JMS ECRLF JMS ECRLF TAD (EHEAD DCA ETEXT JMS EMESG JMS ECRLF JMS ECRLF DCA ENN SKP ELINE, ISZ ENN TAD I ENN SPA JMP EXOS8 SNA CLA /SKP CLA ---> PRINT ALL! JMP ELINE CLA IAC BSW /L0100 TAD ENN DCA ETEXT TAD I ETEXT DCA ETEXT JMS EMESG JMS ECRLF JMP ELINE FXPLAIN,CLA CLL TAD ERRSUM SZA CLA JMP EXPLAIN+5 EXOS8, CLA CLL JMS ECRLF CDF CIF 0 JMP I (7605 ENN, 0 EXCOMP, JMS ECRLF JMS ECRLF TAD (EOKAY DCA ETEXT JMS EMESG JMS ECRLF JMS ECRLF CDF CIF 60 JMP I (INIT /INITIALIZE RUNTIME SYSTEM EPRINT, 0 TLS TSF JMP .-1 CLA CLL JMP I EPRINT ECRLF, 0 TAD (215 JMS EPRINT TAD (212 JMS EPRINT JMP I ECRLF EMESG, 0 TAD I ETEXT BSW JMS EASCII TAD I ETEXT JMS EASCII ISZ ETEXT JMP EMESG+1 EASCII, 0 AND (77 SNA JMP I EMESG TAD (240 AND (77 TAD (240 JMS EPRINT JMP I EASCII ETEXT, 0 EOKAY, TEXT /KOMPILATION EINWANDFREI!/ EHEAD, TEXT /ERKLAERUNG DER FEHLER:/ PAGE /L O N G E R R O R M E S S A G E S / /(MADE INVISIBLE BY 'XLIST' TO SAVE PAPER IN ASSEMBLY LISTING!) XLIST E00,TEXT / 0 DIESER NAME WURDE NICHT VEREINBART./ E01,TEXT / 1 NAME IM GUELTIGKEITSBEREICH MEHRFACH VEREINBART./ E02,TEXT / 2 NAME FEHLT!/ E03,TEXT / 3 JEDES PROGRAMM MUSS MIT DEM WORTSYMBOL 'PROGRAM' BEGINNE/ *.-1 TEXT /N./ E04,TEXT / 4 RUNDE RECHTSKLAMMER FEHLT (ECKIGE KLAMMER HIER FALSCH)./ E05,TEXT / 5 DOPPELPUNKT FEHLT. IN VEREINBARUNGEN FOLGT DEM : EIN TYP/ *.-1 TEXT /NAME./ E06,TEXT / 6 SYNTAXFEHLER! ANGEZEIGTES SYMBOL HIER NICHT KORREKT./ E07,TEXT / 7 LISTE DER FORMALPARAMETER FEHLERHAFT (NAME ODER WORTSYMB/ *.-1 TEXT /OL 'VAR')./ E08,TEXT / 8 DAS WORTSYMBOL 'OF' FEHLT./ E09,TEXT / 9 RUNDE LINKSKLAMMER FEHLT (ECKIGE KLAMMER HIER FALSCH)./ E10,TEXT /10 TYPVEREINBARUNG FEHLERHAFT (NAME, 'ARRAY' ODER 'RECORD')./ E11,TEXT /11 ECKIGE LINKSKLAMMER FEHLT (RUNDE KLAMMER HIER FALSCH)./ E12,TEXT /12 ECKIGE RECHTSKLAMMER FEHLT (RUNDE KLAMMER HIER FALSCH)./ E13,TEXT /13 SYMBOL .. FEHLT (LEERZEICHEN ZWISCHEN DEN PUNKTEN UNZULA/ *.-1 TEXT /ESSIG)./ E14,TEXT /14 STRICHPUNKT FEHLT!/ E15,TEXT /15 FUNKTIONSWERT KANN NUR VOM TYP INTEGER, REAL, BOOLEAN OD/ *.-1 TEXT /ER CHAR SEIN./ E16,TEXT /16 SYMBOL = FEHLT (IN VEREINBARUNGEN IST := UNZULAESSIG)./ E17,TEXT /17 NACH 'IF', 'WHILE' ODER 'UNTIL' MUSS EIN BOOL'SCHER AUSD/ *.-1 TEXT /RUCK STEHEN./ E18,TEXT /18 ZAEHLVARIABLE BEI 'FOR'-ANWEISUNG MUSS VOM TYP INTEGER, / *.-1 TEXT /CHAR ODER BOOLEAN SEIN./ E19,TEXT /19 ANFANGSWERT, ENDWERT UND ZAEHLVARIABLE MUESSEN VOM GLEIC/ *.-1 TEXT /HEN TYP SEIN./ E20,TEXT /20 DER STANDARDNAME 'OUTPUT' MUSS IM PROGRAMMKOPF GESCHRIEB/ *.-1 TEXT /EN WERDEN./ E21,TEXT /21 ZAHL IST ZU GROSS! (MAXINT=34359738367, REALS ABS. KLEIN/ *.-1 TEXT /ER ALS 1.0E+308)/ E22,TEXT /22 PUNKT AM PROGRAMMENDE FEHLT! (WORTSYMBOLE 'BEGIN' UND 'E/ *.-1 TEXT /ND' NICHT PAARWEISE?)/ E23,TEXT /23 AUSDRUCK NACH 'CASE' MUSS VOM TYP INTEGER, CHAR ODER BOO/ *.-1 TEXT /LEAN SEIN./ E24,TEXT /24 ILLEGALES ZEICHEN!/ E25,TEXT /25 BEI KONSTANTENVEREINBARUNG MUSS NACH = EINE KONSTANTE OD/ *.-1 TEXT /. EIN KONST.NAME STEHEN./ E26,TEXT /26 DER AUSDRUCK FUER EINEN FELD-INDEX MUSS VOM VEREINBARTEN/ *.-1 TEXT / INDEX-TYP SEIN./ E27,TEXT /27 BEREICHSGRENZEN BEI FELDVEREINBARUNG FEHLERHAFT (UG<=OG?/ *.-1 TEXT / GLEICHER TYP?)/ E28,TEXT /28 JEDE INDIZIERTE VARIABLE MUSS ALS ARRAY VEREINBART WERDE/ *.-1 TEXT /N./ E29,TEXT /29 TYPNAME FEHLT (IN PARAMETERLISTEN SIND ALLG. TYPVEREINBA/ *.-1 TEXT /RUNGEN VERBOTEN)./ E30,TEXT /30 DIESER TYP WURDE NICHT VEREINBART./ E31,TEXT /31 JEDE VARIABLE MIT KOMPONENTEN-SELEKTOR MUSS ALS RECORD V/ *.-1 TEXT /EREINBART WERDEN./ E32,TEXT /32 'NOT', 'AND' UND 'OR' VERLANGEN OPERANDEN VOM TYP BOOLEA/ *.-1 TEXT /N./ E33,TEXT /33 TYP DIESES AUSDRUCKS UNBESTIMMT (GANZES ARRAY IN ARITHM./ *.-1 TEXT /OPERATIONEN UNZULAESSIG)./ E34,TEXT /34 'DIV' UND 'MOD' VERLANGEN OPERANDEN VOM TYP INTEGER./ E35,TEXT /35 TYPEN DER VERGLEICHSOPERANDEN UNVERTRAEGLICH./ E36,TEXT /36 AKTUAL- UND FORMALPARAMETER MUESSEN VOM GLEICHEN TYP SEI/ *.-1 TEXT /N./ E37,TEXT /37 VARIABLE ERFORDERLICH!/ E38,TEXT /38 EIN STRING MUSS MINDESTENS EIN ZEICHEN ENTHALTEN./ E39,TEXT /39 ANZAHL DER AKTUAL- UND FORMALPARAMETER MUSS UEBEREINSTIM/ *.-1 TEXT /MEN./ E40,TEXT /40 STANDARDPROZEDUR READ NUR FUER TYP INTEGER, REAL UND CHA/ *.-1 TEXT /R VORGESEHEN./ E41,TEXT /41 BEI WRITE SIND NUR DIE TYPEN INTEGER, REAL, BOOLEAN UND / *.-1 TEXT /CHAR ZULAESSIG./ E42,TEXT /42 WRITE(X:M:N) IST NUR FUER WERTE VOM TYP REAL ZULAESSIG./ E43,TEXT /43 M UND N BEI WRITE(X:M:N) MUESSEN INTEGER-AUSDRUECKE SEIN./ E44,TEXT /44 TYP- ODER PROZEDURNAMEN SIND IN AUSDRUECKEN UNZULAESSIG./ E45,TEXT /45 EINE ANWEISUNG KANN NICHT MIT EINEM KONST-, TYP- ODER FU/ *.-1 TEXT /NKTIONSNAMEN BEGINNEN./ E46,TEXT /46 TYPUNVERTRAEGLICHKEIT BEI WERTZUWEISUNG./ E47,TEXT /47 'CASE'-MARKEN MUESSEN VOM GLEICHEN TYP WIE DER 'CASE'-AU/ *.-1 TEXT /SDRUCK SEIN./ E48,TEXT /48 TYP DES ARGUMENTS BEI DIESER STANDARDFUNKTION UNZULAESSI/ *.-1 TEXT /G./ E49,TEXT /49 ARRAY-INDIZES UND 'CASE'-MARKEN SIND AUF -2048 < X < 204/ *.-1 TEXT /8 BEGRENZT./ E50,TEXT /50 EINE KONSTANTE KANN NICHT MIT DEM BEZEICHNETEN SYMBOL BE/ *.-1 TEXT /GINNEN./ E51,TEXT /51 SYMBOL := FEHLT (LEERZEICHEN ZWISCHEN : UND = UNZULAESSI/ *.-1 TEXT /G)./ E52,TEXT /52 DAS WORTSYMBOL 'THEN' FEHLT./ E53,TEXT /53 DAS WORTSYMBOL 'UNTIL' FEHLT./ E54,TEXT /54 DAS WORTSYMBOL 'DO' FEHLT./ E55,TEXT /55 DAS WORTSYMBOL 'TO' ODER 'DOWNTO' FEHLT./ E56,TEXT /56 DAS WORTSYMBOL 'BEGIN' FEHLT./ E57,TEXT /57 DAS WORTSYMBOL 'END' FEHLT./ E58,TEXT /58 EIN FAKTOR MUSS MIT NAME, KONSTANTE, 'NOT' ODER LINKSKLA/ *.-1 TEXT /MMER BEGINNEN./ XLIST /R U N T I M E E R R O R S (ALWAYS FATAL!) *DISPLAY /-------- D I S P L A Y --------/ ZBLOCK 20 /---------------------------------/ XHALT, 0 CLA CLL TAD ZPRINT DCA PTPRINT /SWITCH TO TERMINAL OUTPUT! TAD (HLTLIST-1 DCA HTEXT ISZ HTEXT TAD I HTEXT TAD XHALT SZA CLA JMP .-4 ISZ HTEXT TAD I HTEXT DCA HTEXT CRLF CRLF JMS HMESG TAD (HLTAT DCA HTEXT JMS HMESG L0001 DCA M L7777 TAD PC LOAD JMS IOUT CRLF JMP I OS8 HMESG, 0 TAD I HTEXT SNA JMP I HMESG BSW JMS ASCII TAD I HTEXT JMS ASCII ISZ HTEXT JMP HMESG+1 HTEXT, 0 HLTLIST,-ERROR0-1; HLT0 -ERROR1-1; HLT1 -ERROR2-1; HLT2 -ERROR3-1; HLT3 -ERROR4-1; HLT4 -ERRORA-1; HLTA -ERRORB-1; HLTB -ERRORC-1; HLTC -ERRORD-1; HLTD HLT0, TEXT /DIVISION BY 0 / HLT1, TEXT /UNDERFLOW / HLT2, TEXT /OVERFLOW/ HLT3, TEXT /SQRT/ HLT4, TEXT /LN/ HLTA, TEXT /MEMORY FULL / HLTB, TEXT / INDEX/ HLTC, TEXT /CASE/ HLTD, TEXT /FILE/ HLTAT, TEXT / ERROR AT / PAGE /I N I T I A L I Z A T I O N OF R U N T I M E - S Y S T E M INIT, CLA CLL CDF 10 TAD I (7621 CDF 0 SNA CLA /IF INPUT FILE SPECIFIED JMP INITKB TAD IIDEVH /THEN SETUP FILE INPUT DCA I (IDEVH TAD IIBLOCK DCA I (IBLOCK TAD (JMP ERRORD DCA I (FATAL0 TAD (IBUFFER DCA I (IBP L7775 DCA I (IC3 TAD (GETC SKP INITKB, TAD (XREAD /ELSE KEYBOARD INPUT DCA I (PTREAD CDF 10 TAD I (7600 CDF 0 SNA CLA /IF OUTPUT FILE SPECIFIED JMP INITPR TAD (I37 /THEN SETUP FILE OUTPUT DCA I (PTI37 TAD (PUTC SKP INITPR, TAD (XPRINT /ELSE USE PRINTER DCA I (PTPRINT TAD (XHALT DCA I (PTHALT /ACTIVATE RUNTIME ERRORS INITDH, CDF 60 /TRANSFER DEVICE HANDLER(S) TAD I F6T0 /AND RUNTIME ERROR ROUTINE CDF 0 /TO THEIR PLACE IN FIELD 0 DCA I F6T0 ISZ F6T0 ISZ C1200 JMP .-6 INITST, TAD (CDF CIF 0 /CHANGE STARTING ADDRESS DCA I (7744 /TO START OF INTERPRETER TAD (ISTART DCA I (7745 DCA I (7746 /CORRECT JOB STATUS WORD CDF 10 /(MAKE IT RESTARTABLE) TAD I (7643 AND (20 /CHECK /H - OPTION CDF CIF 0 SZA CLA JMP I (7600 /RETURN TO OS8 MONITOR JMP I (ISTART /START INTERPRETER IIDEVH, 0 IIBLOCK,0 F6T0, IDEVBUF C1200, -1200 PAGE $