; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙INIT01 ; ; THIS ROUTINE IS USED TO OUTPUT COMPILER OVERLAY #0 ; ˙TO THE DISK IN IMAGE FORM ; R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ; ˙.CSECT ; ˙.GLOBL ˙BEG,LGT,TLB,FB0,FB1,FB2,FB3,FB4,FB5 ; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙INIT02 ; ; THIS ROUTINE IS USED TO OUTPUT COMPILER OVERLAY #0 ; ˙TO THE DISK IN IMAGE FORM ; R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ; ˙.CSECT ; ˙.GLOBL ˙BEG,LGT,TLB,FB0,FB1,FB2,FB3,FB4,FB5 ; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙INIT03 ; ; THIS ROUTINE IS USED TO OUTPUT COMPILER OVERLAY #3 ; ˙TO THE DISK IN IMAGE FORM ; R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ; ˙.CSECT ; ˙.GLOBL ˙BEG,LGT,TLB,FB0,FB1,FB2,FB3,FB4,FB5 ; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙INIT04 ; ; THIS ROUTINE IS USED TO OUTPUT COMPILER OVERLAY #4 ; ˙TO THE DISK IN IMAGE FORM ; R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ; ˙.CSECT ; ˙.GLOBL ˙BEG,LGT,TLB,FB0,FB1,FB2,FB3,FB4,FB5 ; INIT: ˙MOV ˙PC,SP ˙ ˙;SET UP ˙TST ˙-(SP) ˙ ˙;A STACK ˙MOV ˙LGT,R0 ˙;GET NUMBER OF BYTES TO OUTPUT ˙SUB ˙BEG,R0 ˙MOV ˙#7,R1 ˙ ˙;WE DIVIDE BY 2^7 FOR NUMBER OF BLOCKS INIT0: ˙ASR ˙R0 ˙ ˙;LOOP ˙DEC ˙R1 ˙ ˙;UNTIL DONE ˙BNE ˙INIT0 ˙ ˙; ˙INC ˙R0 ˙ ˙;ALLOCATE EXTRA BLOCK FOR ROUNDOFF ˙MOV ˙R0,-(SP) ˙;NOW ˙MOV ˙#TLB,-(SP) ˙;INIT ˙EMT ˙6 ˙ ˙;THE DISK ˙MOV ˙#FB1,-(SP) ˙; ALLOCATE ˙MOV ˙#TLB,-(SP) ˙; SOME ˙EMT ˙15 ˙ ˙; CONTIGUOUS SPACE ˙TST ˙(SP)+ ˙ ˙;DID IT WORK OK?? ˙BPL ˙INIT1 ˙ ; INIT: ˙MOV ˙PC,SP ˙ ˙;SET UP ˙TST ˙-(SP) ˙ ˙;A STACK ˙MOV ˙LGT,R0 ˙;GET NUMBER OF BYTES TO OUTPUT ˙SUB ˙BEG,R0 ˙MOV ˙#7,R1 ˙ ˙;WE DIVIDE BY 2^7 FOR NUMBER OF BLOCKS INIT0: ˙ASR ˙R0 ˙ ˙;LOOP ˙DEC ˙R1 ˙ ˙;UNTIL DONE ˙BNE ˙INIT0 ˙ ˙; ˙INC ˙R0 ˙ ˙;ALLOCATE EXTRA BLOCK FOR ROUNDOFF ˙MOV ˙R0,-(SP) ˙;NOW ˙MOV ˙#TLB,-(SP) ˙;INIT ˙EMT ˙6 ˙ ˙;THE DISK ˙MOV ˙#FB2,-(SP) ˙; ALLOCATE ˙MOV ˙#TLB,-(SP) ˙; SOME ˙EMT ˙15 ˙ ˙; CONTIGUOUS SPACE ˙TST ˙(SP)+ ˙ ˙;DID IT WORK OK?? ˙BPL ˙INIT1 ˙ ; INIT: ˙MOV ˙PC,SP ˙ ˙;SET UP ˙TST ˙-(SP) ˙ ˙;A STACK ˙MOV ˙LGT,R0 ˙;GET NUMBER OF BYTES TO OUTPUT ˙SUB ˙BEG,R0 ˙MOV ˙#7,R1 ˙ ˙;WE DIVIDE BY 2^7 FOR NUMBER OF BLOCKS INIT0: ˙ASR ˙R0 ˙ ˙;LOOP ˙DEC ˙R1 ˙ ˙;UNTIL DONE ˙BNE ˙INIT0 ˙ ˙; ˙INC ˙R0 ˙ ˙;ALLOCATE EXTRA BLOCK FOR ROUNDOFF ˙MOV ˙R0,-(SP) ˙;NOW ˙MOV ˙#TLB,-(SP) ˙;INIT ˙EMT ˙6 ˙ ˙;THE DISK ˙MOV ˙#FB3,-(SP) ˙; ALLOCATE ˙MOV ˙#TLB,-(SP) ˙; SOME ˙EMT ˙15 ˙ ˙; CONTIGUOUS SPACE ˙TST ˙(SP)+ ˙ ˙;DID IT WORK OK?? ˙BPL ˙INIT1 ˙ ; INIT: ˙MOV ˙PC,SP ˙ ˙;SET UP ˙TST ˙-(SP) ˙ ˙;A STACK ˙MOV ˙LGT,R0 ˙;GET NUMBER OF BYTES TO OUTPUT ˙SUB ˙BEG,R0 ˙MOV ˙#7,R1 ˙ ˙;WE DIVIDE BY 2^7 FOR NUMBER OF BLOCKS INIT0: ˙ASR ˙R0 ˙ ˙;LOOP ˙DEC ˙R1 ˙ ˙;UNTIL DONE ˙BNE ˙INIT0 ˙ ˙; ˙INC ˙R0 ˙ ˙;ALLOCATE EXTRA BLOCK FOR ROUNDOFF ˙MOV ˙R0,-(SP) ˙;NOW ˙MOV ˙#TLB,-(SP) ˙;INIT ˙EMT ˙6 ˙ ˙;THE DISK ˙MOV ˙#FB4,-(SP) ˙; ALLOCATE ˙MOV ˙#TLB,-(SP) ˙; SOME ˙EMT ˙15 ˙ ˙; CONTIGUOUS SPACE ˙TST ˙(SP)+ ˙ ˙;DID IT WORK OK?? ˙BPL ˙INIT1 ˙ ˙;NO, SCREAM IN AGONY ˙MOV ˙#FB1,-(SP) ˙;NOW FIND ˙CLR ˙-(SP) ˙ ˙; OUT WHERE ˙MOV ˙#TLB,-(SP) ˙;THE FILE ˙EMT ˙14 ˙ ˙;WAS PLACED ˙MOV ˙(SP)+,TBLK ˙;GET THE DISK ADDRESS ˙ADD ˙#4,SP ˙ ˙;DISCARD JUNK ˙MOV ˙BEG,TBLK+2 ˙;CORE ADDRESS ˙MOV ˙LGT,R2 ˙ ˙;THE ˙SUB ˙BEG,R2 ˙ASR ˙R2 ˙ ˙;WORD COUNT ˙MOV ˙R2,TBLK+4 ˙;IS SAVED TOO ˙MOV ˙#TBLK,-(SP) ˙MOV ˙#TLB,-(SP) ˙EMT ˙10 ˙ ˙;NOW TRANSFER THE DATA ˙MOV ˙#TLB,-(SP) ˙;WAIT ˙EMT ˙1 ˙ ˙;UNTIL DONE ˙EMT ˙60 ˙ ˙;AND EXIT ; INIT1: ˙CLR ˙ ˙;NO, SCREAM IN AGONY ˙MOV ˙#FB2,-(SP) ˙;NOW FIND ˙CLR ˙-(SP) ˙ ˙; OUT WHERE ˙MOV ˙#TLB,-(SP) ˙;THE FILE ˙EMT ˙14 ˙ ˙;WAS PLACED ˙MOV ˙(SP)+,TBLK ˙;GET THE DISK ADDRESS ˙ADD ˙#4,SP ˙ ˙;DISCARD JUNK ˙MOV ˙BEG,TBLK+2 ˙;CORE ADDRESS ˙MOV ˙LGT,R2 ˙ ˙;THE ˙SUB ˙BEG,R2 ˙ASR ˙R2 ˙ ˙;WORD COUNT ˙MOV ˙R2,TBLK+4 ˙;IS SAVED TOO ˙MOV ˙#TBLK,-(SP) ˙MOV ˙#TLB,-(SP) ˙EMT ˙10 ˙ ˙;NOW TRANSFER THE DATA ˙MOV ˙#TLB,-(SP) ˙;WAIT ˙EMT ˙1 ˙ ˙;UNTIL DONE ˙EMT ˙60 ˙ ˙;AND EXIT ; INIT1: ˙CLR ˙ ˙;NO, SCREAM IN AGONY ˙MOV ˙#FB3,-(SP) ˙;NOW FIND ˙CLR ˙-(SP) ˙ ˙; OUT WHERE ˙MOV ˙#TLB,-(SP) ˙;THE FILE ˙EMT ˙14 ˙ ˙;WAS PLACED ˙MOV ˙(SP)+,TBLK ˙;GET THE DISK ADDRESS ˙ADD ˙#4,SP ˙ ˙;DISCARD JUNK ˙MOV ˙BEG,TBLK+2 ˙;CORE ADDRESS ˙MOV ˙LGT,R2 ˙ ˙;THE ˙SUB ˙BEG,R2 ˙ASR ˙R2 ˙ ˙;WORD COUNT ˙MOV ˙R2,TBLK+4 ˙;IS SAVED TOO ˙MOV ˙#TBLK,-(SP) ˙MOV ˙#TLB,-(SP) ˙EMT ˙10 ˙ ˙;NOW TRANSFER THE DATA ˙MOV ˙#TLB,-(SP) ˙;WAIT ˙EMT ˙1 ˙ ˙;UNTIL DONE ˙EMT ˙60 ˙ ˙;AND EXIT ; INIT1: ˙CLR ˙ ˙;NO, SCREAM IN AGONY ˙MOV ˙#FB4,-(SP) ˙;NOW FIND ˙CLR ˙-(SP) ˙ ˙; OUT WHERE ˙MOV ˙#TLB,-(SP) ˙;THE FILE ˙EMT ˙14 ˙ ˙;WAS PLACED ˙MOV ˙(SP)+,TBLK ˙;GET THE DISK ADDRESS ˙ADD ˙#4,SP ˙ ˙;DISCARD JUNK ˙MOV ˙BEG,TBLK+2 ˙;CORE ADDRESS ˙MOV ˙LGT,R2 ˙ ˙;THE ˙SUB ˙BEG,R2 ˙ASR ˙R2 ˙ ˙;WORD COUNT ˙MOV ˙R2,TBLK+4 ˙;IS SAVED TOO ˙MOV ˙#TBLK,-(SP) ˙MOV ˙#TLB,-(SP) ˙EMT ˙10 ˙ ˙;NOW TRANSFER THE DATA ˙MOV ˙#TLB,-(SP) ˙;WAIT ˙EMT ˙1 ˙ ˙;UNTIL DONE ˙EMT ˙60 ˙ ˙;AND EXIT ; INIT1: ˙CLR ˙-(SP) ˙MOV ˙#1441,-(SP) ˙IOT ˙ ˙ ˙;DIE IN EXTREME AGONY ; TBLK: ˙0 ˙;START BLOCK ˙0 ˙;START CORE ADDRESS ˙0 ˙;WORD COUNT ˙2 ˙;WRITE ˙0 ˙;RESERVED ; ˙.END ˙INIT -(SP) ˙MOV ˙#1441,-(SP) ˙IOT ˙ ˙ ˙;DIE IN EXTREME AGONY ; TBLK: ˙0 ˙;START BLOCK ˙0 ˙;START CORE ADDRESS ˙0 ˙;WORD COUNT ˙2 ˙;WRITE ˙0 ˙;RESERVED ; ˙.END ˙INIT -(SP) ˙MOV ˙#1441,-(SP) ˙IOT ˙ ˙ ˙;DIE IN EXTREME AGONY ; TBLK: ˙0 ˙;START BLOCK ˙0 ˙;START CORE ADDRESS ˙0 ˙;WORD COUNT ˙2 ˙;WRITE ˙0 ˙;RESERVED ; ˙.END ˙INIT -(SP) ˙MOV ˙#1441,-(SP) ˙IOT ˙ ˙ ˙;DIE IN EXTREME AGONY ; TBLK: ˙0 ˙;START BLOCK ˙0 ˙;START CORE ADDRESS ˙0 ˙;WORD COUNT ˙2 ˙;WRITE ˙0 ˙;RESERVED ; ˙.END ˙INIT ; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙INIT05 ; ; THIS ROUTINE IS USED TO OUTPUT COMPILER OVERLAY #5 ; ˙TO THE DISK IN IMAGE FORM ; R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ; ˙.CSECT ; ˙.GLOBL ˙BEG,LGT,TLB,FB0,FB1,FB2,FB3,FB4,FB5 ; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙EXECU3 ˙.GLOBL ˙GETLN,SCANNR,EXEC,LOW,EXECU,EXJMP ˙.GLOBL ˙MAIN,HDR,BLKDAT,BLKD,HDRGEN ˙.GLOBL ˙SCAN2A,GETSW,ASGN,SEQNO ˙.GLOBL ˙ALOCAT,LINE,END003,DODON,SYN2ER ˙.CSECT R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙TFUN ; ; CHECK MODE OF SPECIAL CLASS OF FUNCTIONS, AND RESET ; ˙TYPE IF NECESSARY. IF THE FUNCTION NAME MATCHES AND ; ˙THE EXPLICITLY TYPED BIT IS NOT SET THE TYPE ; ˙MAY BE SAFELY CHANGED. ; ˙.GLOBL ˙TFUNX,SYM1WD,SYM2WD,DATYMM,DATYWD ˙.G; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙EXECU4 ˙.GLOBL ˙GETLN,SCANNR,EXEC,LOW,EXECU,EXJMP ˙.GLOBL ˙MAIN,HDR,BLKDAT,BLKD,HDRGEN ˙.GLOBL ˙SCAN2A,GETSW,ASGN,SEQNO ˙.GLOBL ˙ALOCAT,LINE,END003,DODON,SYN2ER ˙.CSECT R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ; INIT: ˙MOV ˙PC,SP ˙ ˙;SET UP ˙TST ˙-(SP) ˙ ˙;A STACK ˙MOV ˙LGT,R0 ˙;GET NUMBER OF BYTES TO OUTPUT ˙SUB ˙BEG,R0 ˙MOV ˙#7,R1 ˙ ˙;WE DIVIDE BY 2^7 FOR NUMBER OF BLOCKS INIT0: ˙ASR ˙R0 ˙ ˙;LOOP ˙DEC ˙R1 ˙ ˙;UNTIL DONE ˙BNE ˙INIT0 ˙ ˙; ˙INC ˙R0 ˙ ˙;ALLOCATE EXTRA BLOCK FOR ROUNDOFF ˙MOV ˙R0,-(SP) ˙;NOW ˙MOV ˙#TLB,-(SP) ˙;INIT ˙EMT ˙6 ˙ ˙;THE DISK ˙MOV ˙#FB5,-(SP) ˙; ALLOCATE ˙MOV ˙#TLB,-(SP) ˙; SOME ˙EMT ˙15 ˙ ˙; CONTIGUOUS SPACE ˙TST ˙(SP)+ ˙ ˙;DID IT WORK OK?? ˙BPL ˙INIT1 ˙˙= ˙%6 PC ˙= ˙%7 ; SPACE ˙= ˙40 ; ; EXECUT IS THE MAIN EXECUTABLE CONTROL ; ˙LOOP FOR THE COMPILER. IT CALLS ; ˙GETLN FOR A LINE OF TEXT AND THEN DISPATCHES TO ; ˙THE PROPER STATEMENT HANDLER. ; ; ˙EACH STATEMENT HANDLER IS DISPATCHED TO BY A "JSRPC,XXX". ; ˙UPON ENTRY TO THE HANDLER, R1 POINTS TO THE CHARACTER ; ˙WHERE THE RECOGNITION SCAN LEFT OFF. ; ; ˙EACH HANDLER IS, IN GENERAL, RESPONSIBLE FOR COMPLETE ; ˙PROCESSING OF THE REMAINDER OF THE LINE, UP TO AND ; ˙INCLUDING THE TERMINATOR LOBL ˙CURSYM,EXPMKM,EXPWD ; R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ˙.CSECT ; TFUNX: ˙MOV ˙R0,-(SP) ˙;SAVE ˙MOV ˙R1,-(SP) ˙;R0 AND R1 ˙MOV ˙CURSYM,R0 ˙;GET SYMBOL ADDRESS ˙BIT ˙#EXPMKM,EXPWD(R0) ;IS IT EXPLICITLY TYPED?? ˙BNE ˙TF004 ˙ ˙;YES, SO EXIT NOW ˙MOV ˙#FUNLST,R1 ˙;ADDRESS OF LIST TO SEARCH TF001: ˙CMP ˙SYM1WD(R0),(R1)+ ;DOES FIRST WORD MATCH ˙BNE ˙TF002 ˙ ˙;NO ˙CMP ˙SYM2WD(R0),(R1)+ ;DOES SECOND MATCH ˙BEQ ˙TF005 ˙ ˙;YES TF003:˙= ˙%6 PC ˙= ˙%7 ; SPACE ˙= ˙40 ; ; EXECUT IS THE MAIN EXECUTABLE CONTROL ; ˙LOOP FOR THE COMPILER. IT CALLS ; ˙GETLN FOR A LINE OF TEXT AND THEN DISPATCHES TO ; ˙THE PROPER STATEMENT HANDLER. ; ; ˙EACH STATEMENT HANDLER IS DISPATCHED TO BY A "JSRPC,XXX". ; ˙UPON ENTRY TO THE HANDLER, R1 POINTS TO THE CHARACTER ; ˙WHERE THE RECOGNITION SCAN LEFT OFF. ; ; ˙EACH HANDLER IS, IN GENERAL, RESPONSIBLE FOR COMPLETE ; ˙PROCESSING OF THE REMAINDER OF THE LINE, UP TO AND ; ˙INCLUDING THE TERMINATOR  ˙;NO, SCREAM IN AGONY ˙MOV ˙#FB5,-(SP) ˙;NOW FIND ˙CLR ˙-(SP) ˙ ˙; OUT WHERE ˙MOV ˙#TLB,-(SP) ˙;THE FILE ˙EMT ˙14 ˙ ˙;WAS PLACED ˙MOV ˙(SP)+,TBLK ˙;GET THE DISK ADDRESS ˙ADD ˙#4,SP ˙ ˙;DISCARD JUNK ˙MOV ˙BEG,TBLK+2 ˙;CORE ADDRESS ˙MOV ˙LGT,R2 ˙ ˙;THE ˙SUB ˙BEG,R2 ˙ASR ˙R2 ˙ ˙;WORD COUNT ˙MOV ˙R2,TBLK+4 ˙;IS SAVED TOO ˙MOV ˙#TBLK,-(SP) ˙MOV ˙#TLB,-(SP) ˙EMT ˙10 ˙ ˙;NOW TRANSFER THE DATA ˙MOV ˙#TLB,-(SP) ˙;WAIT ˙EMT ˙1 ˙ ˙;UNTIL DONE ˙EMT ˙60 ˙ ˙;AND EXIT ; INIT1: ˙CLR ˙BYTE. ; ; ˙RETURN FROM THE HANDLER IS AS FOLLOWS: A NORMAL ; ˙RETURN WILL RETURN USING A "RTS PC" WITH THE V-BIT ; ˙OF THE STATUS WORD CLEAR. A RETURN WITH THE V-BIT ; ˙SET MAY ONLY OCCUR IF THE LINE IN QUESTION COULD ; ˙NOT BE OF THE ASSUMED TYPE. ; ; ˙ ˙EXAMPLE: COMMON=1 IS A LEGAL STATEMENT, BUT ; ˙ ˙THE COMMON PROCESSOR WOULD FIND IT ; ˙ ˙UNRECOGNIZABLE SO THE PROCESSOR WOULD SET THE ; ˙ ˙V-BIT BEFORE RETURNING. ; ; ˙THE IMPLICIT AND TYPE PROCESSORS ARE ENTERED ; ˙AS ABOVE EXCEPT THAT ˙CMP ˙R1,#FUNEND ˙;IS THE SEARCH DONE?? ˙BLO ˙TF001 ˙ ˙;NO TF004: ˙MOV ˙(SP)+,R1 ˙;RESTORE R1 ˙MOV ˙(SP)+,R0 ˙;AND R0 AND ˙RTS ˙PC ˙ ˙;RETURN TF002: ˙TST ˙(R1)+ ˙ ˙;SKIP EXTRA WORD ˙BR ˙TF003 ˙ ˙;AND CONTINUE TF005: ˙SUB ˙#FUNLST+4,R1 ˙;GET THE TYPE INDEX ˙ASR ˙R1 ˙ASR ˙R1 ˙ ˙;HERE ˙MOVB ˙CHMOD(R1),R2 ˙;RESET THE TYPE ˙BIC ˙#DATYMM,DATYWD(R0) ;CLEAR OLD TYPE ˙SWAB ˙R2 ˙BIS ˙R2,DATYWD(R0) ˙;SET THE NEW TYPE ˙SWAB ˙R2 ˙ASR ˙R2 ˙ASR ˙R2 ˙ASR ˙R2 ˙;MODE IS NOW CORRECT IN R2 ˙ BYTE. ; ; ˙RETURN FROM THE HANDLER IS AS FOLLOWS: A NORMAL ; ˙RETURN WILL RETURN USING A "RTS PC" WITH THE V-BIT ; ˙OF THE STATUS WORD CLEAR. A RETURN WITH THE V-BIT ; ˙SET MAY ONLY OCCUR IF THE LINE IN QUESTION COULD ; ˙NOT BE OF THE ASSUMED TYPE. ; ; ˙ ˙EXAMPLE: COMMON=1 IS A LEGAL STATEMENT, BUT ; ˙ ˙THE COMMON PROCESSOR WOULD FIND IT ; ˙ ˙UNRECOGNIZABLE SO THE PROCESSOR WOULD SET THE ; ˙ ˙V-BIT BEFORE RETURNING. ; ; ˙THE IMPLICIT AND TYPE PROCESSORS ARE ENTERED ; ˙AS ABOVE EXCEPT THAT-(SP) ˙MOV ˙#1441,-(SP) ˙IOT ˙ ˙ ˙;DIE IN EXTREME AGONY ; TBLK: ˙0 ˙;START BLOCK ˙0 ˙;START CORE ADDRESS ˙0 ˙;WORD COUNT ˙2 ˙;WRITE ˙0 ˙;RESERVED ; ˙.END ˙INIT " R0 CONTAIS THE MODE OF ; ˙THE IMPLICIT OR TYPE STATEMENT ; ˙REGISTERS CHANGED - ALL. ; SCANX: ˙TST ˙EXEC ˙ ˙;EXECUTABLES ALREADY STARTED? ˙BNE ˙SCANR ˙ ˙;YES ˙JMP ˙SCANNR ˙;NO GO BACK TO NON-EX END00: ˙TRAP+39. ˙ ˙;MISSING END STATEMENT ˙JSR ˙PC,END003 ˙;LINKAGE TO END HANDLER SCANNE: ˙JSR ˙PC,ALOCAT ˙;NO, GO ALLOCATE COMMON ˙MOV ˙#1,EXEC ˙ ˙;SET EXECUTABLE FLAG ˙MOV ˙LOW,SP ˙ ˙;SET EXECUTABLE STACK SCANR: ˙JSR ˙PC,SYN2ER ˙;PRINT ANY DIAGNOSTICS WHICH ˙ ˙ ˙ ˙;OCCURRED, THIS STATEMENT #BR ˙TF004 ˙;NOW EXIT ; ; FUNCTION NAMES FOLLOW HERE IN RADIX 50 ; FUNLST: ˙.RAD50 ˙/DAB/ ˙;DOUBLE ˙.RAD50 ˙/S/ ˙.RAD50 ˙/DMA/ ˙;DOUBLE ˙.RAD50 ˙/X1/ ˙.RAD50 ˙/DSI/ ˙.RAD50 ˙/GN/ ˙.RAD50 ˙/DBL/ ˙;DOUBLE ˙.RAD50 ˙/E/ ˙.RAD50 ˙/CMP/ ˙˙;COMPLEX ˙.RAD50 ˙/LX/ ˙.RAD50 ˙/CON/ ˙;COMPLEX ˙.RAD50 ˙/JG/ ˙.RAD50 ˙/DEX/ ˙;DOUBLE ˙.RAD50 ˙/P/ ˙.RAD50 ˙/CEX/ ˙;COMPLEX ˙.RAD50 ˙/P/ ˙.RAD50 ˙/DLO/ ˙;DOUBLE ˙.RAD50 ˙/G/ ˙.RAD50 ˙/CLO/ ˙;COMPLEX ˙.RAD50 ˙/G/ ˙.RAD50 ˙/DLO/ ˙;DOUBL$ R0 CONTAIS THE MODE OF ; ˙THE IMPLICIT OR TYPE STATEMENT ; ˙REGISTERS CHANGED - ALL. ; SCANX: ˙TST ˙EXEC ˙ ˙;EXECUTABLES ALREADY STARTED? ˙BNE ˙SCANR ˙ ˙;YES ˙JMP ˙SCANNR ˙;NO GO BACK TO NON-EX END00: ˙TRAP+39. ˙ ˙;MISSING END STATEMENT ˙JSR ˙PC,END003 ˙;LINKAGE TO END HANDLER SCANNE: ˙JSR ˙PC,ALOCAT ˙;NO, GO ALLOCATE COMMON ˙MOV ˙#1,EXEC ˙ ˙;SET EXECUTABLE FLAG ˙MOV ˙LOW,SP ˙ ˙;SET EXECUTABLE STACK SCANR: ˙JSR ˙PC,SYN2ER ˙;PRINT ANY DIAGNOSTICS WHICH ˙ ˙ ˙ ˙;OCCURRED, THIS STATEMENT %; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙ASF021 ;WRITTEN BY RONALD F. BRENDER ;COPYRIGHT 1971 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ˙.GLOBL ˙ASF999,COMWD,ENTYMM,ENTYWD,PARMKM,PARWD ˙.GLOBL ˙ZLEQLS,GET,CURSYM,SYM& ˙.GLOBL ˙SYN2ER ˙INC ˙SEQNO ˙ ˙;ADVANCE SEQUENCE NUMBER ˙JSR ˙PC,GETLN ˙;GET A LINE OF TEXT ˙BVS ˙END00 ˙ ˙;ASSUME END IF EOF OR EOM EXECU: ˙MOV ˙#LINE,R1 ˙;REMEMBER WHERE LINE STARTS ˙MOVB ˙#1,GETSW ˙;SET UP GET SWITCH ˙MOV ˙#EXTBL,R0 ˙;ADDRESS OF EXECUTABLE PROTOTYPES ˙JSR ˙PC,SCAN2A ˙;GO SEARCH FOR PROTOTYPE ˙BVS ˙SCAN10 ˙ ˙;JUMP IF NOT FOUND ˙JSR ˙PC,@EXJMP(R0) ˙;JUMP TO EXECUTABLES ˙BVC ˙SCAN22 SCAN10: ˙MOV ˙#LINE,R1 ˙;RESET POINTER ˙JSR ˙PC,ASGN ˙ ˙;GO DO ASSIGNMENT STATEMENT 'E ˙.RAD50 ˙/G10/ ˙.RAD50 ˙/DSI/ ˙;DOUBLE ˙.RAD50 ˙/N/ ˙.RAD50 ˙/CSI/ ˙;COMPLEX ˙.RAD50 ˙/N/ ˙.RAD50 ˙/DCO/ ˙;DOUBLE ˙.RAD50 ˙/S/ ˙.RAD50 ˙/CCO/ ˙;COMPLEX ˙.RAD50 ˙/S/ ˙.RAD50 ˙/DSQ/ ˙;DOUBLE ˙.RAD50 ˙/RT/ ˙.RAD50 ˙/CSQ/ ˙;COMPLEX ˙.RAD50 ˙/RT/ ˙.RAD50 ˙/DAT/ ˙;DOUBLE ˙.RAD50 ˙/AN/ ˙.RAD50 ˙/DAT/ ˙;DOUBLE ˙.RAD50 ˙/AN2/ ˙.RAD50 ˙/DMO/ ˙;DOUBLE ˙.RAD50 ˙/D/ FUNEND ˙= ˙. CHMOD: ˙.BYTE ˙40,40,40,40,50,50 ˙.BYTE ˙40,50,40,50,40,40,50,40 ˙.BYTE ˙50,40,50,40,40,40 ˙.( ˙.GLOBL ˙SYN2ER ˙INC ˙SEQNO ˙ ˙;ADVANCE SEQUENCE NUMBER ˙JSR ˙PC,GETLN ˙;GET A LINE OF TEXT ˙BVS ˙END00 ˙ ˙;ASSUME END IF EOF OR EOM EXECU: ˙MOV ˙#LINE,R1 ˙;REMEMBER WHERE LINE STARTS ˙MOVB ˙#1,GETSW ˙;SET UP GET SWITCH ˙MOV ˙#EXTBL,R0 ˙;ADDRESS OF EXECUTABLE PROTOTYPES ˙JSR ˙PC,SCAN2A ˙;GO SEARCH FOR PROTOTYPE ˙BVS ˙SCAN10 ˙ ˙;JUMP IF NOT FOUND ˙JSR ˙PC,@EXJMP(R0) ˙;JUMP TO EXECUTABLES ˙BVC ˙SCAN22 SCAN10: ˙MOV ˙#LINE,R1 ˙;RESET POINTER ˙JSR ˙PC,ASGN ˙ ˙;GO DO ASSIGNMENT STATEMENT )BAS,FLABL,CHTEST ˙.GLOBL ˙OUTSER,EOL,OUTST,SGLWD,SGLMKM,FNCTYP ˙.GLOBL ˙PUTSYM,DATYWD,SERIAL,COMNWD,DATYMK,SERWD ˙.GLOBL ˙ADBPWD,CNXC1,SUBEXP,FNCTYP,EXPGEN ˙.GLOBL ˙SYM1WD,SYM2WD,OUTLN1,OUTLN2,GETSW ˙.GLOBL ˙NOCNSV ASF999: ˙CLRB ˙NOCNSV ˙ ˙˙;TURN OFF WEIRDO FLAG ˙JSR ˙PC,ZLEQLS ˙BCS ˙ASF001 ASF000: ˙CLRB ˙GETSW ˙;PRE-ASF STATE ˙SEV ˙RTS ˙PC ;HAS ZERO LEVEL EQUALS ASF001: ˙MOV ˙R1,FNCTYP ˙;REMEMBER CURRENT TEXT ASF002: ˙JSR ˙PC,CNXC1 ˙;MUST LOOK FOR ˙JSR ˙PC,CHTEST ˙;FIRST NON-ALPH* SCAN16: ˙BVS ˙SCANX SCAN22: ˙TSTB ˙LINENO ˙ ˙;CHECK FOR LINE NUMBER ˙.GLOBL ˙LINENO ˙BEQ ˙SCANNE ˙ ˙;NO LINE NUMBER ˙JSR ˙PC,DODON ˙;GO HANDLE DO ENDINGS ˙BR ˙SCANNE ;OVERLAY TRANSFER VECTOR ˙.GLOBL ˙OVJMP OVJMP: ˙JMP ˙@EXJMP(R0) ˙;TRANSFER TO DESIRED ROUTINE ; ; TABLE OF EXECUTABLE PROTOTYPES - THIS IS A DUAL TABLE, THE FIRST ; ˙PART POINTS TO THE ASCII IN THE SECOND PART. EACH TABLE ; ˙MUST BE TERMINATED BY A ZERO. ; ˙.GLOBL ˙IFTAB EXTBL: ˙E6 ˙E8 ˙E12 IFTAB: ˙E1 ˙E2 ˙E3 EVEN ˙.END , SCAN16: ˙BVS ˙SCANX SCAN22: ˙TSTB ˙LINENO ˙ ˙;CHECK FOR LINE NUMBER ˙.GLOBL ˙LINENO ˙BEQ ˙SCANNE ˙ ˙;NO LINE NUMBER ˙JSR ˙PC,DODON ˙;GO HANDLE DO ENDINGS ˙BR ˙SCANNE ;OVERLAY TRANSFER VECTOR ˙.GLOBL ˙OVJMP OVJMP: ˙JMP ˙@EXJMP(R0) ˙;TRANSFER TO DESIRED ROUTINE ; ; TABLE OF EXECUTABLE PROTOTYPES - THIS IS A DUAL TABLE, THE FIRST ; ˙PART POINTS TO THE ASCII IN THE SECOND PART. EACH TABLE ; ˙MUST BE TERMINATED BY A ZERO. ; ˙.GLOBL ˙IFTAB EXTBL: ˙E6 ˙E8 ˙E12 IFTAB: ˙E1 ˙E2 ˙E3 -ANUMERIC ˙BCC ˙ASF002 ˙ ˙;BR=> ALFANUM ˙CMPB ˙#'(,@R1 ˙ ˙;IS IT (? ˙BNE ˙ASF000 ˙ ˙;NO => CAN'T BE ASF ˙MOV ˙FNCTYP,R1 ˙;RESET TEXT POINTER & TRY SOMEMORE ˙INCB ˙GETSW ˙ ˙;ENABLE FUNCTION CHECK ˙JSR ˙PC,GET ˙;MUST BEGIN WITH IDENTIFIER ˙˙BVS ˙ASF000 ˙ ˙;BAD NAME ˙CMP ˙#2,R3 ˙;MUST "LOOK" LIKE A FUNCTION CALL ˙BNE ˙ASF000 ˙ ˙;BR=>NOT FUNCTION ; ;FROM HERE ON ASSUME IS AN ASF ; ASF200: ˙MOV ˙CURSYM,R0 ˙;BASE OF FUNCTION NAME ENTRY ˙BIT ˙#170000,COMWD(R0) ˙;ANY PREV ALLOCATION IS AN . ˙E9 ˙E10 ˙E11 ˙E13 ˙E14 ˙E15 ˙E16 ˙E17 ˙E18 ˙E19 ˙E20 ˙E21 ˙0 ; END OF PART 1 ; ; START OF PART 2 E6: ˙.ASCII ˙/END/ E8: ˙.ASCII ˙/FORMAT/ E12: ˙.ASCII ˙/DO/ E1: ˙.ASCII ˙/ASSIGN/ E2: ˙.ASCII ˙/CALL/ E3: ˙.ASCII ˙/CONTINUE/ E9: ˙.ASCII ˙/RETURN/ E10: ˙.ASCII ˙/GOTO/ E11: ˙.ASCII ˙/IF(/ E13: ˙.ASCII ˙/PAUSE/ E14: ˙.ASCII ˙/STOP/ E15: ˙.ASCII ˙/READ/ E16: ˙.ASCII ˙/PRINT/ E17: ˙.ASCII ˙/WRITE/ E18: ˙.ASCII ˙/REWIND/ E19: ˙.ASCII ˙/BACKSPACE/ E20: ˙.ASCII ˙/FIND/ /; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙EXECU5 ˙.GLOBL ˙GETLN,SCANNR,EXEC,LOW,EXECU,EXJMP ˙.GLOBL ˙MAIN,HDR,BLKDAT,BLKD,HDRGEN ˙.GLOBL ˙SCAN2A,GETSW,ASGN,SEQNO ˙.GLOBL ˙ALOCAT,LINE,END003,DODON,SYN2ER ˙.CSECT R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP 0 ˙E9 ˙E10 ˙E11 ˙E13 ˙E14 ˙E15 ˙E16 ˙E17 ˙E18 ˙E19 ˙E20 ˙E21 ˙0 ; END OF PART 1 ; ; START OF PART 2 E6: ˙.ASCII ˙/END/ E8: ˙.ASCII ˙/FORMAT/ E12: ˙.ASCII ˙/DO/ E1: ˙.ASCII ˙/ASSIGN/ E2: ˙.ASCII ˙/CALL/ E3: ˙.ASCII ˙/CONTINUE/ E9: ˙.ASCII ˙/RETURN/ E10: ˙.ASCII ˙/GOTO/ E11: ˙.ASCII ˙/IF(/ E13: ˙.ASCII ˙/PAUSE/ E14: ˙.ASCII ˙/STOP/ E15: ˙.ASCII ˙/READ/ E16: ˙.ASCII ˙/PRINT/ E17: ˙.ASCII ˙/WRITE/ E18: ˙.ASCII ˙/REWIND/ E19: ˙.ASCII ˙/BACKSPACE/ E20: ˙.ASCII ˙/FIND/ 1 ˙ ˙ ˙ ˙ ˙;ERROR IN THIS NAME ˙BNE ˙ASF203 ˙ ˙ ˙;BR=>NAME ERROR ˙BIC ˙#ENTYMM,ENTYWD(R0) ˙BR ˙ASF202 ˙ ˙ ˙;BR=>NAME OKAY ASF203: ˙TRAP+97. ASF202: ˙BIS ˙#40000,ENTYWD(R0) ˙;MARK AS ASF ˙MOV ˙DATYWD(R0),R2 ˙;EXTRACT TYPE ˙BIC ˙#DATYMK,R2 ˙CLC ˙ ˙ ˙;ALIGN FOR LATER INSERTION IN INTERNAL POLISH ˙ROL ˙R2 ˙MOV ˙R2,FNCTYP ˙;AND SAVE IN HANDY PLACE. ;SET UP THE FUNCTION ENTRY ;FIRST CAUSE BRANCH AROUND THIS ROUTINE ˙JSR ˙R5,OUTLN2 ˙ASFT01 ˙ ˙ ˙;"$TR," ˙MOV ˙FLABL,R3 ˙MOV ˙R3,-(SP2 E21 ˙= ˙. ˙.EVEN ; END OF PART 2 ˙.GLOBL ˙OV4JMP,OV5JMP,CALL,END,IF ˙.GLOBL ˙IFJMP,DO ; EXJMP: ˙END ˙OV5JMP ˙;FORMAT IS IN OVERLAY 5 ˙DO IFJMP: ˙OV5JMP ˙;ASSIGN IS IN OVERLAY 5 ˙CALL ˙OV5JMP ˙;CONTINUE IS IN OVERLAY 5 ˙OV5JMP ˙;RETURN IS IN OVERLAY 5 ˙OV5JMP ˙;GOTO IS IN OVERLAY 5 ˙IF ˙OV5JMP ˙;PAUSE IS IN OVERLAY 5 ˙OV5JMP ˙;STOP IS IN OVERLAY 5 ˙OV4JMP ˙;READ IS IN OVERLAY 4 ˙OV4JMP ˙;PRINT IS IN OVERLAY 4 ˙OV4JMP ˙;WRITE IS IN OVERLAY 4 ˙OV5JMP ˙;REWIND IS IN OVERLA3˙= ˙%6 PC ˙= ˙%7 ; SPACE ˙= ˙40 ; ; EXECUT IS THE MAIN EXECUTABLE CONTROL ; ˙LOOP FOR THE COMPILER. IT CALLS ; ˙GETLN FOR A LINE OF TEXT AND THEN DISPATCHES TO ; ˙THE PROPER STATEMENT HANDLER. ; ; ˙EACH STATEMENT HANDLER IS DISPATCHED TO BY A "JSRPC,XXX". ; ˙UPON ENTRY TO THE HANDLER, R1 POINTS TO THE CHARACTER ; ˙WHERE THE RECOGNITION SCAN LEFT OFF. ; ; ˙EACH HANDLER IS, IN GENERAL, RESPONSIBLE FOR COMPLETE ; ˙PROCESSING OF THE REMAINDER OF THE LINE, UP TO AND ; ˙INCLUDING THE TERMINATOR 4 E21 ˙= ˙. ˙.EVEN ; END OF PART 2 ˙.GLOBL ˙OV3JMP,OV5JMP,END,IF,READ,PRINT,WRITE ˙.GLOBL ˙FIND ˙.GLOBL ˙IFJMP ; EXJMP: ˙END ˙OV5JMP ˙;FORMAT IS IN OVERLAY 5 ˙OV3JMP ˙;DO IS IN OVERLAY 3 IFJMP: ˙OV5JMP ˙;ASSIGN IS IN OVERLAY 5 ˙OV3JMP ˙;CALL IS IN OVERLAY 3 ˙OV5JMP ˙;CONTINUE IS IN OVERLAY 5 ˙OV5JMP ˙;RETURN IS IN OVERLAY 5 ˙OV5JMP ˙;GOTO IS IN OVERLAY 5 ˙IF ˙OV5JMP ˙;PAUSE IS IN OVERLAY 5 ˙OV5JMP ˙;STOP IS IN OVERLAY 5 ˙READ ˙PRINT ˙WRITE ˙OV5JMP ˙;REWIND IS IN OVERLA5) ˙;SAVE LABEL NUMBER TO END ˙INC ˙FLABL ˙ ˙;OF FUNCTION & INC FOR NEXT USE ˙MOV ˙#'F,R0 ˙JSR ˙PC,OUTSER ˙JSR ˙PC,EOL ˙MOV ˙CURSYM,R0 ˙JSR ˙PC,OUTST ˙;LABEL THE ENTRY POINT ˙JSR ˙R5,OUTLN2 ˙;ENTER POLISH MODE ˙ASFT02 ˙ ˙ ˙;"JSR%4,$POLSH" ;COLLECT ARGUMENTS ; AS EACH ARGUMENT IS ENCOUNTERED ; IT IS PLACED ON THE STACK UNDER THE ; TOP OF THE STACK (WHICH IS THE COUNT ; OF ARGUMENTS ON THE STACK). ; ˙CLY 5 ˙OV5JMP ˙;BACKSPACE IS IN OVERLAY 5 ˙OV4JMP ˙;FIND IS IN OVERLAY 4 ; ˙.END 7BYTE. ; ; ˙RETURN FROM THE HANDLER IS AS FOLLOWS: A NORMAL ; ˙RETURN WILL RETURN USING A "RTS PC" WITH THE V-BIT ; ˙OF THE STATUS WORD CLEAR. A RETURN WITH THE V-BIT ; ˙SET MAY ONLY OCCUR IF THE LINE IN QUESTION COULD ; ˙NOT BE OF THE ASSUMED TYPE. ; ; ˙ ˙EXAMPLE: COMMON=1 IS A LEGAL STATEMENT, BUT ; ˙ ˙THE COMMON PROCESSOR WOULD FIND IT ; ˙ ˙UNRECOGNIZABLE SO THE PROCESSOR WOULD SET THE ; ˙ ˙V-BIT BEFORE RETURNING. ; ; ˙THE IMPLICIT AND TYPE PROCESSORS ARE ENTERED ; ˙AS ABOVE EXCEPT THATY 5 ˙OV5JMP ˙;BACKSPACE IS IN OVERLAY 5 ˙FIND ; ˙.END ER ˙-(SP) ˙ ˙;#ARGUMENTS ASF201: ˙INC ˙R1 ˙;GET PAST ( OR , ˙JSR ˙PC,GET ˙ ˙;COLLECT AN ARGUMENT ˙BVS ˙ASF280 ˙ ˙;ARG N.G. ˙TST ˙R3 ˙ ˙;MUST NOT BE A CONSTANT ˙BMI ˙ASF280 ˙ ˙;BR => IS A CONSTANT ˙MOV ˙CURSYM,R4 ˙BIT ˙SGLWD(R4),#SGLMKM ˙˙BNE ˙ASF210 ˙ ˙;BR=> IS FIRST OCCURANCE, USE IT! ;CREATE NEW ENTRY. ˙MOV ˙CURSYM,R0 ˙;FORCE A NEW ENTRY FOR THIS SYMBOL ˙JSR ˙PC,PUTSYM ˙BR ˙ASF210 ; ; HANDLE A BAD PARAMETER ; ASF280: ˙TRAP+56. ˙ ˙;"BAD PARAMETER" ASF282: ˙CMPB ˙#',,@R1 ˙ ˙;LOG; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙HEAD00 ˙.GLOBL ˙CONTXX,RETXX,$DCX,$RCX,DODONX,OUTSLX ˙.GLOBL ˙HDRGX ˙.GLOBL ˙ELOC,ENDPRO,SYN3ER,BEG,LGT ˙.CSECT ;OVERLAY 0 HEADER BEG: ˙. ˙;BEGINNING OF OVERLAY LGT: ˙ELOC ˙;END OF OVERLAY ˙ENDPRO ˙;END PROCESSING ˙SYN3ER ˙;ERROR PROCF R0 CONTAIS THE MODE OF ; ˙THE IMPLICIT OR TYPE STATEMENT ; ˙REGISTERS CHANGED - ALL. ; SCANX: ˙TST ˙EXEC ˙ ˙;EXECUTABLES ALREADY STARTED? ˙BNE ˙SCANR ˙ ˙;YES ˙JMP ˙SCANNR ˙;NO GO BACK TO NON-EX END00: ˙TRAP+39. ˙ ˙;MISSING END STATEMENT ˙JSR ˙PC,END003 ˙;LINKAGE TO END HANDLER SCANNE: ˙JSR ˙PC,ALOCAT ˙;NO, GO ALLOCATE COMMON ˙MOV ˙#1,EXEC ˙ ˙;SET EXECUTABLE FLAG ˙MOV ˙LOW,SP ˙ ˙;SET EXECUTABLE STACK SCANR: ˙JSR ˙PC,SYN2ER ˙;PRINT ANY DIAGNOSTICS WHICH ˙ ˙ ˙ ˙;OCCURRED, THIS STATEMENT ""DDˆˆ""DDDDˆˆˆ""" """ˆˆ@DD@€€ˆˆˆDD """"""""DˆˆDDDDDˆˆˆADD€€B B Cy:ρ4d” ›y:Ё4d”›y:с4d”›y:ҁ4d”›y:Ӂ4d”›#)4d” 2›~€W4d”'›#*4d” 4›> ŸŔ4d”!a›#+4d”+ V›É2Î4d”6K›*`"4d”HX›^p:4d”Og›a x4d”Zf›˛2–,4d”\ „›#q@84d”eĽ›É2Ń4d”jn›#"4d”kw›ę'|Q4d”r š›ÎRŔ4d”{“›$D˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙în&"˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙8ŽIOK FOR NEXT , OR ) IF ANY ˙BEQ ˙ASF281 ˙CMPB ˙#'),@R1 ˙BEQ ˙ASF281 ˙JSR ˙PC,CNXC1 ˙BEQ ˙ASF281 ˙BR ˙ASF282 ;NOW FIX-UP NEW ENTRY ASF210: ˙MOV ˙CURSYM,R0 ˙;MAKE ENTRY INTO DUMMY ARG TYPE ˙BIC ˙#143000,DATYWD(R0) ˙;LEAVE TYPE ALONE ˙MOV ˙@SP,R2 ˙INC ˙R2 ˙ASL ˙R2 ˙MOVB ˙R2,DATYWD(R0) ˙;SET PAR NUMBER ˙MOV ˙SERIAL,SERWD(R0) ˙INC ˙SERIAL ˙ ˙;SYSTEM WIDE SERIAL NUMBER ˙BIS ˙#PARMKM,PARWD(R0) ˙;MARK AS PARAMETER ˙CLR ˙COMNWD(R0) ˙;NO COMMON JAZZ ˙CLR ˙ADBPWD(R0) ˙;NO ADB STUFF J ˙.GLOBL ˙SYN2ER ˙INC ˙SEQNO ˙ ˙;ADVANCE SEQUENCE NUMBER ˙JSR ˙PC,GETLN ˙;GET A LINE OF TEXT ˙BVS ˙END00 ˙ ˙;ASSUME END IF EOF OR EOM EXECU: ˙MOV ˙#LINE,R1 ˙;REMEMBER WHERE LINE STARTS ˙MOVB ˙#1,GETSW ˙;SET UP GET SWITCH ˙MOV ˙#EXTBL,R0 ˙;ADDRESS OF EXECUTABLE PROTOTYPES ˙JSR ˙PC,SCAN2A ˙;GO SEARCH FOR PROTOTYPE ˙BVS ˙SCAN10 ˙ ˙;JUMP IF NOT FOUND ˙JSR ˙PC,@EXJMP(R0) ˙;JUMP TO EXECUTABLES ˙BVC ˙SCAN22 SCAN10: ˙MOV ˙#LINE,R1 ˙;RESET POINTER ˙JSR ˙PC,ASGN ˙ ˙;GO DO ASSIGNMENT STATEMENT KESSING ˙CONTXX ˙;10 - CONTINUE ˙RETXX ˙;12 - RETURN ˙$DCX ˙;14 - DOUBLE CONVERSION ˙$RCX ˙;16 - REAL CONVERSION ˙DODONX ˙;20 - DO TERMINATION ˙OUTSLX ˙;22 - OUTPUT SERIAL ˙HDRGX ˙;24 - OUTPUT HEADER ˙.END L; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙CORET ˙.GLOBL ˙GENLAB,NXTCH,ROUTIN,OUTTAB,NAMSER ˙.GLOBL ˙SERATR,OUTSER,EOL,BITM,GL1,PUTNAM ˙.GLOBL ˙MISC,OUTGL,OUTNAM,PUTCHR,CONTXX ˙.GLOBL ˙RETXX ˙.CSECT R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙=M;PUT POINTER TO ENTRY ON STACK - KEEPING COUNT ON TOP ˙MOV ˙@SP,R2 ˙INC ˙R2 ˙MOV ˙R2,-(SP) ˙SUB ˙SYMBAS,R0 ˙MOV ˙R0,2(SP) ;LOOK FOR "," (MORE ARGS) OR ")" (END OF ARGS) ASF281: ˙CMPB ˙#',,@R1 ˙BEQ ˙ASF201 ˙CMPB ˙#'),@R1 ˙BNE ˙ASF291 ˙ ˙;ILLEGAL DELIMITER ; ;NOW HAVE ALL PARAMETERS ;CHECK FOR = ˙JSR ˙PC,CNXC1 ˙CMPB ˙#'=,@R1 ˙BNE ˙ASF292 ˙ ˙;=MISSING. ˙INC ˙R1 ; ;INVOKE EXPRESSION ANALYSIS AND CODE GENERATION ; ˙JSR ˙PC,SUBEXP ;VERIFY ENTIRE LINE IS PARSED ˙TSTB ˙@R1 ˙N SCAN16: ˙BVS ˙SCANX SCAN22: ˙TSTB ˙LINENO ˙ ˙;CHECK FOR LINE NUMBER ˙.GLOBL ˙LINENO ˙BEQ ˙SCANNE ˙ ˙;NO LINE NUMBER ˙JSR ˙PC,DODON ˙;GO HANDLE DO ENDINGS ˙BR ˙SCANNE ;OVERLAY TRANSFER VECTOR ˙.GLOBL ˙OVJMP OVJMP: ˙JMP ˙@EXJMP(R0) ˙;TRANSFER TO DESIRED ROUTINE ; ; TABLE OF EXECUTABLE PROTOTYPES - THIS IS A DUAL TABLE, THE FIRST ; ˙PART POINTS TO THE ASCII IN THE SECOND PART. EACH TABLE ; ˙MUST BE TERMINATED BY A ZERO. ; ˙.GLOBL ˙IFTAB EXTBL: ˙E6 ˙E8 ˙E12 IFTAB: ˙E1 ˙E2 ˙E3 P ˙%7 ; TAB ˙= ˙11 ; ; CONTINUE STATEMENT ; CONTXX: ˙JSR ˙PC,GENLAB ˙;GENERATE A LABEL IF ANY RCCOM: ˙JSR ˙PC,NXTCH ˙;MAKE SURE ˙TST ˙R2 ˙BEQ ˙CONT01 ˙ ˙;NO ADDITIONAL CHARACTERS ˙TRAP+29. ˙ ˙ ˙;ILLEGAL TERMINATION CONT01: ˙RTS ˙PC ; ; RETURN STATEMENT ; RETXX: ˙JSR ˙PC,GENLAB ˙;GENERATE THE LABEL ˙CMP ˙ROUTIN,#2 ˙;IS THIS A FUNCTION? ˙BNE ˙RET2 ˙ ˙;NO ˙JSR ˙PC,OUTTAB ˙MOV ˙NAMSER,R0 ˙;GET THE SERIAL NUMBER ˙JSR ˙PC,SERATR ˙;AND ITS ATTRIBUTES ˙MOV ˙R0,R3 ˙MOV ˙#'P,R0 ˙JSRQBEQ ˙ASF510 ˙ ˙;BR=>OKAY ˙TRAP+93. ˙ ˙;EXPRESSION ERROR IN ASF ; ;FORCE THE TYPE TO MATCH THE FUNCTION TYPE ; ASF510: ˙BIC ˙#070000,2(SP) ˙BIS ˙FNCTYP,2(SP) ; ;INVOKE CODE OUTPUT ˙MOV ˙R0,-(SP) ˙;SAVE FOR CLEAN-UP ˙JSR ˙PC,EXPGEN ; ;STACK CLEAN UP TIME ; ˙MOV ˙@SP,SP ˙TST ˙(SP)+ ;FINISH UP ˙.GLOBL ˙PUTNAM,PUTCHR ;CODE TO MOVE VALUE FROM STACK TO REGISTERS ˙MOV ˙#ASFT03,R4 ˙JSR ˙PC,PUTNAM ;SELECT AND OUTPUT DATA R ˙E9 ˙E10 ˙E11 ˙E13 ˙E14 ˙E15 ˙E16 ˙E17 ˙E18 ˙E19 ˙E20 ˙E21 ˙0 ; END OF PART 1 ; ; START OF PART 2 E6: ˙.ASCII ˙/END/ E8: ˙.ASCII ˙/FORMAT/ E12: ˙.ASCII ˙/DO/ E1: ˙.ASCII ˙/ASSIGN/ E2: ˙.ASCII ˙/CALL/ E3: ˙.ASCII ˙/CONTINUE/ E9: ˙.ASCII ˙/RETURN/ E10: ˙.ASCII ˙/GOTO/ E11: ˙.ASCII ˙/IF(/ E13: ˙.ASCII ˙/PAUSE/ E14: ˙.ASCII ˙/STOP/ E15: ˙.ASCII ˙/READ/ E16: ˙.ASCII ˙/PRINT/ E17: ˙.ASCII ˙/WRITE/ E18: ˙.ASCII ˙/REWIND/ E19: ˙.ASCII ˙/BACKSPACE/ E20: ˙.ASCII ˙/FIND/ S; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙DOFIN ˙.GLOBL ˙DODONX,DOTMP,PACK00,DOLST,DOEND,PUTNAM,PUTCHR ˙.GLOBL ˙BITM,MISC,OUTGL,EOL,OUTNAM,OUTCOM ˙.GLOBL ˙OUTSER,OUTST,OUTOCT,LINENO ˙.CSECT R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ; TT ˙PC,OUTSER ˙;OUTPUT THE PUSH ˙JSR ˙PC,EOL ˙ ˙;AND AN END OF LINE ˙MOV ˙#RETPOP,R4 ˙;AND THE ˙JSR ˙PC,PUTNAM ˙;SPECIAL POP ˙MOV ˙R2,R4 ˙ADD ˙#60,R4 ˙JSR ˙PC,PUTCHR ˙BITB ˙BITM(R2),GL1+6 ˙;CHECK FOR GLOBAL NEED ˙BNE ˙RET3 ˙;NOT NEEDED ˙BISB ˙BITM(R2),GL1+6 ˙;SET DONE FLAG ˙JSR ˙PC,OUTGL ˙;OUTPUT THE GLOBAL ˙JSR ˙PC,EOL RET3: ˙JSR ˙PC,OUTNAM ˙JSR ˙PC,EOL RET2: ˙MOV ˙#RET,R4 ˙ ˙;NOW GENERATE ˙JSR ˙PC,PUTNAM ˙BITB ˙BITM+2,MISC ˙;DID WE GENERATE A GLOBAL YET ˙BNE ˙RET1 ˙ ˙;YES UTYPE NUMBER ˙MOV ˙FNCTYP,R4 ˙ROR ˙R4 ˙ROR ˙R4 ˙ROR ˙R4 ˙ROR ˙R4 ˙SWAB ˙R4 ˙BIC ˙#177770,R4 ˙ADD ˙#60,R4 ˙JSR ˙PC,PUTCHR ˙.GLOBL ˙BITM,GL1,OUTGL,EOL,OUTNAM ˙SUB ˙#60,R4 ˙BITB ˙BITM(R4),GL1+6 ˙BNE ˙ASF60A ˙BISB ˙BITM(R4),GL1+6 ˙;SET THE GENERATED BIT ˙JSR ˙PC,OUTGL ˙;GENERATE A GLOBAL ˙JSR ˙PC,EOL ˙ ˙;AND AN END OF LINE ASF60A: ˙JSR ˙PC,OUTNAM ˙;GENERATE THE NAME ;CODE TO EXIT POLISH MODE AND RETURN ˙JSR ˙R5,OUTLN2 ˙;.+2 ˙ASFT04 ˙ ˙ ˙;RTS%5 ;;NOW FIX UP THE SYMBOL TABLE ;THE NAMES OF DUMMY ARGUMENTS ARE CLEARED ˙MOV ˙(SP)+,R0 ˙;NUMBER OF PARAMETERS ˙BEQ ˙ASF610 ˙ ˙;IN CASE OF ZERO ARGS ASF600: ˙MOV ˙(SP)+,R2 ˙;PARAMETER ˙ADD ˙SYMBAS,R2 ˙;MAKE AN ADDRESS ˙CLR ˙SYM1WD(R2) ˙;MAKE NULL NAME ˙CLR ˙SYM2WD(R2) ˙DEC ˙R0 ˙BNE ˙ASF600 ;NOW LABEL THE NEXT LOCATION FOR FORWARD JUMP ;OVER THE FUNCTION CODE ASF610: ˙MOV ˙(SP)+,R3 ˙MOV ˙#'F,R0 ˙JSR ˙PC,OUTSER ˙JSR ˙R5,OUTLN2 ˙ASFT05 ˙ ˙ ˙;":" ; ;WE ARE ALL DONE AN[˙CMP ˙R4,#DOEND ˙;FOR ˙BGE ˙FOUND ˙ ˙;LAST ˙TST ˙@R4 ˙ ˙;ENTRY ˙BEQ ˙FOUND ˙ ˙;IN DOLST ˙MOV ˙R4,R3 ˙ ˙;REMEMBER POSSIBLE LAST ENTRY ˙ADD ˙#16,R4 ˙ ˙;SKIP OVER AN ENTRY ˙BR ˙DOEND1 ˙ ˙;RE-LOOP FOUND: ˙CMP ˙(R3)+,@R0 ˙;DOES IT MATCH? ˙BNE ˙NODO ˙ ˙;NO - GO DO NEXT STATEMENT ˙CMP ˙(R3)+,2(R0) ˙BNE ˙NODO ˙MOV ˙#DOPRO,R4 ˙;YES, WONDERFUL ˙JSR ˙PC,PUTNAM ˙;GET THE PROTOTYPE ˙MOV ˙#400,R4 ˙ ˙;SEE IF ˙CMP ˙2(R3),R4 ˙;ANY ˙BLO ˙FND01 ˙ ˙;OF ˙CMP ˙6(R3),R4 ˙;VALUES ˙BLO ˙FND01 ˙ ˙;]D IT CAME OUT RIGHT. ; ˙CLRB ˙GETSW ˙ ˙;RESTORE TO PRE-ASF STATE ˙CLV ˙RTS ˙PC ;ERROR MESSAGES ; ASF299: ˙MOV ˙(SP)+,R0 ˙;ARGUMENT COUNT ˙BGT ˙ASF600 ˙ ˙;BR TO CLEAN UP SYMBOL TABLE ˙BR ˙ASF610 ˙ ˙;NO ARGUMENTS CURRENTLY ASF291: ˙TRAP+94. ˙ ˙;"MISSING, OR )" ˙BR ˙ASF299 ASF292: ˙TRAP+95. ˙ ˙;"MISSING = IN ASF" ˙BR ˙ASF299 ; ; ˙BUNCHES OF TEXT ; ASFT01: ˙.BYTE ˙TAB ˙.ASCII ˙'$TR,' ˙.BYTE ˙0 ASFT02: ˙.BYTE ˙':,TAB,^; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙OUTSL ˙.GLOBL ˙OUTSLX,CNXC,CHTEST,OUTCHR ; R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ; ; OUTPUT A STATEMENT LABEL TO OBJECT DEVICE ; ˙R1 POINTS TO INPUT TEXT ; ˙LENGTH CHECKS, ETC., ARE PERFORMED _ARE ˙CMP ˙10(R3),R4 ˙;FORMAL ˙BLO ˙FND01 ˙ ˙;SUBROUTINE PARAMETERS ˙MOVB ˙#'O,R4 ˙ ˙;THEY ARE NOT, SO GENERATE SIMPLE ˙JSR ˙PC,PUTCHR ˙; FORM ˙MOV ˙#3,R4 ˙BR ˙FND02 FND01: ˙MOVB ˙#'P,R4 ˙ ˙;GENERATE THE LONG FORM ˙JSR ˙PC,PUTCHR ˙;IF ANY PARAMETERS EXIST ˙MOV ˙#4,R4 FND02: ˙BITB ˙BITM(R4),MISC+1 ˙;DID GLOBAL ALREADY GET DONE? ˙BNE ˙FOUND1 ˙ ˙;YES ˙BISB ˙BITM(R4),MISC+1 ˙;NO ˙JSR ˙PC,OUTGL ˙JSR ˙PC,EOL FOUND1: ˙JSR ˙PC,OUTNAM ˙JSR ˙PC,OUTCOM ˙MOV ˙10(R3),R0 ˙;GET ADDRESS OF S`; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙HDRGEN ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. 01754 ;WRITTEN BY RON BRENDER, DAVE KNIGHT, LOU COHEN ˙.GLOBL ˙OTOA,CKOP,SCAN2A,HDRGX,GENLAB,OUTLN2 R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC a'J,'S,'R,TAB ˙.ASCII ˙'%4,$POLSH' ˙.BYTE ˙CR,LF,0 ASFT03: ˙.BYTE ˙TAB,'$,'P,'O,'P,'R,0 ASFT04: ˙.BYTE ˙CR,LF,TAB,'.,'+,'2,CR,LF ˙.BYTE ˙TAB,'R,'T,'S,TAB,'%,'5,CR,LF,0 ASFT05: ˙.BYTE ˙':,CR,LF,0 TAB=11 LF=12 CR=15 ˙.EVEN ˙.END b ; ˙V=0 => ALL OK ; ˙V=1 => NOT OK ; OUTSL: OUTSLX: ˙MOV ˙R2,-(SP) ˙;SAVE R2 OUTSL4: ˙JSR ˙PC,CNXC ˙ ˙;SKIP LEADING ZEROS ˙CMPB ˙#'0,@R1 ˙BNE ˙OUTSL5 ˙INC ˙R1 ˙BR ˙OUTSL4 OUTSL5: ˙MOV ˙#6,R0 OUTSL3: ˙JSR ˙PC,CNXC ˙ ˙;NEXT CHAR ˙JSR ˙PC,CHTEST ˙;CHECK TYPE ˙BPL ˙OUTSL1 ˙ ˙;NOT A DIGIT - EXIT ˙DEC ˙R0 ˙ ˙;COUNT THIS CHAR ˙BEQ ˙OUTSL2 ˙ ˙;0 => 6TH DIGIT ˙MOVB ˙(R1)+,R4 ˙;OUTPUT THE DIGIT ˙JSR ˙PC,OUTCHR ˙BR ˙OUTSL3 ;FOUND END OF STATEMENT NUMBER ; ˙FIRST CHECK THAT AT LEAST ONEcTEP ˙JSR ˙PC,VAL001 ˙;OUTPUT THE NAME ˙JSR ˙PC,OUTCOM ˙;FOLLOWED BY A COMMA ˙MOV ˙2(R3),R0 ˙;GET CONTROL ˙JSR ˙PC,VAL001 ˙; VARIABLE ˙JSR ˙PC,OUTCOM ˙; FOLLOWED BY A COMMA ˙MOV ˙6(R3),R0 ˙;GET TERMINAL ˙JSR ˙PC,VAL001 ˙; VARIABLE ˙JSR ˙PC,OUTCOM ˙; FOLLOWED BY A COMMA ˙MOV ˙R3,R5 ˙ ˙;SAVE POINTER ˙MOV ˙@R5,R3 ˙ ˙;GET LABEL ADDRESS ˙MOV ˙#'F,R0 ˙ ˙; AND KEY ˙JSR ˙PC,OUTSER ˙;OUTPUT THE LABEL ˙JSR ˙PC,EOL ˙ ˙; AND AN END-OF-LINE ˙CLR ˙-2(R5) ˙;CLEAR ˙CLR ˙-4(R5) ˙CLR ˙(R5)+ ˙d˙= ˙%7 SPACE=40 ; HDR1: ˙.ASCII ˙/ ˙.TITLE ˙/ ˙.BYTE ˙0 HDR2: ˙.ASCII ˙/ ˙.CSECT/ ˙.BYTE ˙15,12 HDR2L ˙= ˙.-HDR2 HDR3: ˙.ASCII ˙/ ˙.GLOBL ˙/ ˙.BYTE ˙0 HDR5: ˙.ASCII ˙/: ˙JSR ˙%4,$POLSH/ ˙.BYTE ˙15,12 ˙.ASCII ˙/ ˙.GLOBL ˙$POLSH,$NAM,$SEQ/ ˙.BYTE ˙15,12 ˙.ASCII ˙/ ˙$NAM,0,0,/ ˙.BYTE ˙0 ˙.EVEN ; ˙.GLOBL ˙HDRGEN,HDR,OUTLN2,SYM1WD,OUTST,EOL ˙.GLOBL ˙HEAD,HLGT,OUTLN,HDR2,HDR2L,BLKDAT ˙.GLOBL ˙OUTOCT,OUTCH2 ; ; HDRf DIGIT EXISTS ; OUTSL1: ˙CMP ˙#6,R0 ˙BEQ ˙OUTSL2 ˙ ˙;MISSING NUMBER ˙MOV ˙(SP)+,R2 ˙;RESTORE R2 ˙TSTB ˙@R1 ˙ ˙;SET UP ZERO TEST AFTER EXIT ˙CLV ˙RTS ˙PC ;ILLEGAL OR MISSING STATEMENT NUMBER ; OUTSL2: ˙TRAP+51. ˙MOV ˙(SP)+,R2 ˙;RESTORE R2 ˙SEV ˙RTS ˙PC ; ˙.END g ˙;THE ˙CLR ˙(R5)+ ˙ ˙;SEVEN ˙CLR ˙(R5)+ ˙ ˙;ENTRIES ˙CLR ˙(R5)+ ˙ ˙;IN THE ˙CLR ˙(R5)+ ˙ ˙;DO TABLE ˙BR ˙DODON ˙ ˙;AND LOOK FOR MORE DOPRO: ˙.ASCII ˙/ ˙$ENDD/ ˙.BYTE ˙0 ˙.EVEN VAL001: ˙MOV ˙R3,-(SP) ˙;SAVE R3 ˙CMP ˙R0,#400 ˙ ˙;IS THIS A FORMAL PARAMETER? ˙BLO ˙VAL002 ˙ ˙;YES ˙JSR ˙PC,OUTST ˙;NO, OUTPUT THE SYMBOL NAME ˙BR ˙VAL003 ˙ ˙;GO STORE IT VAL002: ˙MOV ˙R0,R3 ˙JSR ˙PC,OUTOCT ˙;GET THE PARAMTER NUMBER VAL003: ˙MOV ˙(SP)+,R3 ˙RTS ˙PC ˙.END hGEN - HEADER GENERATOR AND PROTOTYPES. UPON ENTRY ; ˙R0 POINTS TO HEADER NAME. ; ˙REGISTERS CHANGED - R1,R4,R5. ; HDRGX: ˙INC ˙HDR ˙ ˙;SET HEADER GENERATED FLAG ˙JSR ˙R5,OUTLN2 ˙;OUTPUT THE NAME ˙HDR1 ˙SUB ˙#SYM1WD,R0 ˙JSR ˙PC,OUTST ˙JSR ˙PC,EOL ˙MOV ˙#HEAD,R4 ˙MOV ˙#HLGT,R5 ˙JSR ˙PC,OUTLN ˙MOV ˙#HDR2,R4 ˙;OUTPUT THE ˙MOV ˙#HDR2L,R5 ˙;REMAINDER ˙JSR ˙PC,OUTLN ˙;OF HEADER ˙TST ˙BLKDAT ˙ ˙;BLOCK DATA? ˙BNE ˙HDRE1 ˙ ˙;YES, SKIP REST OF FORMALITIES!! ˙JSR ˙R5,OUTLN2 ˙HDR3 i; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙RDCI ˙.CSECT ˙.GLOBL ˙$DCX,$RCX ; ˙$DCI --- ASCII TO DOUBLE CONVERSION. ; ˙$RCI --- ASCII TO REAL CONVERSION. ; ˙CALLING SEQUENCE: ; ˙PUSH ADDRESS OF START OF FIELD ; ˙PUSH LENGTH OF FIELD ; ˙PUSH FORMAT SCALE D FROM W.D ; ˙PUSH P FORMAT l˙JSR ˙PC,OUTST ˙;NAME ˙JSR ˙PC,EOL ˙JSR ˙PC,OUTST ˙;NAME AGAIN ˙JSR ˙R5,OUTLN2 ˙HDR5 ˙ADD ˙#SYM1WD,R0 ˙MOV ˙(R0)+,R3 ˙;GET FIRST WORD OF NAME ˙JSR ˙PC,OUTOCT ˙;OUTPUT IT ˙JSR ˙R5,OUTCH2 ˙', ˙MOV ˙(R0)+,R3 ˙;OUTPUT ˙JSR ˙PC,OUTOCT ˙;SECOND WORD ˙JSR ˙PC,EOL HDRE1: ˙RTS ˙PC ˙.END ; ; GENERATE STATEMENT LABEL FOR EXECUTABLE STATEMENT ; GENLAB: ˙TST ˙INHLAB ˙ ˙;IS THE LABEL NEEDED OR DESIRED? ˙BNE ˙LABEZ ˙ ˙;NOT mSCALE ; ˙JSR ˙PC,$DCI ˙(OR $RCI) ˙R0=%0 ˙R1=%1 ˙R2=%2 ˙R3=%3 ˙R4=%4 ˙R5=%5 ˙SP=%6 ˙PC=%7 NUMEND=0 POINTL=2 DIGITS=4 BEXP=6 ESIGN=8. SIGN=10. EXP=12. P=30. D=32. ERF=26. LENGTH=34. TEMP=LENGTH RESULT=P START=36. END=START $RCX: ˙CLR ˙-(SP) ˙;CLEAR ERROR FLAG ˙INC ˙@SP ˙;SET REAL CONVERSION FLAG ˙BR ˙CONV $DCX: ˙CLR ˙-(SP) ˙;CLEAR ERROR FLAG AND SET FOR DOUBLE CONV: ˙MOV ˙R0,-(SP) ˙MOV ˙R1,-(SP) ˙MOV ˙R2,-(SP) ˙MOV ˙R3,-(SP) ˙MOV ˙R4,-(SP) ˙MOV ˙R5,-(SP) n; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙HEAD03 ˙.GLOBL ˙ELOC,EXECU,OVJMP,ASGNN,BEG,LGT ˙.GLOBL ˙ENDX1 ˙.CSECT ;OVERLAY 3 HEADER ;WARNING-HEAD03, HEAD04, HEAD05 MUST BE THE SAME LENGTH BEG: ˙. ˙;0 LGT: ˙ELOC ˙;2 ˙EXECU ˙;4 ˙OVJMP ˙;6 ˙ASGNN ˙;10 ˙ENDX1 ˙;12-END1 ˙.END o; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙EXTERN ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. 01754 ;WRITTEN BY RON BRENDER, DAVE KNIGHT, LOU COHEN ˙.CSECT R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4 R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 SPACE=40 ˙.GLOBL ˙GET,CURSYMpAT ALL ˙MOV ˙R3,-(SP) ˙MOV ˙R4,-(SP) ˙MOV ˙#LINENO,R4 ˙;GET ADDRESS OF LINE NUMBER ˙TSTB ˙@R4 ˙ ˙;IS THERE A LINE NUMBER ˙BEQ ˙LABEX ˙ ˙;NO ˙JSR ˙R5,OUTCH2 ˙;OUTPUT A . ˙'. ˙JSR ˙R5,OUTLN2 ˙;AND A LINE NUMBER ˙LINENO ˙MOV ˙#TERM,R4 ˙;GET TERMINATOR LABEY: ˙JSR ˙PC,OUTLN1 ˙;OUTPUT IT ˙MOV ˙SEQNO,R3 ˙JSR ˙PC,OUTOCT ˙JSR ˙PC,EOL ˙MOV ˙(SP)+,R4 ˙MOV ˙(SP)+,R3 LABEZ: ˙RTS ˙PC TERM: ˙.ASCII ˙/: ˙$SEQ,/ ˙.BYTE ˙0 ˙.EVEN LABEX: ˙MOV ˙#TERM+1,R4 ˙BR ˙LABEY ; ; HDRGEN - HEAq˙CLR ˙-(SP) ˙;CLEAR EXP ˙CLR ˙-(SP) ˙;CLEAR SIGN ˙CLR ˙-(SP) ˙;CLEAR ESIGN ˙MOV ˙#65.,-(SP) ˙;INITIALIZE BEXP ˙MOV ˙#18.,-(SP) ˙;INITIALIZE MAX DIGITS ˙CLR ˙-(SP) ˙;CLEAR POINTL ˙CLR ˙-(SP) ˙;CLEAR NUMEND ˙MOV ˙START(SP),R5 ˙;GET FIELD START ADDRESS ˙ADD ˙LENGTH(SP),END(SP) ˙;POINT TO END +1 ˙CLR ˙R0 ˙;CLEAR NUMERIC WORK SPACE ˙CLR ˙R1 ˙CLR ˙R2 ˙CLR ˙R3 SCAN: ˙MOVB ˙(R5)+,R4 ˙;GET NEXT INPUT CHARACTER ˙BIC ˙#177600,R4 ˙CMPB ˙R4,#' ˙;TEST FOR BLANK ˙BNE ˙SIGNS ˙;IF NOT BLANK s,ENTYWD,OUTLN2,OUTST ˙.GLOBL ˙EXTERN,EOL,NXTCH,ENTYMM EXTERN: ˙JSR ˙PC,GET ˙ ˙;GET THE SYMBOL NAME ˙BVS ˙EXTERR ˙ ˙;BAD NAME ˙TST ˙R3 ˙ ˙;IS IT LEGAL? ˙BMI ˙EXTERR ˙ ˙;NO ˙CMP ˙R3,#2 ˙ ˙;IS IT AN ARRAY ˙BEQ ˙EXTERR ˙ ˙;YES, ERROR ˙MOV ˙CURSYM,R0 ˙;NOW ˙BIC ˙#ENTYMM,ENTYWD(R0) ;SET ˙BIS ˙#100000,ENTYWD(R0) ; THE EXTERNAL BIT ˙JSR ˙R5,OUTLN2 ˙;GENERATE THE GLOBAL ˙HDR3 ˙JSR ˙PC,OUTST ˙;OUTPUT THE SYMBOL NAME ˙JSR ˙PC,EOL ˙JSR ˙PC,NXTCH ˙;GET A CHARACTER ˙.GLOBL ˙NXTCH ˙CMPB tDER GENERATOR AND PROTOTYPES. UPON ENTRY ; ˙R0 POINTS TO HEADER NAME. ; ˙REGISTERS CHANGED - R1,R4,R5. ; HDRGEN: ˙INC ˙HDR ˙ ˙;SET HEADER GENERATED FLAG ˙JSR ˙R5,OUTLN2 ˙;OUTPUT THE NAME ˙HDR1 ˙SUB ˙#SYM1WD,R0 ˙JSR ˙PC,OUTST ˙JSR ˙PC,EOL ˙MOV ˙#HEAD,R4 ˙MOV ˙#HLGT,R5 ˙JSR ˙PC,OUTLN ˙MOV ˙#HDR2,R4 ˙;OUTPUT THE ˙MOV ˙#HDR2L,R5 ˙;REMAINDER ˙JSR ˙PC,OUTLN ˙;OF HEADER ˙TST ˙BLKDAT ˙ ˙;BLOCK DATA? ˙BNE ˙HDRE1 ˙ ˙;YES, SKIP REST OF FORMALITIES!! ˙JSR ˙R5,OUTLN2 ˙HDR3 ˙JSR ˙PCu LOOK FOR + OR - ˙CMP ˙R5,START(SP) ˙;CHECK END OF FIELD ˙BLT ˙SCAN ˙;IF NOT DONE GO GET NEXT ˙JMP ˙ZERO ˙;ENTIRE FIELD IS BLANK SIGNS: ˙CMPB ˙R4,#'+ ˙;CHECK FOR + SIGN ˙BEQ ˙FIELD ˙;IF FOUND IGNORE IT ˙CMPB ˙R4,#'- ˙;CHECK FOR - SIGN ˙BNE ˙NUMCK ˙;IF NOT FOUND CHECK NUMERICS ˙INC ˙SIGN(SP) ˙;SET - SIGN FLAG ˙BR ˙FIELD NEXT: ˙MOVB ˙(R5)+,R4 ˙;GET NEXT INPUT CHARACTER ˙BIC ˙#177600,R4 ˙CMPB ˙R4,#' ˙;CHECK FOR BLANKS ˙BNE ˙NUMCK ˙MOV ˙#'0,R4 ˙;TREAT BLANK AS 0 NUMCK: ˙CMPB ˙R4,#'v; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ˙.TITLE ˙FORMAT ˙.GLOBL ˙OUTCH2,OUTLN2 ˙.GLOBL ˙FORMAT,CONINT,GENLAB,PUTNAM,BITM,MISC ˙.GLOBL ˙OUTGL,EOL,OUTNAM,OUTCOM,FLABL,OUTSER ˙.GLOBL ˙OUTCHR,LINENO,OUTLN1,OUTCOL,CHT1,DOTMP,NXTCH ˙.CSECT R0 ˙= ˙%0 R1 ˙= ˙%1 R2 ˙= ˙%2 R3 ˙= ˙%3 R4 ˙= ˙%4w˙R2,#', ˙ ˙;IS THERE MORE?? ˙BEQ ˙EXTERN ˙ ˙;YES ˙TST ˙R2 ˙ ˙;IS THIS END OF LINE?? ˙BEQ ˙EXTDON ˙ ˙;YES ˙TRAP+12. ˙ ˙;NO, END OF LINE ERROR EXTDON: ˙RTS ˙PC EXTERR: ˙TRAP+58. ˙RTS ˙PC ; HDR3: ˙.ASCII ˙/ ˙.GLOBL ˙/ ˙.BYTE ˙˙0 ˙.EVEN ; ˙.END x,OUTST ˙;NAME ˙JSR ˙PC,EOL ˙JSR ˙PC,OUTST ˙;NAME AGAIN ˙JSR ˙R5,OUTLN2 ˙HDR5 ˙ADD ˙#SYM1WD,R0 ˙MOV ˙(R0)+,R3 ˙;GET FIRST WORD OF NAME ˙JSR ˙PC,OUTOCT ˙;OUTPUT IT ˙JSR ˙R5,OUTCH2 ˙', ˙MOV ˙(R0)+,R3 ˙;OUTPUT ˙JSR ˙PC,OUTOCT ˙;SECOND WORD ˙JSR ˙PC,EOL HDRE1: ˙RTS ˙PC ; ; GENERATE STATEMENT LABEL FOR EXECUTABLE STATEMENT ; GENLAB: ˙TST ˙INHLAB ˙ ˙;IS THE LABEL NEEDED OR DESIRED? ˙BNE ˙LABEZ ˙ ˙;NOT AT ALL ˙MOV ˙R3,-(SP) ˙MOV ˙R4,-(SP) ˙MOV ˙#LINENO,R4 ˙;GET ADDRESS OF LINEy0 ˙;CHECK FOR LEGAL CHARACTER ˙BLT ˙PNTCK ˙;CHECK FOR DECIMAL POINT ˙BNE ˙NONZ ˙;JUMP IF NOT 0 ˙TST ˙R0 ˙;CHECK TO SEE IF ANY NON-ZERO DIGITS FOUND ˙BNE ˙NONZ ˙TST ˙R1 ˙BNE ˙NONZ ˙TST ˙R2 ˙BNE ˙NONZ ˙TST ˙R3 ˙BEQ ˙FIELD NONZ: ˙CMPB ˙R4,#'9 ˙BGT ˙EXPCK ˙;CHECK FOR EXPONENT ˙DEC ˙DIGITS(SP) ˙;COUNT AS A SIGNIFICANT DIGIT ˙BGE ˙A2I ˙;JUMP IF WE CAN USE THIS DIGIT ˙INC ˙EXP(SP) ˙;COMPENSATE FOR SKIPPED DIGIT ˙BR ˙FIELD A2I: ˙SUB ˙#60,R4 ˙;CONVERT ASCII TO INTEGER ˙JSR ˙PC,MULz R5 ˙= ˙%5 SP ˙= ˙%6 PC ˙= ˙%7 ; TAB ˙= ˙11 ; ;FORMAT HANDLER - DOESN'T DO MUCH YET ; FORMAT: ˙JSR ˙PC,GENLAB ˙;GENERATE A LABEL ˙MOV ˙#FMT001,R4 ˙;OUTPUT ˙JSR ˙PC,PUTNAM ˙;SAVE THE $TR ˙BITB ˙BITM+4,MISC ˙;SEE IF GLOBAL ALREADY EXISTS ˙BNE ˙FORM09 ˙ ˙;IT DOES ˙BISB ˙BITM+4,MISC ˙;SET IT EXISTING ˙JSR ˙PC,OUTGL ˙;OUTPUT THE GLOBAL ˙JSR ˙PC,EOL ˙;AND END OF LINE FORM09: ˙JSR ˙PC,OUTNAM ˙;NOW OUTPUT THE NAME ˙JSR ˙PC,OUTCOM ˙MOV ˙FLABL,R3 ˙;GET NEEDED LABEL ˙MOV ˙#'F,R0 ˙ ˙;AND| NUMBER ˙TSTB ˙@R4 ˙ ˙;IS THERE A LINE NUMBER ˙BEQ ˙LABEX ˙ ˙;NO ˙JSR ˙R5,OUTCH2 ˙;OUTPUT A . ˙'. ˙JSR ˙R5,OUTLN2 ˙;AND A LINE NUMBER ˙LINENO ˙MOV ˙#TERM,R4 ˙;GET TERMINATOR LABEY: ˙JSR ˙PC,OUTLN1 ˙;OUTPUT IT ˙MOV ˙SEQNO,R3 ˙JSR ˙PC,OUTOCT ˙JSR ˙PC,EOL ˙MOV ˙(SP)+,R4 ˙MOV ˙(SP)+,R3 LABEZ: ˙RTS ˙PC TERM: ˙.ASCII ˙/: ˙$SEQ,/ ˙.BYTE ˙0 ˙.EVEN LABEX: ˙MOV ˙#TERM+1,R4 ˙BR ˙LABEY ; ; HDRGEN - HEADER GENERATOR AND PROTOTYPES. UPON ENTRY ; ˙R0 POINTS TO HEADER NAME. ; ˙REGIS}5 ˙;MULTIPLY BY 5 ˙JSR ˙PC,LEFT ˙;DOUBLE RESULT FOR 10 ˙ADD ˙R4,R3 ˙;ADD IN CURRENT DIGIT ˙ADC ˙R2 ˙ADC ˙R1 ˙ADC ˙R0 ˙;END OF CONVERT FOR THIS DIGIT FIELD: ˙CMP ˙R5,END(SP) ˙;CHECK FOR END OF FIELD ˙BLT ˙NEXT ˙MOV ˙R5,@SP ˙;POINTER TO LAST NUMERIC TO NUMEND SCALE: ˙TST ˙R0 ˙BNE ˙SCALE1 ˙;JUMP IF NUMBER NOT 0 ˙TST ˙R1 ˙BNE ˙SCALE1 ˙TST ˙R2 ˙BNE ˙SCALE1 ˙TST ˙R3 ˙BEQ ˙ZERO ˙;INPUT NUMBER IS 0 SCALE1: ˙CMP ˙@SP,R5 ˙;CHECK NUMEND ˙BNE ˙NOP ˙;JUMP IF THERE WAS AN EXPONENT FIELD~ ˙JSR ˙PC,OUTSER ˙;OUTPUT IT ˙JSR ˙PC,EOL ˙ ˙;GENERATE END OF LINE ˙JSR ˙R5,OUTCH2 ˙;NOW PUT OUT ˙'$ ˙JSR ˙R5,OUTLN2 ˙;THE FORMAT ˙LINENO ˙JSR ˙PC,OUTCOL ˙; LABEL HERE ˙MOV ˙#FMT004,R4 ˙JSR ˙PC,FORM08 ˙JSR ˙PC,FORM06 ˙;OUTPUT THE WHOLE STRING ˙BVC ˙FORM02 ˙ ˙;SKIP, IF NO ERROR ˙JSR ˙PC,EOL ˙TRAP+59. ˙ ˙;MISMATCHED PARENTHESES FORM02: ˙JSR ˙R5,OUTLN2 ˙;NOW END THE STRING ˙FMT005 ˙MOV ˙FLABL,R3 ˙;GET THE ˙INC ˙FLABL ˙ ˙;LABEL ˙MOV ˙#'F,R0 ˙JSR ˙PC,OUTSER ˙;AND OUTPUT ; ; PDP-11 FORTRAN COMPILER VERSION 001A ; ; ˙COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION ; ; ˙WRITTEN BY D. KNIGHT ; ; ˙NOTE: ˙THE USER SHOULD ASSUME THAT THESE ; ˙ ˙SOURCES WILL CHANGE DRASTICALLY ; ˙ ˙FOR THE NEXT RELEASE. ; ; ;DEFINE FILE PROCESSOR ;FORMAT: ˙DEFINEFILE A(M,L,U,V) ;GENERATES: ˙.GLOBL $DEFIL ; ˙ ˙$DEFIL,#A,#M,#L,#V ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .CSECT ˙.TITLE ˙DEF004 .GLOBL ˙DEFINE,CNXC1,OUTLN,GET .GLOBL ˙OUTCOM,OUTST,ZLEQLS€TERS CHANGED - R1,R4,R5. ; HDRGEN: ˙INC ˙HDR ˙ ˙;SET HEADER GENERATED FLAG ˙JSR ˙R5,OUTLN2 ˙;OUTPUT THE NAME ˙HDR1 ˙SUB ˙#SYM1WD,R0 ˙JSR ˙PC,OUTST ˙JSR ˙PC,EOL ˙MOV ˙#HEAD,R4 ˙MOV ˙#HLGT,R5 ˙JSR ˙PC,OUTLN ˙MOV ˙#HDR2,R4 ˙;OUTPUT THE ˙MOV ˙#HDR2L,R5 ˙;REMAINDER ˙JSR ˙PC,OUTLN ˙;OF HEADER ˙TST ˙BLKDAT ˙ ˙;BLOCK DATA? ˙BNE ˙HDRE1 ˙ ˙;YES, SKIP REST OF FORMALITIES!! ˙JSR ˙R5,OUTLN2 ˙HDR3 ˙JSR ˙PC,OUTST ˙;NAME ˙JSR ˙PC,EOL ˙JSR ˙PC,OUTST ˙;NAME AGAIN ˙JSR ˙R5,OUTLN2 ˙H ˙SUB ˙P(SP),EXP(SP) ˙;USE THE FORMAT P SCALE NOP: ˙TST ˙POINTL(SP) ˙BNE ˙POINT ˙;JUMP IF THERE WAS A DECIMAL POINT ˙MOV ˙D(SP),@SP ˙;USE THE D SCALE POINT: ˙SUB ˙POINTL(SP),@SP ˙SUB ˙@SP,EXP(SP) ˙;FORM COMPLETE DECIMAL EXPONENT ˙BGT ˙MUL ˙;MULTIPLY BY 10**EXP ˙BLT ˙DIV ˙;JUMP IF DECIMAL EXPONENT IS NEG ˙JMP ˙FLOAT ˙;JUMP IF EXP IS 0 MUL: ˙CMP ˙R0,#31462 ˙BHI ˙MDIV ˙;JUMP IF FRACT TOO BIG TO MULT BY 5 ˙JSR ˙PC,MUL5 ˙;FRACT=5*FRACT ˙INC ˙BEXP(SP) ˙;TIMES 2 DEC10: ˙DEC ˙EXP(SP) ˙;OVE‚IT ˙JSR ˙PC,OUTCOL ˙;OUTPUT A COLON ˙JSR ˙PC,EOL ˙RTS ˙PC ˙ ˙;AND RETURN FMTERR: ˙DEC ˙R1 ˙ ˙;BACK UP POINTER ˙CMP ˙SP,R0 ˙ ˙;IS THIS A NORMAL RETURN? ˙BNE ˙FORM07 ˙ ˙;NO, MISMATCHED PARENS ˙RTS ˙PC ˙ ˙;YES,RETURN TO CALLER FORM07: ˙MOV ˙R0,SP ˙ ˙;UN-FUDGE THE STACK ˙SEV ˙ ˙ ˙;SET ERROR ˙RTS ˙PC ˙ ˙;AND RETURN FORM06: ˙MOV ˙SP,R0 ˙ ˙;REMEMBER CALLING POSITION ˙BR ˙FORM03 FORM01: ˙JSR ˙PC,@PC ˙ ˙;CALL FORM03 FORM03: ˙MOVB ˙(R1)+,R2 ˙;GET A CHARACTER ˙BEQ ˙FMTERR ˙ ˙;BAD FORMAT IF Eƒ,CURSYM,VALUE .GLOBL ˙SCAN2A,EOL,GENLAB DEFINE: ˙JSR ˙PC,ZLEQLS ˙;IS THERE A 0-LEVEL = IN THIS LINE ˙BCS ˙DEF50 ˙˙ ˙;IF YES EXIT UNSUCCESSFUL ˙JSR ˙PC,GENLAB ˙MOV ˙#DEF90,R4 ˙;ELSE GENERATE GLOBL ˙MOV ˙#DEF93-DEF90,R5 ˙JSR ˙PC,OUTLN ˙MOV ˙#DEF91,R4 ˙MOV ˙#DEF92-DEF91,R5 ˙JSR ˙PC,OUTLN ˙JSR ˙PC,GET ˙ ˙;GET THE A FIELD ˙BVC ˙DEF01 ˙ ˙;IF GET FOUND ERROR, RETURN DIAG. DEF011: ˙TRAP ˙+86. ˙ ;ILLEGAL SYNTAX IN DEFINEFILE STATEMENT ˙CLV ˙RTS ˙PC DEF01: ˙TST ˙R3 ˙ ˙;IS A A CONSTANT?„DR5 ˙ADD ˙#SYM1WD,R0 ˙MOV ˙(R0)+,R3 ˙;GET FIRST WORD OF NAME ˙JSR ˙PC,OUTOCT ˙;OUTPUT IT ˙JSR ˙R5,OUTCH2 ˙', ˙MOV ˙(R0)+,R3 ˙;OUTPUT ˙JSR ˙PC,OUTOCT ˙;SECOND WORD ˙JSR ˙PC,EOL HDRE1: ˙RTS ˙PC …R 10 ˙BGT ˙MUL ˙;JUMP IF MORE DECIMAL EXPONENT ˙JMP ˙FLOAT ˙;DECIMAL EXPONENT GONE MDIV: ˙JSR ˙PC,MUL54 ˙;MULTIPLY BY 5/4 ˙ADD ˙#3,BEXP(SP) ˙;TIMES 8 ˙BR ˙DEC10 ˙;GO DIVIDE BY 10 PNTCK: ˙CMPB ˙R4,#'. ˙BNE ˙ERROR ˙;JUMP IF NOT A DECIMAL POINT POINTF: ˙TST ˙POINTL(SP) ˙BNE ˙ERROR ˙;JUMP IF A . ALREADY ENCOUNTERED ˙MOV ˙R5,POINTL(SP) ˙;SAVE A POINTER TO THE . +1 ˙BR ˙FIELD ˙;GO FOR NEXT CHARACTER ERROR: ˙COMB ˙ERF+1(SP) ˙;FLAG ERROR ZERO: ˙CLR ˙R0 ˙;RESULT IS 0 ˙CLR ˙R1 ˙CLR ˙R2 ˙C†ND OF LINE ˙CMPB ˙R2,#' ˙ ˙;IS IT A SPACE? ˙BEQ ˙FORM03 ˙;YES, JUNK IT ˙JSR ˙PC,CHT1 ˙ ˙;IS IT NUMERIC? ˙BPL ˙FORM10 ˙ ˙;NO, IGNORE IT ˙DEC ˙R1 ˙ ˙;BACK UP CHARACTER POINTER ˙MOV ˙#DOTMP,R4 ˙;SET UP BIT BUCKET FOR NUMBER ˙MOV ˙R5,-(SP) ˙;SAVE R5 ˙JSR ˙PC,CONINT ˙;CONVERT TO INTEGER ˙BVS ˙NOPE ˙MOV ˙(SP)+,R5 ˙;RESTORE R5 ˙CLRB ˙(R4)+ ˙ ˙;ADD TERMINATOR ˙SUB ˙#DOTMP+1,R4 ˙;GET CHARACTER COUNT ˙SUB ˙R4,R5 ˙ ˙;DECREMENT COUNT ˙JSR ˙PC,TSTIT ˙JSR ˙R5,OUTLN2 ˙;OUTPUT THEM ˙DOTMP‡ ˙BMI ˙DEF02 ˙ ˙;BR IF YES ˙CMP ˙R2,#2 ˙;IS VARIABLE TYPE = INTEGER ? ˙BNE ˙DEF011 DEF012: ˙JSR ˙PC,DEF60 ˙;WRITE A FIELD SYMBOL + COMMA ˙CMPB ˙(R1),#'( ˙;R1 SHOULD BE AT A "(" ˙BNE ˙DEF011 ˙ ˙;BR IF NOT ˙JSR ˙PC,CNXC1 ˙;ELSE STEP OVER THE LEFT PAREN ˙JSR ˙PC,GET ˙ ˙;GET M FIELD ˙BVS ˙DEF011 ˙CMP ˙R2,#2 ˙;IS VARIABLE TYPE = INTEGER ? ˙BNE ˙DEF011 ˙JSR ˙PC,DEF60 ˙;WRITE M FIELD SYMBOL + COMMA ˙CMPB ˙(R1),#', ˙;NEXT INPUT CH SHOULD BE COMMA ˙BNE ˙DEF011 ˙JSR ˙˙PC,CNXC1 ˙;ELSE GE‰LR ˙R3 ˙JMP ˙STORE ˙;GO PUSH RESULT AND RETURN EXPCK: ˙CMPB ˙R4,#'E ˙BEQ ˙EXPT ˙;JUMP IF E ˙CMPB ˙R4,#'D ˙BNE ˙ERROR ˙;IF NOT E OR D THEN ERROR EXPT: ˙MOV ˙R5,@SP ˙;SAVE POINTER TO END OF NUM +1 ˙DEC ˙@SP ˙;DECREMENT NUMEND ˙MOV ˙R3,TEMP(SP) ˙CLR ˙R3 ˙CMP ˙R5,END(SP) ˙BGE ˙ERROR ˙;JUMP IF NO ROOM FOR EXP ˙MOVB ˙(R5)+,R4 ˙BIC ˙#177600,R4 ˙CMPB ˙R4,#'+ ˙;CHECK FOR +EXP ˙BEQ ˙EFLD1 ˙CMPB ˙R4,#'- ˙;CHECK FOR -EXP ˙BNE ˙ENUM ˙;GO CHECK FOR NUMERIC ˙INC ˙ESIGN(SP) ˙;FLAG EXPONEŠ ˙JSR ˙PC,NXTCH ˙;GET NEXT CHARACTER ˙CMPB ˙R2,#'H ˙ ˙;IS IT HOLLERITH? ˙BNE ˙FORM11 ˙ ˙;NO ˙MOV ˙R2,R4 ˙ ˙;OUTPUT THE H ˙JSR ˙PC,OUTCHR ˙DEC ˙R5 ˙JSR ˙PC,TSTIT ˙TST ˙R3 ˙BEQ ˙BADSTR ˙CMP ˙R3,#255. ˙;IS IT TOO LONG? ˙BGT ˙BADSTR ˙ ˙;YES FORM12: ˙MOVB ˙(R1)+,R4 ˙;GET A CHARACTER ˙BEQ ˙BADLGT ˙ ˙;GAD LENGTH ˙JSR ˙PC,OUTCHR ˙;OUTPUT IT ˙DEC ˙R5 ˙JSR ˙PC,TSTIT ˙DEC ˙R3 ˙ ˙;DONE? ˙BGT ˙FORM12 ˙ ˙;NO ˙BR ˙FORM03 ˙ ˙;YES FORM10: ˙CMPB ˙#'',R2 ˙ ˙;IS THIS A STRING? ˙BNE ˙FO‹T L FIELD ˙JSR ˙PC,GET ˙BVS ˙DEF011 ˙CMP ˙R2,#2 ˙;IS VARIABLE TYPE = INTEGER ? ˙BNE ˙DEF011 ˙JSR ˙PC,DEF60 ˙;IF ALL OK, WRITE L FIELD + COMMA ˙MOV ˙#DEF950,R0 ˙;CHECK FOR ",V," ˙JSR ˙PC,SCAN2A ˙BVS ˙DEF011 ˙ ˙;IF NO MATCH, GIVE A DIAGNOSTIC ˙JSR ˙PC,GET ˙ ˙;ELSE GET THE V FIELD ˙BVS ˙DEF011 ˙CMP ˙R2,#2 ˙;IS VARIABLE TYPE = INTEGER ? ˙BNE ˙DEF011 ˙JSR ˙PC,DEF60 ˙;OUTPUT THE V FIELD ˙JSR ˙PC,EOL ˙CMPB ˙(R1),#') ˙;NEXT SHOULD BE A RT. PAREN ˙BNE ˙DEF011 ˙ ˙;IF NOT, ISSUE DIAGNNT NEGATIVE EFLD1: ˙CMP ˙R5,END(SP) ˙BGE ˙ERROR EFLD2: ˙MOVB ˙(R5)+,R4 ˙;GET NEXT CHAR ˙BIC ˙#177600,R4 ENUM: ˙CMPB ˙R4,#' ˙;CHECK FOR BLANK ˙BNE ˙ENUM1 ˙MOV ˙#'0,R4 ˙;TREAT BLANK AS 0 ENUM1: ˙CMPB ˙R4,#'0 ˙BLT ˙ERROR ˙CMPB ˙R4,#'9 ˙BGT ˙ERROR ˙;NOT A VALID CHAR ˙SUB ˙#60,R4 ˙;CONVERT ASCII TO INTEGER ˙ASL ˙R3 ˙;X=10*X+D ˙ADD ˙R3,R4 ˙ASL ˙R3 ˙ASL ˙R3 ˙ADD ˙R4,R3 ˙;END OF ABOVE COMMENT ˙CMP ˙R5,END(SP) ˙BLT ˙EFLD2 ˙;JUMP IF MORE FIELD TO GO ˙TST ˙ESIGN(SP) ˙;CHECK EXPONŽRM11 ˙ ˙;NO ˙MOV ˙R2,R4 FORM13: ˙JSR ˙PC,OUTCHR ˙;OUTPUT A CHARACTER ˙DEC ˙R5 ˙JSR ˙PC,TSTIT ˙MOVB ˙(R1)+,R4 ˙;GET NEXT CHARACTER ˙BEQ ˙BADLG1 ˙ ˙;ERROR IF NO CLOSING ' ˙CMPB ˙#'',R4 ˙ ˙;IS IT A STRING END? ˙BNE ˙FORM13 ˙ ˙;NO ˙JSR ˙PC,OUTCHR ˙;YES,OUTPUT IT ˙DEC ˙R5 ˙JSR ˙PC,TSTIT ˙BR ˙FORM03 ˙;AND RETURN NOPE: ˙MOV ˙(SP)+,R5 ˙CLRB ˙(R4)+ ˙SUB ˙#DOTMP+1,R4 ˙SUB ˙R4,R5 ˙JSR ˙PC,TSTIT ˙JSR ˙R5,OUTLN2 ˙DOTMP ˙BR ˙FORM03 BADSTR: ˙TRAP+75. ˙ ˙;BAD COUNT ˙BR ˙FORM03 BAOSTIC ˙CLV ˙ ˙ ˙;IF IT IS, EXIT ˙RTS ˙PC ;UNSUCCESSFUL EXIT TRY ASSIGNMENT STATEMENT DEF50: ˙SEV ˙RTS ˙PC ; ;DEF60 WRITES NAME OF CURRENT SYMBOL, PLUS A COMMA ; DEF60: ˙JSR ˙PC,OUTCOM ˙MOV ˙CURSYM,R0 ˙JSR ˙PC,OUTST ˙RTS ˙PC DEF02: ˙MOV ˙CURSYM,R0 ˙;CHECK THAT THE A FIELD CONSTANT ˙CMP ˙R2,#2 ˙ ˙;IS POSITIVE-DEFINATE ˙BNE ˙DEF011 ˙ ˙;BR IF IT IS NOT AN INTEGER ˙TST ˙VALUE(R0) ˙;ELSE IS IT POS-DEF? ˙BLE ˙DEF011 ˙ ˙;IF NEG OR 0, ERROR ˙BR ˙DEF012 ˙ ˙;ELSE GO BACK, OK ;ASCII ‘ENT SIGN ˙BEQ ˙ENUM2 ˙;JUMP IF IT IS + ˙NEG ˙R3 ˙;MAKE USER EXPONENT - ENUM2: ˙ADD ˙R3,EXP(SP) ˙;GET COMPLETE DECIMAL EXPONENT ˙MOV ˙TEMP(SP),R3 ˙JMP ˙SCALE ˙;GO SCALE THE NUMERIC PART DIV: ˙TST ˙R0 ˙BLT ˙DIV1 ˙;JUMP IF FRACT LEFT JUSTIFIED DIV2: ˙DEC ˙BEXP(SP) ˙;LEFT JUSTIFY NUMERIC BITS ˙JSR ˙PC,LEFT ˙BPL ˙DIV2 DIV1: ˙MOV ˙#16.,R4 ˙;SET FOR SIXTEEN ITERATIONS ˙JSR ˙PC,RIGHT ˙MOV ˙R3,-(SP) ˙MOV ˙R2,-(SP) ˙MOV ˙R1,-(SP) ˙;INITIALIZE QUOTIENT ˙MOV ˙R0,-(SP) DIV3: ˙JSR ˙PC,RIGHT’DLG1: ˙JSR ˙PC,EOL ˙ ˙;END OF LINE TOO BADLGT: ˙TRAP+76. ˙ ˙;WEIRD COUN( ˙BR ˙FORM07 FORM11: ˙MOV ˙R2,R4 ˙JSR ˙PC,OUTCHR ˙;OUTPUT THE CHARACTER ˙CLR ˙R3 ˙ ˙;SET COUNT TO 0 ˙MOV ˙#CLIST,R4 ˙;GET ADDRESS OF IMPORTANT CHARACTERS ˙CMPB ˙R2,(R4)+ ˙;IS IT A D? ˙BEQ ˙FORM04 ˙ ˙;OH GOODIE, IT IS ˙CMPB ˙R2,(R4)+ ˙;IS IT AN E? ˙BEQ ˙FORM04 ˙ ˙; GO-O-O TEAM ˙CMPB ˙R2,(R4)+ ˙;HOW ABOUT AN F? ˙BEQ ˙FORM04 ˙ ˙;YEAH MAN, REALLY COOL ˙CMPB ˙R2,(R4)+ ˙;GIMME A G! ˙BEQ ˙FORM04 ˙ ˙;YEA TEAM ˙INC“FOR ".GLOBL $DEFIL" AND "$DEFIL" DEF90: ˙.ASCII ˙/ ˙.GLOBL/ DEF91: ˙.ASCII ˙/ ˙$DEFIL/ DEF92: ˙.BYTE ˙015,012 DEF93=. ;ASCII FOR THE STRING ",V," DEF95: ˙.ASCII ˙/,U,/ DEF96=. ˙.EVEN DEF950: ˙DEF95 ˙DEF96 ˙0 ˙.END • ˙CLC ˙JSR ˙PC,RIGHT ˙MOV ˙#2,R5 ˙CLC DIV4: ˙JSR ˙PC,RIGHT ˙ADD ˙6(SP),R3 ˙ADC ˙R2 ˙ADC ˙R1 ˙ADC ˙R0 ˙ADD ˙4(SP),R2 ˙ADC ˙R1 ˙ADC ˙R0 ˙ADD ˙2(SP),R1 ˙ADC ˙R0 ˙ADD ˙@SP,R0 ˙DEC ˙R5 ˙;COUNT TWICE ˙BGT ˙DIV4 ˙DEC ˙R4 ˙BGT ˙DIV3 ˙ADD ˙#8.,SP ˙;POP DIVIDEND ˙SUB ˙#3,BEXP(SP) ˙INC ˙EXP(SP) ˙;BUMP DECIMAL EXPONENT ˙BLT ˙DIV ˙;JUMP IF MORE TO DO FLOAT: ˙DEC ˙BEXP(SP) ˙;POST NORMALIZE THE RESULT ˙JSR ˙PC,LEFT ˙BCC ˙FLOAT ˙ADD ˙#200,BEXP(SP) ˙;SET EXCESS 128 ˙BL– ˙R3 ˙ ˙;TRY NEXT POSSIBILITY ˙CMPB ˙R2,(R4)+ ˙;WE NEED AN I ˙BEQ ˙FORM04 ˙ ˙;GOT IT! ˙CMPB ˙R2,(R4)+ ˙;OR AN O TO CALL IT INTEGER(SVILLE) ˙BEQ ˙FORM04 ˙ ˙;YEP, TWAS AN O ˙INC ˙R3 ˙ ˙;NOW WE TRY FOR LOGICAL ˙CMPB ˙R2,(R4)+ ˙;IT MUST BE AN L OR ELSE IT IS IGNORED ˙BNE ˙FORM15 ˙ ˙;TAIN'T LOGICAL, SO IGNORE IT FORM04: ˙BISB ˙BITM+2(R3),MISC+4 ;SET FLAG FOR PROPER MODE FORM15: ˙DEC ˙R5 ˙JSR ˙PC,TSTIT ˙CMPB ˙#'(,R2 ˙ ˙;IS IT AN OPEN PAREN? ˙BEQ ˙FORM01 ˙ ˙;YES, CALL THE FORMAT HANDLER ˙™E ˙UNDER ˙;NUMBER TOO SMALL TO REPRESENT ˙CMP ˙BEXP(SP),#377 ˙BGT ˙OVER ˙;JUMP IF NUMBER TOO BIG ˙CLRB ˙R3 ˙BISB ˙R2,R3 ˙SWAB ˙R3 ˙CLRB ˙R2 ˙BISB ˙R1,R2 ˙SWAB ˙R2 ˙CLRB ˙R1 ˙BISB ˙R0,R1 ˙;MOVE OUT LOWEST ORDER BITS ˙SWAB ˙R1 ˙CLRB ˙R0 ˙BISB ˙BEXP(SP),R0 ˙;INSERT THE BINARY EXPONENT ˙SWAB ˙R0 ˙;PUT IN THE RIGHT ORDER ˙ROR ˙SIGN(SP) ˙;TEST THE ARITHMETIC SIGN ˙JSR ˙PC,RIGHT ˙;INSERT IN RESULT ˙ADC ˙R3 ˙ADC ˙R2 ˙ADC ˙R1 ˙;FINAL ROUND ˙ADC ˙R0 ˙BVS ˙OVER ˙;JUMP IF OVEšCMPB ˙#'),R2 ˙ ˙;IS IT AN CLOSED PAREN? ˙BNE ˙FORM03 ˙ ˙;NO, OUTPUT THE CHARACTER ˙RTS ˙PC TSTIT: ˙TST ˙R5 ˙BPL ˙FORM14 ˙MOV ˙#FMT003,R4 ˙;OUTPUT FORM08: ˙JSR ˙PC,OUTLN1 ˙;NEXT ˙MOV ˙#40.,R5 ˙ ˙;HEADER AND RESET COUNTER FORM14: ˙RTS ˙PC ˙ ˙;NOW RETURN FMT001: ˙.ASCII ˙/ ˙$TR/ ˙.BYTE ˙0 FMT003: ˙.BYTE ˙'^ ˙.BYTE ˙15,12 FMT004: ˙.ASCII ˙/ ˙.ASCII ˙^/ ˙.BYTE ˙0 FMT005: ˙.ASCII ˙/^/ ˙.BYTE ˙15,12 ˙.ASCII ˙/ ˙.EVEN/ ˙.BYTE ˙15,12,0 CLIST: ˙.BYTE ˙'D,'E,'F,'G,'I,'O,'L ˙.EVEN ˙.RFLOW ˙BCS ˙OVER STORE: ˙TSTB ˙ERF(SP) ˙;TEST REAL/DOUBLE FLAG ˙BEQ ˙DPREC ˙;JUMP IF DOUBLE ˙ROL ˙R2 ˙;ROUND TO REAL PRECISION ˙ADC ˙R1 ˙ADC ˙R0 ˙BVS ˙OVER ˙BCS ˙OVER ˙;JUMP IF OVERFLOW ON ROUND ˙MOV ˙R0,R2 ˙;MOVE HIGH ORDER RESULT UP ˙MOV ˙R1,R3 DPREC: ˙MOV ˙R0,RESULT(SP) ˙;STORE RESULT ON STACK ˙MOV ˙R1,RESULT+2(SP) ˙MOV ˙R2,RESULT+4(SP) ˙MOV ˙R3,RESULT+6(SP) ˙ADD ˙#14.,SP ˙;CLEAR STACK OF JUNK ˙MOV ˙(SP)+,R5 ˙MOV ˙(SP)+,R4 ˙MOV ˙(SP)+,R3 ˙MOV ˙(SP)+,R2 ˙MOV ˙(SP)+,END ĄR1 ˙MOV ˙(SP)+,R0 ˙TSTB ˙@SP ˙;TEST REAL/DOUBLE FLAG ˙BEQ ˙RETRN ˙;JUMP IF DOUBLE ˙MOV ˙(SP)+,2(SP) ˙;PUSH FLAG UP ˙MOV ˙(SP)+,2(SP) ˙;PUSH RETURN UP RETRN: ˙ROL ˙(SP)+ ˙;FLUSH FLAG AND SET C BIT IF ERROR ˙RTS ˙PC ; OVER: UNDER: ˙JMP ˙˙ERROR ; MUL54: ˙CMP ˙R0,#146314 ˙BLO ˙MUL54A ˙;JUMP IF ROOM FOR 5/4 * FRACT ˙CLC ˙JSR ˙PC,RIGHT ˙;DIVIDE BY 2 ˙INC ˙BEXP+0+2(SP) ˙;MULTIPLY BY 2 MUL54A: ˙MOV ˙R0,-(SP) ˙MOV ˙R1,-(SP) ˙MOV ˙R2,-(SP) ˙MOV ˙R3,-(SP) ˙CLC ˙JSR ˙PC,RIGHT ˙;HAĽLF ˙CLC ˙JSR ˙PC,RIGHT ˙;QUARTER ˙BR ˙MUL5A ˙;GO GET F+F/4 MUL5: ˙MOV ˙R0,-(SP) ˙;MULT BY 5 ˙MOV ˙R1,-(SP) ˙MOV ˙R2,-(SP) ˙MOV ˙R3,-(SP) ˙JSR ˙PC,LEFT ˙;DOUBLE ˙JSR ˙PC,LEFT ˙;QUADRUPLE MUL5A: ˙ADD ˙(SP)+,R3 ˙ADC ˙R2 ˙ADC ˙R1 ˙˙ADC ˙R0 ˙ADD ˙(SP)+,R2 ˙ADC ˙R1 ˙ADC ˙R0 ˙ADD ˙(SP)+,R1 ˙ADC ˙R0 ˙ADD ˙(SP)+,R0 ˙RTS ˙PC ˙;CODES MAY BE TESTED ON RETURN LEFT: ˙ASL ˙R3 ˙ROL ˙R2 ˙ROL ˙R1 ˙ROL ˙R0 ˙RTS ˙PC RIGHT: ˙ROR ˙R0 ˙ROR ˙R1 ˙ROR ˙R2 ˙ROR ˙R3 ˙RTS ˙PC ˙.END