;*********************************************************************** ; ; LANGUAGE FOR TUTORIAL COURSES ; STATEMENT EXECUTORS. PART 1 ; INPUT/OUTPUT STATEMENTS ; ; INPUT ; R1 = PTR TO NEXT SYMBOL AFTER THE ; ; OUTPUT ; R1 = PTR TO ANY SYMBOL BEFORE THE "LF" BEFORE THE NEW STATEMENT ; R0,R2 ISN'T RESTORED ; .ENABL GBL .NLIST BEX ;---------------------------------------------------------------------- ; ; BEGIN OF PROBLEM STATEMENT ; ; FORMAT ; !PR ANY SYMBOLS NL ; FUNCTIONS ; SET IN AD.PR PTR TO THIS STATEMENT (FOR BACK REFERENCES AND BRANCHES), ; INITIALIZE ALL AREAS AND FLAGS FOR NEW SET OF QUESTIONS (I.E. CLEAR ; THE AQ.QU AREA, RY.CC FLAG, REPLY BUFFER - &1 ), SEND MESSAGE ; "PRESS ANY KEY" AND RETURNS AFTER ANY KEY WAS PRESSED E.PR:: MOV R1,R0 10$: CMPB -(R0),#12 ; SET IN R0 THE PTR TO THIS STATEMENT BNE 10$ MOV R0,@#AD.PR ; INITIALIZE ALL AREAS FOR NEW SET CLR @#AD.QU ; OF QUESTIONS CLRB @#RY.CC MOV @#VARS.$,R0 ; PTR TO &1 STRING VARIABLE MOV #,R2 ; ITS LENGTH 20$: MOVB #' ,(R0)+ ; FORMAT THE REPLY BUFFER SOB R2,20$ CLRB @R0 ; MARK THE END OF BUFFER CALL UU.DELAY ; SEND MESSAGE AND WAIT FOR ANY KEY ; PRESSING RETURN .PAGE ;---------------------------------------------------------------------- ; ; BEGIN OF NEW QUESTION STATEMENT ; ; FORMAT ; !? ANY SYMBOLS NL ; FUNCTIONS ; SET IN AD.QU PTR TO THIS STATEMENT (FOR BACK REFERENCES AND BRANCHES), ; INITIALIZE ALL AREAS AND FLAGS FOR NEW QUESTION (I.E. CLEAR ; RY.CC FLAG, REPLY BUFFER - &1 ) E.QU:: MOV R1,R0 10$: CMPB -(R0),#12 ; SET IN R0 THE PTR TO NEXT STATEMENT BNE 10$ MOV R0,@#AD.QU ; INITIALIZE ALL AREAS FOR NEW CLRB @#RY.CC ; QUESTION RETURN ;---------------------------------------------------------------------- ; ; CUT THE REPLY BUFFER ; ; FORMAT ; !CU NL ; FUNCTIONS ; CUT THE REPLY BUFFER (&1) TO SIZE GIVEN (>0 AND ][,,...] NL ; ; IF THE LABEL OF MESSAGE ISN'T SPECIFIED THE MESSAGE IS LOCATED AT NEXT ; STRING AFTER THE STATEMENT. END OF MESSAGE - '!' AT BEGIN OF NEW LINE ; THE VALUES OF SPECIFIED VARIABLES IS OUTPUTTED IN THE CORRESPONDING ; MESSAGE WINDOWS E.WRIT:: MOV R3,-(SP) MOV R4,-(SP) CLR R3 ; MESSAGE PTR CLR R4 ; NUMBER OF SPECIFIED 10$: MOVB (R1)+,R0 CMPB #' ,R0 ; R0 = NOTBLANK BEQ 10$ CMPB R0,#12 ; Q. MESSAGE LABEL & PARAMS SPECIFIED BEQ WOUT ; NO LABEL, NO PARAMETERS CMPB R0,#', ; Q. MESSAGE LABEL SPECIFIED BEQ WPARS1 ; NO - ANALYZE THE PARAMS DEC R1 CALL U.GETM ; GET IN R0 THE PTR TO MESSAGE MOV R0,R3 ; SAVE IT IN R3 WPARS: ; SCAN THE PARAMETERS MOVB (R1)+,R0 WPARS1: CMPB #' ,R0 BEQ WPARS ; R0 = 1. NOTBLANK CMPB R0,#', BNE WOUT ; NO MORE PARAMETERS INC R4 ; INCREMENT THE PARAMETERS COUNTER CALL U.LEX ; GET THE PARAM. PTR CMP R0,#TY.UN BNE WPARSC ; IF A VALID PARAM - BRANCH ERRV: CALL ERROR .WORD 3 ; ELSE ERROR - INVALID PARAMETER WPARSC: CMP R0,#TY.IV ; R2 = @ STR VAR OR INT CONST - BRANCH BNE 10$ MOV (R2),R2 ; R2 = VALUE OF ARITHM. VARIABLE 10$: MOV R2,-(SP) ; PUSH THE PARAM IN STACK BR WPARS ; AND CONTINUE WOUT: ; OUTPUT THE MESSAGE MOV R4,-(SP) ; PUSH THE NUMBER OF PARAMETERS DEC R1 10$: CMPB (R1)+,#12 BNE 10$ ; R1 = PTR TO NEXT STRING TST R3 BEQ 20$ ; R1 CONTAINS @ MESSAGE YET MOV R1,-(SP) MOV R3,R1 ; SAVE R1 IN R3, MOV (SP)+,R3 ; R1 = MESSAGE PTR 20$: CALL U.FORM ; OUTPUT THE FORMATTED MESSAGE TST R3 BEQ 30$ ; DON'T RESTORE THE TUTOR PGM COUNTER MOV R3,R1 30$: MOV (SP)+,R2 ; NUMBER OF PARAMETERS ASL R2 ADD R2,SP ; RESTORE THE STACK LEVEL MOV (SP)+,R4 MOV (SP)+,R3 RETURN .END