RECURSEG.MAC .LIST TTM .TITLE RECURSEG RECURSIVE SEGMENT ALLOCATION .NLIST BEX,SYM,TOC .PSECT $$AUTP ; TO ASSURE ALLOCATION IMMEDIATELY ; AFTER $$AUTO ; ; ; AT SEGMENT READ TIME ( CALL SUBR ) THE OLD SEGMENT ID ; IS SAVED AND THE NEW SEGMENT ID IS STACKED. ; THE TRANSFER TO THE SUBROUTINE IS CHANGED FROM RETURN ; IN $SAVRG TO A CALL. THIS ASSURES THAT RETURN GIVES CONTROL ; TO THIS SEGMENT HANDLING ROUTINE. THE CURRENT SEGMENT ID ; CAN BE POPPEDOFF THE STACK AND THE OLD SEGMENT IS BROUGHT ; INTO CORE. ; ; A BRANCH INSTRUCTION MUST BE PATCHED INTO THE $AUTO ROUTINE. ; $AUTO+34 := BR SEGENT ; ; ; SEGENT: MOV @R5,ENTRYP MOV #SEGEXIT,12(SP) SUB #2,SEGP ; POINTER IN SEGMENT ID STACK CMP SEGP,#SEGP BEQ 99$ MOV R2,@SEGP ;POINTER TO SEGMENT DESCR TABLE JMP $AUTO+40 ; READ SEGMENTS. WHEN READY CONTROL ; ; IS TRANSFERRED TO SEGEXIT 99$: CALLSS WRERROR .BYTE 70.,1 ; ; SEGEXIT: CALL @ENTRYP ; CALL THE WANTED ROUTINE. ; ; PASCAL NEVER USES TH@ R6 STACK, SO THE EXTRA RETURN ADDRESS ; DOESN'T DO ANY HARM. ; JSR R5,$SAVRG MOV R2,-(SP) ; NORMAL SEGMENT READ START ADD #2,SEGP ; SKIP THE SEGMENT JUST USED MOV @SEGP,R2 ; READ IN THE OLD SEGMENTS BEQ 9$ ; NO OLD SEG BIT #10000,@R2 ; SEGMENT ALREADY THERE ? BEQ 9$ ; YES JMP $AUTO+40 ; 9$: MOV (SP)+,R2 RTS PC ; .PSECT $SEGST ; ENTRYP: .WORD 0 SEGP: .WORD SEGSTND SEGSTK: .BLKW 100 SEGSTND:.WORD 0 ; ; .END **** P11WTT.MAC .LIST TTM .TITLE P11WTT .NLIST BEX,SYM,TOC ; BUFF: .BLKB 132. EOLN: .WORD FALSE EOF: .WORD FALSE IORES: .WORD 1 ;OK FILETP: .WORD TEXT+TTY TT: .WORD BUFF ; TTY^ CNT: .WORD 132. ; ; WTTINT:: MOV #TT,-(SS) ; WRITE( TTY, N:5 ) MOV 4(SS),-(SS) MOV #5,-(SS) CALLSS WRI ADD #4,SS RTS PC ; ; ; WTTERR:: MOV #TT,-(SS) ; WRITE( TTY, MOV #ERRMESS,-(SS) ; 'ERROR IN LINE ', MOV #14.,-(SS) MOV @SS,-(SS) CALLSS WRS MOV 4(SS),-(SS) ; N:6' MOV #6,-(SS) CALLSS WRI MOV #':,-(SS) ; ':' ) ; MOV #1,-(SS) CALLSS WRCHA ADD #4,SS RTS PC ; ; ; WTTEOL:: MOV #TT,-(SS) ; WRITELN( TTY ) ; CALLSS PUTLN ADD #2,SS RTS PC ; ; ; WTTHEA:: MOV #TT,-(SS) ; WRITELN( TTY, MOV #HEAD,-(SS) ; 'PASCAL V4 APR-77' ) ; MOV #18.,-(SS) MOV @SS,-(SS) CALLSS WRS CALLSS PUTLN ADD #2,SS CALLSS TIME CALLSS DATE RTS PC ; ; ; PROCEDURE WTTSTAT( E:BOOLEAN; P,D,DD,T: INTEGER ) ; ; WTTSTAT:: MOV #TT,-(SS) ; WRITELN( TTY, TST 12.(SS) BEQ 1$ MOV #"**,ERRM2 1$: MOV #ERRM2,-(SS) ; '** ERROR DETECTED' ) ; MOV #17.,-(SS) MOV @SS,-(SS) CALLSS WRS CALLSS PUTLN MOV #TT,-(SS) ; WRITELN( TTY, MOV #STAT1,-(SS) ; 'TOTAL PROGRAM SIZE: ', MOV #28.,-(SS) MOV @SS,-(SS) CALLSS WRS MOV 10.(SS),-(SS) ; P:7:O ) ; MOV #7,-(SS) CALLSS WROCT CALLSS PUTLN MOV #TT,-(SS) ; WRITELN( TTY, MOV #STAT2,-(SS) ; 'OUTERMOST DATA SIZE: ', MOV #28.,-(SS) MOV @SS,-(SS) CALLSS WRS MOV 6.(SS),-(SS) ; DD:7:O ) ; MOV #7,-(SS) CALLSS WROCT CALLSS PUTLN MOV #TT,-(SS) ; WRITELN( TTY, MOV #STAT3,-(SS) ; 'RESERVED STACK & HEAP SIZE: ', MOV #28.,-(SS) MOV @SS,-(SS) CALLSS WRS MOV 8.(SS),-(SS) ; D:7:O ) ; MOV #7,-(SS) CALLSS WROCT CALLSS PUTLN MOV #TT,-(SS) ; WRITELN( TTY, MOV #RUNTM,-(SS) ; 'RUNTIME: ', MOV #9.,-(SS) MOV @SS,-(SS) CALLSS WRS MOV 4(SS),-(SS) ; T:8, MOV #8.,-(SS) CALLSS WRI MOV #SEC,-(SS) ; ' SECONDS' ) ; MOV #9.,-(SS) MOV @SS,-(SS) CALLSS WRS CALLSS PUTLN ADD #12.,SS RTS PC ; ERRMESS: .ASCII /ERROR IN LINE / HEAD: .ASCII /PASCAL V4 APR-77/ .EVEN ERRM2: .ASCII /NO ERROR DETECTED/ STAT1: .ASCII /TOTAL PROGRAM SIZE: / STAT2: .ASCII /OUTERMOST DATA SIZE: / STAT3: .ASCII /RESERVED STACK & HEAP SIZE: / RUNTM: .ASCII /RUNTIME: / SEC: .ASCII / SECONDS/ .EVEN ; ; .END **** P11ERRMES.MAC .TITLE ERRMES ; .MCALL QIO$S,WTSE$S,EXIT$S ; ERRMES::DEC 2(R5) BGT 1$ MOV #M1,R1 MOV #L1,R0 BR 2$ 1$: MOV #M2,R1 MOV #L2,R0 2$: QIO$S #IO.WVB,#5,#5,,,, WTSE$S #5 EXIT$S ; M1: .ASCII /FILE SPECIFICATIONERROR/ L1=.-M1 M2: .ASCII /FILE NOT FOUND/ L2=.-M2 .EVEN ; .END **** P11INITC.MAC .TITLE P11INITC ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< .SBTTL INITIALIZATION ; .MCALL FINIT$,GTSK$S ; ;>>>>>>>>>> ;>>>>>>>>>> THIS IS S SPECIAL VERSION FOR THE COMPILER <<<<<<<<<<<<<<<<<<<<<<<<<<<< ;>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<< ;>>>>>>>>>> SPECIAL STACK AND HEAP INITIALIZATION <<<<<<<<<<<<<<<<<<<<<< ;>>>>>>>>>> SPECIAL RETURN <<<<<<<<<<<<<<<<<<<<<<<< ;>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<< ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; ROUTINE INITA FINIT$ MOV #$HEAP$,SS GTSK$S SS MOV G.TSTS(SS),SS ; PARTITION SIZE NOP ; ASL SS NOP ; ASL SS NOP ; ASL SS NOP ; ASL SS NOP ; ASL SS NOP ; ASL SS SUB #2,SS ; POINTER TO LAST WORD IN PARTITION NOP NOP FILAREA=FILESIZECORR+TEXTBUFFSIZE+4 MOV SS,AD ; CLEAR HEAP AND STACK MOV AD,AR SUB #$HEAP$,AR ASR AR ; NO OF WORDS TO CLEAR 1$: CLR -(AD) DEC AR BGT 1$ MOV MP,AD ; RESERV SPACE FOR STANDARD FILES TST (AD)+ BEQ 2$ SUB #FILAREA,SS ; INPUT 2$: TST (AD)+ BEQ 3$ SUB #FILARE,SS ; OUTPUT 3$: TST (AD)+ FILAREA=FILAREA-FDBSIZE BEQ 4$ SUB #FILAREA,SS ; TTYIN 4$: TST (AD)+ BEQ 5$ SUB #FILAREA,SS ; TTYOUT 5$: MOV #MAXFILES+2,AR ; LUNTAB 6$: CLR -(SS) DEC AR BGT 6$ DEC @SS ; TTYIN NOT AVAILABLE DEC 10.(SS) ; TTYOUT NOT AVAILABLE MOV #$HEAP$,-(SS) ; DAPADDR := START ADDR OF STACK MOV @SS,-(SS) ; MARKADDR := START ADDR OF STACK CMP -(SS),-(SS) ; TTY IO STATUS BLOCK (TTYSB) TST -(SS) ; RESERV SPACE FOR MOV SS,@SS ; STATIC LINK MOV SS,GP ; ; OPEN STANDARD FILES ; MOV #-2,-(HP) ; COUNTER NEW: ADD #2,@HP ; INDEX TO FNAM & OPEN-ROUTINE MOV @HP,R MOV (MP)+,-(SS) ; FILE POINTER BEQ NOFILE ADD GP,@SS MOV #-1,-(SS) ; FILE TYPE = TEXT MOV FNAM(R),-(SS) ; ADDR TO FNAM STRING MOV #6,-(SS) ; LEN OF FNAM STRING CLR -(SS) ; DIR STRING CLR -(SS) CLR -(SS) ; DEV STRING CLR -(SS) CLR -(SS) ; IOSPEC JSR MP,@FSTOPN(R) BR NEXT ; NOFILE: TST (SS)+ ; REMOVE ZERO NEXT: CMP @HP,#6 BNE NEW ; MORE FILEPOINTERS LEFT TST (HP)+ ; REMOVE COUNTER ;>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MOV MP,2(HP) ; RETURN FROM $$AUTP <<<<<<<<<<<<<<<<<<<<<< MOV GP,MP ; INIT MP <<<<<<<<<<<<<<<<<<<<<<< RTS PC ; <<<<<<<<<<<<<<<<<<<<<<<<<< ;>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; FSTOPN: .WORD $REWRITE,$RESET,OPNTTY,OPNTTY FNAM: .WORD NMO,NMI,NMO,NMI NMI: .ASCII /INPUT / NMO: .ASCII /OUTPUT/ .EVEN ; ; OPNTTY: ADD #16.,SS ; SKIP FILE SPEC MOV (SS)+,R ; FILE POINTER CLR EOFSTATUS(R) ; FALSE MOV #1,IORESULT(R) ; OK MOV R,@R SUB #FILESICORR+TEXTBUFFSIZE-FDBSIZE,@R CLR 2(R) ; NO CHAR'S CMP @HP,#4 ; WHICH FILE BNE TTYOUT MOV R,LUNTAB(GP) ; TTYIN MOV #TRUE,EOLNSTATUS(R) MOV #TTY+TEXT+INPUT,FILTYP(R) RETURN ; TTYOUT: MOV R,LUNTAB+10.(GP) ; TTYOUT = LUN 5 CLR EOLNSTATUS(R) MOV #TTY+TEXT,FILTYP(R) ; ; WRITE(TTY,'*'); BREAK; READLN(TTY); ; RETURN .END **** P11HEAP.MAC .TITLE $HEAP$ ; ; HEAP EMBRYO FOR THE COMPILER ; $HEAP$:: .BLKW 4000. ; .END **** P11ASM.CMD P11CMREAL,P11CMREAL/-SP=P11DEF,P11CMREAL P11WRREAL,P11WRREAL/-SP=P11DEF,P11WRREAL P11RDR,P11RDR/-SP=P11DEF,P11RDR P11RDI,P11RDI/-SP=P11DEF,P11RDI P11RDHLP,P11RDHLP/-SP=P11DEF,P11RDHLP P11REAL,P11REAL/-SP=P11DEF,P11REAL P11WRI,P11WRI/-SP=P11DEF,P11WRI P11MARKP,P11MARKP/-SP=P11DEF,P11MARKP P11PBOOL,P11PBOOL/-SP=P11DEF,P11PBOOL P11REDSET,P11REDSET/-SP=P11DEF,P11REDSET P11EXPSET,P11EXPSET/-SP=P11DEF,P11EXPSET P11UNI4,P11UNI4/-SP=P11DEF,P11UNI4 P11INT4,P11INT4/-SP=P11DEF,P11INT4 P11DIF4,P11DIF4/-SP=P11DEF,P11DIF4 P11INITS,P11INITS/-SP=P11DEF,P11INITS P11SGSIN,P11SGSIN/-SP=P11DEF,P11SGSIN P11INN,P11INN/-SP=P11DEF,P11INN P11MPI,P11MPI/-SP=P11DEF,P11MPI P11DVI,P11DVI/-SP=P11DEF,P11DVI P11LEQ,P11LEQ/-SP=P11DEF,P11LEQ P11LES,P11LES/-SP=P11DEF,P11LES P11GEQ,P11GEQ/-SP=P11DEF,P11GEQ P11GRT,P11GRT/-SP=P11DEF,P11GRT P11NEQ,P11NEQ/-SP=P11DEF,P11NEQ P11EQU,P11EQU/-SP=P11DEF,P11EQU P11LEQS1,P11LEQS1/-SP=P11DEF,P11LEQS1 P11LEQS4,P11LEQS4/-SP=P11DEF,P11LEQS4 P11GEQS1,P11GEQS1/-SP=P11DEF,P11GEQS1 P11GEQS4,P11GEQS4/-SP=P11DEF,P11GEQS4 P11NEQS4,P11NEQS4/-SP=P11DEF,P11NEQS4 P11EQUS4,P11EQUS4/-SP=P11DEF,P11EQUS4 P11EQUM,P11EQUM/-SP=P11DEF,P11EQUM P11EQUM2,P11EQUM2/-SP=P11DEF,P11EQUM2 P11NEQM,P11NEQM/-SP=P11DEF,P11NEQM P11NEQM2,P11NEQM2/-SP=P11DEF,P11NEQM2 P11LEQM,P11LEQM/-SP=P11DEF,P11LEQM P11LEQM2,P11LEQM2/-SP=P11DEF,P11LEQM2 P11LESM,P11LESM/-SP=P11DEF,P11LESM P11LESM2,P11LESM2/-SP=P11DEF,P11LESM2 P11GEQM,P11GEQM/-SP=P11DEF,P11GEQM P11GEQM2,P11GEQM2/-SP=P11DEF,P11GEQM2 P11GRTM,P11GRTM/-SP=P11DEF,P11GRTM P11GRTM2,P11GRTM2/-SP=P11DEF,P11GRTM2 P11TWPOW,P11TWPOW/-SP=P11DEF,P11TWPOW P11SPLTRL,P11SPLTRL/-SP=P11DEF,P11SPLTRL P11REXP,P11REXP/-SP=P11DEF,P11REXP P11RLOG,P11RLOG/-SP=P11DEF,P11RLOG P11RSQRT,P11RSQRT/-SP=P11DEF,P11RSQRT P11SINCOS,P11SINCOS/-SP=P11DEF,P11SINCOS P11RUNCHK,P11RUNCHK/-SP=P11DEF,P11RUNCHK P11INIT,P11INIT/-SP=P11DEF,P11INIT P11RESET,P11RESET/-SP=P11DEF,P11RESET P11WROCT,P11WROCT/-SP=P11DEF,P11WROCT P11GETPUT,P11GETPUT/-SP=P11DEF,P11GETPUT P11GCML,P11GCML/-SP=P11DEF,P11GCML P11MOVM,P11MOVM/-SP=P11DEF,P11MOVM P11EXIT,P11EXIT/-SP=P11DEF,P11EXIT P11WRERR,P11WRERR/-SP=P11DEF,P11WRERR P11DATETM,P11DATETM/-SP=P11DEF,P11DATETM P11FSR,P11FSR/-SP=P11DEF,P11FSR P11WRBOOL,P11WRBOOL/-SP=P11DEF,P11WRBOOL P11DUMP,P11DUMP/-SP=P11DEF,P11DUMP P11ABSPAS,P11ABSPAS/-SP=P11DEF,P11ABSPAS P11RANDOM,P11RANDOM/-SP=P11DEF,P11RANDOM P11FORTR,P11FORTR/-SP=P11DEF,P11FORTR P11EISDVI,P11EISDVI/-SP=P11DEF,P11EISDVI P11EISMPI,P11EISMPI/-SP=P11DEF,P11EISMPI P11FIS,P11FIS/-SP=P11DEF,P11FIS P11FPP,P11FPP/-SP=P11DEF,P11FPP **** PASBLD.CMD PAS/CP,PAS/-SP=PASBLD/MP TASK=...PAS ASG=SY0:1:2:3:4 ASG=TI0:5 ASG=SY0:6 EXTTSK=4500 GBLPAT=ROOT:$AUTO+10:403 ; BR READSEGM GBLPAT=ROOT:$AUTO+34:437 ; BR SEGENT // **** PASBLD.ODL ; OVERLAY DESCRIPTION FOR PASCAL COMPILER .NAME ROOT .NAME INI1 .NAME INI2 .NAME COMPIL .NAME BLCK .NAME DECL .NAME BODYDF .NAME MODENT .NAME STMNT1 .NAME STMNT2 .NAME EXPR .NAME CALLN .NAME CALLS .NAME CALLS1 .NAME CALLS2 ; .ROOT ROOT-R-ERR-*(INI1-I1,INI2-I2,COMPIL-C),HEAP ; R: .FCTR PAS/LB:.MAIN.:NEWPAG:P11WTT:RECURS:INSYMB ERR: .FCTR [1,1]SYSLIB/LB:WRERRO HEAP: .FCTR PAS/LB:$HEAP$ ; I1: .FCTR PAS/LB:INITTA I2: .FCTR PAS/LB:INIT2:OPTION:OPENFI:ENTERS:PROGRA-INEX C: .FCTR BLCK-BL-*(DECL-D,BODYDF-BD-(NEW,STM1,STM2,EXP,CNS,CS)) CS: .FCTR CST-*(CS1,CS2) ; BL: .FCTR PAS/LB:BLOCK:SKIP INEX: .FCTR PAS/LB:P11INI:NXTCHR:ERRMES-[1,1]SYSLIB/LB:P11EXI ; D: .FCTR D1-D2 D1: .FCTR PAS/LB:SIMPLE:LABELD:CONSTD:TYPEDE D2: .FCTR PAS/LB:VARDEC:PROCED:PSERRO:EXTERN ; BD: .FCTR PAS/LB:BODY:STATEM:EXPRES:CALL:WRITOB:MULTIP:PUTOBJ ; NEW: .FCTR MODENT-PAS/LB:NEWMOD:STARTO STM1: .FCTR STMNT1-PAS/LB:CASEST:WITHST STM2: .FCTR STMNT2-ST1-ST2 ST1: .FCTR PAS/LB:ASSIGN:GOTOST:COMPOU:IFSTAT ST2: .FCTR PAS/LB:REPEAT:WHILES:FORSTA:LOOPST EXP: .FCTR EXPR-PAS/LB:LOADST CNS: .FCTR CALLN-PAS/LB:CALLNS:BASE CST: .FCTR CALLS-PAS/LB:VARIAB:GETFIL:CALLST CS1: .FCTR CALLS1-PAS/LB:GETPUT:READRE:WRITEW:PACK:UNPACK CS2: .FCTR CALLS2-CS21-CS22-CS23 CS21: .FCTR PAS/LB:NEW1:ABS:SQR:TRUNC:ARITHM:ROUND CS22: .FCTR PAS/LB:ODD:ORD:CHR:PREDSU:EOFEOL:BREAKL:FORMFE CS23: .FCTR PAS/LB:DATETI:HALT:RUNTIM:MARKRE:SPLITR:SSIZE:TWOPOW ; .END **** PASGEN.CMD .ASK A ARE THE FILES TRANSFERRED .IFF A .GOTO 900 SET /UIC=[1,24] .IFINS ...LBR .GOTO 10 INS [1,54]LBR .10:.ASK SLB DOYOU WANT TO UPDATE SYSLIB WITH PASCAL SUBROUTINES .IFF SLB .GOTO 100 LBR [1,1]SYSLIB/IN=PASLIB .ASK A DOES YOUR TARGET MACHINE HAVE EIS .IFT A LBR [1,1]SYSLIB/RP=PASEIS .ASK A DOES YOUR TARGET MACHINE HAVE FIS .IFT A LBR [1,1]SYSLIB/RP=PASFIS .ASK A DOES YOUR TARGET MACHINE HAVE FPP .IFT A LBR [1,1]SYSLIB/RP=PASFPP .100:.ASK A DO YOU WANT TO BUILD A PDP11-RESIDENT COMPILER .IFF A .GOTO 900 LBR PAS/CR:450.=P11PAS,P11FIL,P11TTY .ASK A ARE YOU USING RSX11M V3 .IFF A .GOTO 200 ; YOU HAVE TO EDIT FILE PASBLD.CMD AS FOLLOWS: ; >EDI PASBLD.CMD ; [PAGE 1] ; *SC/437/435/ ; *ED ; EDI PASBLD.CMD .200:TKB @PASBLD ; [1,54]PAS.TSK CREATED .900:; READY ****