.DSABL GBL .MCALL .PRINT,.SETTOP,.GVAL ; ; CMDLNE = 0 - NO COMMAND LINE FETCH ; CMDLNE = 1 - COMMAND LINE FETCH ; .GLOBL V.AREA,V.SUSR,V.EUSR,V.LOW,V.HGH .GLOBL H.HGH,H.CUR,H.END .GLOBL V.MFLG,V.HUSR,V.NUSR .GLOBL P.GTLN,P.FPIN,P.HGET .GLOBL PR.INI,PH.SIZ .GLOBL PS.TRT ; INIT - INITIALIZE HEAP AND USERS CONSOLE ; PARMS ; REGISTER USAGE ; R0 -> HEAP, SCRATCH ; R1 - SCRATCH ; R2 - SCRATCH ; R3 -> (OUT,IN) FILE BLOCKS ; R4 - SCRATCH ; R5 - SCRATCH ; ; ;RT-11 SYSTEM COMMUNICATION AREA ADDRESSES ; SRTJOB= 40 ;START ADDRESS OF JOB STKINT= 42 ;INITIAL VALUE OF STACK POINTER JSW= 44 ;JOB STATUS WORD USRLAD= 46 ;USR LOAD ADDRESS ERRBYT= 52 ;EMT ERROR CODE USERRB= 53 ;USER PROGRAM ERROR CODE MONADR= 54 ;BEGINNING OF RESIDENT MONITOR CHNAL= 510 ;CHAIN ARG LENGTH CHNARG= 512 ;CHAIN ARG ; USRLC= 266 ;USR LOAD POINT USRSIZ= 374 ;SIZE OF USR CONFIG= 300 ;CONFIGURATION WORD ; .PSECT .IF NE CMDLNE $$$000:: .IFF $$$001:: .ENDC ; JSR PC,P.FPIN ;INITIALISE FLOATING POINT MOV (SP),PS.TRT ;POP RETURN ADDRESS INTO R4 MOV @#STKINT,SP ;RESET STACK POINTER ;SET UP STACK AND FIND A PLACE TO SWAP USR MOV #-2,R0 MOVB R0,V.MFLG ;ASSUME NOSWAP TST PH.SIZ ;CHECK HEAP UTILISATION BNE 10$ MOV V.HGH,R0 ADD #82.,R0 ;JUST ENOUGH TO LIVE WITH 10$: .SETTOP MOV R0,R3 ;SAVE FOR LATER USE .GVAL #V.AREA,#CONFIG BIT #1000,R0 BNE 30$ ;USR IS SET NOSWAP MOV V.LOW,R2 ;SEE IF WE CAN SWAP IN LOW MEMORY MOV R2,-(SP) .GVAL #V.AREA,#USRSIZ ADD R0,R2 CMP R2,#V.SUSR BLOS 20$ MOV #V.EUSR,R2 ;SEE IF WE CAN SWAP IN HIGH MEMORY MOV R2,(SP) ADD R0,R2 TST (R3)+ ;POINT A WORD HIGHER FOR EASIER COMPARISON CMP R2,R3 BLOS 20$ JMP MEMERR ;NO PLACE ANYWHERE TO SWAP USR 20$: MOV (SP)+,@#USRLAD ;REMEMBER WHERE WE'RE SWAPPING IT MOV R2,V.HUSR .GVAL #V.AREA,#USRLC ;FIND WHERE USR NORMALLY IS TST -(R0) MOV R0,V.NUSR ;REMEMBER IT .SETTOP MOV R0,R3 CLRB V.MFLG ;MORE MEMORY AVAILABLE 30$: MOV R3,H.HGH MOV V.HGH,H.END CLR H.CUR ;NO PREVIOUS HEAP ; CLR -(SP) BIT #400,@#JSW ;SEE IF CHAINED TO BEQ 40$ ; MOV @#CHNAL,(SP) CMP (SP),#1 BLOS 40$ ;NOTHING THERE CMPB #177,@#CHNARG ;SEE IF FORCED TO GET INPUT BEQ 40$ ;YES, GO GET IT JSR PC,P.HGET ;PUT IT ON THE HEAP MOV (SP)+,R3 MOV #CHNARG,R1 ;SET UP ARGS BR 50$ ; 40$: BIC #400,@#JSW ;CLEAR CHAIN BIT .IF NE CMDLNE MOV #81.,(SP) .IFF MOV #2.,(SP) .IFTF JSR PC,P.HGET ;SET UP SPACE ON THE HEAP .IFT MOV #ASTPRM,-(SP) MOV 2(SP),-(SP) JSR PC,P.GTLN .IFTF MOV (SP),R3 MOV (SP)+,R1 .IFF CLRB (R1) .ENDC ;FIRST STRING WILL POINT TO CHAIN ARG AREA TO FACILITATE THE SETTING UP ;OF CHAIN ARGS. NOTE THAT THIS IS DIFFERENT TO RSX-11 USAGE SINCE THERE ;IS NO TASK NAME (RT-11 IS ESSENTIALLY A SINGLE USER SYSTEM) 50$: MOV #CHNARG,-(SP) ;DUMMY TO CHAIN ARG AREA FOR ARGV[0] MOV #1,R2 ;COUNT NULL STRING MOV R2,R0 ;MAKE IT NON ZERO IN CASE OF COMMA MOV #-1,R4 ;FLAG PARENTHESES NEST LEVEL -1 60$: MOV R3,R5 ;MARK BEGINNING OF STRING 70$: CMPB #'(,(R1) ;LEFT PARENTHESES BEQ 90$ CMPB #'),(R1) ;RIGHT PARENTHESES BEQ 100$ TSTB (R1) ;NULL - END OF STRING BEQ 110$ TST R4 ;PARENTHESES NEST LEVEL BPL 80$ CMPB #' ,(R1) ;SPACE - ARGUMENT SEPARATOR BEQ 110$ CMPB #',,(R1) ;COMMA - ARGUMENT SEPARATOR BEQ 110$ 80$: MOVB (R1)+,(R3)+ ;SQUISH TOGETHER IF NECESSARY BR 70$ 90$: INC R4 ;BUMP NEST LEVEL BNE 80$ INC R1 ;IGNORE IF NEST LEVEL -1 BR 70$ 100$: TST R4 ;DON'T WORRY IF AT LEVEL -1 BLT 80$ DEC R4 BPL 80$ INC R1 ;IGNORE IF AT LEVEL -1 BR 70$ 110$: MOVB (R1),R0 ;SAVE DELIMITER CMP R3,R5 BEQ 120$ ;NOTHING SUBSTANTIAL ENTERED CLRB (R3)+ ;INDICATE END OF STRING MOV R5,-(SP) ;PUSH POINTER INC R2 ;COUNT THIS STRING 120$: INC R1 ;BUMP POINTER TSTB R0 BNE 60$ ;NOT EOLN BIC #1,R3 ;OPTIMISE END OF HEAP MOV R3,H.END MOV SP,R3 ;POINT TO BOTTOM OF STACK MOV R2,R1 ASL R1 ADD R3,R1 ;POINT TO TOP OF ARGS MOV R2,R0 ;SET UP COUNT ASR R0 BEQ 140$ ;TOO FEW TO WORRY ABOUT 130$: MOV (R3),R5 ;REVERSE STRING POINTERS MOV -(R1),(R3)+ MOV R5,(R1) SOB R0,130$ 140$: MOV SP,R0 ;SET UP ARG POINTERS MOV R2,-(SP) ;COUNT MOV R0,-(SP) ;POINTER ; CLR -(SP) ;BUILD DUMMY STACK FRAME CLR -(SP) ;; CLR -(SP) ;; MOV SP,R5 ;LEVEL ZERO STACK FRAME CLR @#CHNAL CLRB @#CHNARG ;NO STRING IN CHAIN AREA AS YET ; TST PR.INI ;SEE IF INITIALISATION NEEDED BEQ RETN JSR PC,@PR.INI ; RETURN RETN: JMP @PS.TRT ; MEMERR: FATAL ; .IF NE CMDLNE .PSECT $VARBL ASTPRM: .ASCIZ /$/ .ENDC .END