.TITLE CSI COMPATABILITY ROUTINES .IDENT /V01/ .MCALL CSI$,RETURN,CALL ;+ ; THESE FORTRAN CALLABLE ROUTINES FORM AN INTERFACE WITH THE ; COMMAND STRING INTERPRETER (CSI). AN ATTEMPT HAS BEEN MADE TO ; CONFORM AS CLOSELY AS POSSIBLE TO THE MACRO IMPLEMENTATIONS OF ; ; CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND. ; ; THE CORRESPONDING FORTRAN COMPATIBLE ROUTINES, DEFINED AND DESCRIBED ; BELOW, ARE: ; ; CSI1,CSI1,CSISW,CSISV,CSIND. ; ; IN ORDER TO OVERCOME THE INABILITY TO USE EXTERNAL OFFSETS IN ; FORTRAN, SEVERAL OTHER ROUTINES ARE DEFINED WHICH RETRIEVE SPECIFIC ; INFORMATION FROM THE CSI CONTROL BLOCK. ; ; ; IN ALL ROUTINES BELOW, CSIBLK IS AN ARRAY OF SIZE AT LEAST 22 WORDS. ; ; LAST UPDATE 6/30/76 [ELB] - ADD CSI-DEV,-UIC,-NAM ;- CSI$ ; DEFINE DEFAULTS .PSECT CNTRO,LCL,CON,I,RO .SBTTL MACRO DEFINITIONS ;+ ; MOVARG ANUM,DEST,IND,DEF,?LABE ; WHERE: ; ANUM THE ORDINAL NUMBER OF THE ARGUMENT WHICH IS DESIRED ; DEST THE DESTINATION TO WHICH THE ARGUMENT IS TO BE MOVED ; IND INDIRECT SPECIFICATION. IF NOT BLANK, THE ARGUMENT ; WILL BE CONSIDERED INDIRECT (A VALUE), OTHERWISE ; IT WILL BE THE ARGUMENT'S ADDRESS. ; DEF A DEFAULT VALUE FOR DEST. SHOULD BE A VALID SOURCE. ; LABE OPTIONAL LOCATION TO BE BRANCHED TO IF ARGUMENT IS ; NULL. IF LABE IS NOT SPECIFIED, IT WILL DEFAULT TO THE ; NEXT INSTRUCTION. ; ; THE ONLY ARGUMENTS NECESSARY ARE ANUM AND DEST. ;- .MACRO MOVARG ANUM,DEST,IND,DEF,LAB1,?LABE $$$ANM=ANUM+ANUM .IF NB,DEF MOV DEF,DEST .ENDC CMPB (R5),#ANUM .IF B,LAB1 BLT LABE .IFF BLT LAB1 .ENDC CMP $$$ANM(R5),#-1 ; NULL? .IF B,LAB1 BEQ LABE .IFF BEQ LAB1 .ENDC .IF NB,IND MOV @$$$ANM(R5),DEST .IFF MOV $$$ANM(R5),DEST .ENDC .NARG $$$ANM ; NUMBER OF ARGUMENTS .IF B,LAB1 ; WAS LABE SPECIFIED? LABE: ; NO .ENDC .ENDM .SBTTL CSI1 ;+ ; SUBROUTINE CSI1(CSIBLK [,BUFF] [,LEN] [,IER]) ; WHERE: ; CSIBLK - 22 WORD ARRAY FOR CONTROL BLOCK ; BUFF - ADDRESS OF INPUT COMMAND STRING ; - IF NOT SPECIFIED CSIBLK MUST HAVE BEEN SET UP ; - PREVIOUSLY. ; LEN - LENGTH OF INPUT STRING. AS ABOVE IF NULL. ; IER - ERROR RETURN CODE. ; - POSSIBLE VALUES: ; - 0 SUCCESS ; - -1 SYNTAX ERROR. ; CALL GETSTR TO RETRIEVE OFFENDING STRING. ; ; CSI1 INITIALIZES CSIBLK AND CHECKS THE SYNTAX OF BUFF. ;- CSI1:: MOV R0,-(SP) MOV 2(R5),R0 ; CSIBLK MOVARG 2,C.CMLD+2(R0) ; BUFF MOVARG 3,C.CMLD(R0),I ;LEN CLR -(SP) ; ERROR INDICATOR CALL .CSI1 ; EXECUTE SYNTAX CHECK BCC 1$ ; NO PROBLEM MOV #-1,(SP) ; ERROR 1$: MOVARG 4,R0,,,2$ MOV (SP),(R0) 2$: TST (SP)+ MOV (SP)+,R0 RETURN .SBTTL CSI2 ;+ ; SUBROUTINE CSI2(CSIBLK,IO [,SWTAB] [,IER]) ; WHERE: ; CSIBLK - AS ABOVE (CSI1 MUST HAVE BEEN CALLED PREVIOUSLY) ; IO - MUST BE ASCII STRING OF AT LEAST 2 CHARACTERS. ; - PERMITTED VALUES ARE: ; - 'IN [PUT]' ; - 'OU [TPUT]' ; SWTAB - OPTIONAL SWITCH TABLE ADDRESS. MUST HAVE BEEN ; - INITIALIZED BY CSISW AND CSIND. REPEAT - THESE ; - ROUTINES MUST BE USED. ; IER - ERROR RETURN CODE ; - POSSIBLE VALUES: ; - 0 SUCCESS ; - -2 IO ARGUMENT NOT SPECIFIED ; - -3 IO ARGUMENT MUST BE 'IN' OR 'OU' ; - -4 ERROR RETURNED BY CSI2. SEE MANUAL. ;- CSI2:: MOV R0,-(SP) MOV R1,-(SP) MOV 2(R5),R0 ; CSIBLK CLR -(SP) MOVARG 2,R1,I,,4$ CMP R1,#"IN ; INPUT? BNE 1$ ; NO MOVB #CS.INP,C.TYPR(R0) BR 3$ 1$: CMP R1,#"OU ; OUTPUT? BNE 2$ ; NO MOVB #CS.OUT,C.TYPR(R0) BR 3$ 2$: MOV #-3,(SP) ; MUST BE "IN OR "OU BR 6$ 4$: MOV #-2,(SP) ; IO ARG NOT THERE BR 6$ ; AND RETURN ERROR 3$: MOVARG 3,C.SWAD(R0) ; OPTIONAL SWITCH TABLE ADDRESS ADD #4,C.SWAD(R0) ; TABLE ACTUALLY STARTS AT 3RD WORD CALL .CSI2 BCC 6$ ; NO ERROR MOV #-4,(SP) ; SOME ERROR 6$: MOVARG 4,R1,,,7$ MOV (SP),(R1) 7$: TST (SP)+ MOV (SP)+,R1 MOV (SP)+,R0 RETURN .SBTTL CSISW - DEFINE SWITCH TABLE ;+ ; SUBROUTINE CSISW(SWTAB,SW,MASK [,MASKW] [,CSFLAG] [,NFLAG] ; [,VALTAB] [,IER]) ; WHERE: ; SWTAB - ADDRESS OF SWITCH TABLE ARRAY. ; - THIS ARRAY MUST BE INITIALIZED AS FOLLOWS: ; - FIRST WORD: 0 ; - THIS CAN BE DONE WITH "CSIINI" (WHICH SEE) ; - SECOND WORD: N, WHERE N IS LENGTH OF ARRAY ; - CSISW WILL RETURN AN ERROR (SEE IER) IF THE SWTAB ; - WILL REACH OVERFLOW FOR THE PRESENT CALL. ; - THE LENGTH SHOULD BE AT LEAST M*4+3, WHERE M IS THE ; - NUMBER OF SWITCHES IN THE TABLE. ; SW - THE 2 ASCII CHARACTERS FOR THE SWITCH. ; MASK - THE MASK VALUE TO BE USED IF THE SWITCH IS PRESENT. ; MASKW - AN OPTIONAL WORD WHICH WILL BE CLEARED OR SET WITH ; - MASK ACCORDING TO THE SETTING OF CSFLAG. ; CSFLAG - AN OPTIONAL ARGUMENT WHOSE VALUE MUST BE EITHER ; - 'CL [EAR]' OR 'SE [T]' IF PRESENT. THE DEFAULT IS SET. ; NFLAG - AN OPTIONAL ARGUMETN WHOSE VALUE MUST BE 'NE [G]' IF ; - PRESENT. THE DEFAULT IS NO NEGATION ALLOWED. IF NFLAG ; - IS PRESENT, NEGATION OF THE SWITCH IS ALLOWED. ; VALTAB - OPTIONAL ADDRESS OF AN ASSOCIATED VALUE TABLE (SEE ; - CSISV). ; IER - OPTIONAL ERROR RETURN CODE. ; - POSSIBLE VALUES: ; - 0 SUCCESS ; - -1 OVERFLOW OF SWTAB - TOO MANY SWITCHES ; - -2 CSFLAG NOT 'SE' OR 'CL' ; - -3 NFLAG NOT 'NE' ; - -4 ONE OF SWTAB,SW, OR MASK NOT SPECIFIED. ; ; SWTAB,SW, AND MASK MUST BE SPECIFIED. ; ; BEFORE USING SWTAB, CSIND (WHICH SEE) MUST BE CALLED TO END THE TABLE. ;- CSISW:: MOV R0,-(SP) MOV R1,-(SP) CLR -(SP) ; HOLDS ERROR CODE MOVARG 1,R0,,,ERRSW ; GET SWTAB ADDRESS MOV (R0),R1 ; LENGTH OF TABLE BNE 1$ ; IS IT ZERO (INITIALIZE) ? MOV #2,R1 ; YES MOV R1,(R0) ; ACTUAL START IS IN 3RD WORD 1$: ADD #5,R1 ; IS THERE ROOM FOR SWITCH AND END? CMP R1,2(R0) ; LENGTH OF ARRAY IN 2(R0) BLE 2$ ; NO PROBLEM MOV #-1,(SP) ; WHOOPS! BR DONESW 2$: MOV (R0),R1 ; GET LENGTH AGAIN ADD #4,(R0) ; ADD UPDATE IT ASL R1 ; WANT TO FORM ADDRESS ADD R1,R0 ; OF NEXT WORD IN TABLE MOVARG 2,(R0)+,I,,ERRSW ; GET SWITCH NAME ; MOVARG 3,(R0),I,,ERRSW ; GET MASK VALUE ; CLR 2(R0) ; DEFAULT MASK WORD MOVARG 4,2(R0),,,3$ ; MASK WORD ADDRESS MOVARG 5,R1,I,,3$ ; IT'S PRESENT! CHECK CSFLAG. CMP R1,#"SE ; IS IT 'SET'? BEQ 3$ ; YES - GO ON BIS #1,2(R0) ; ASSUME IT IS 'CLEAR' CMP R1,#"CL ; IS IT? BEQ 3$ ; YES INDEEDY! MOV #-2,(SP) ; THIS IS A NONO BR DONESW ; 3$: CLR 4(R0) ; DEFAULT SWITCH VALUE TABLE MOVARG 7,4(R0),,,4$ ; MIGHT BE THERE, MIGHT NOT ADD #4,4(R0) ; IT'S THERE - OFF. TO TAB. START ; 4$: MOVARG 6,R1,I,,DONESW ; IF NFLAG NOT THERE, WE'RE DONE! BIS #1,4(R0) ; NFLAG IS THERE. SET BIT CMP R1,#"NE ; BUT IS IT 'NE'? BEQ DONESW ; YES - WE'RE DONE! MOV #-3,(SP) ; ANOTHER NO-NO BR DONESW ; ERRSW: MOV #-4,(SP) ; DONESW: MOVARG 8.,R1,,,1$ ; IS ERROR RETURN PRESENT? MOV (SP),(R1) ; MUST BE 1$: TST (SP)+ MOV (SP)+,R1 MOV (SP)+,R0 RETURN .SBTTL CSISV - DEFINE SWITCH VALUE TABLE ;+ ; SUBROUTINE CSISV(VALTAB,TYPE,VALUE,LEN [,IER]) ; WHERE: ; VALTAB - ADDRESS OF ARRAY TO HOLD SWITCH VALUE TABLE. ; - THIS ARRAY IS THE ONE SPECIFIED IN A CALL TO CSISW. ; - IT IS INITIALIZED IN THE SAME WAY AS THE SWITCH TABLE, ; - I.E., THE FIRST WORD MUST BE ZERO AND THE SECOND MUST ; - BE THE ALLOCATED LENGTH OF THE ARRAY. THIS LENGTH ; - SHOULD BE AT LEAST M*2+3 WHERE M IS THE NUMBER OF ; - SWITCH VALUES DESIRED. ; - AGAIN, "CSIINI" CAN BE USED TO INITIALIZE VALTAB. ; TYPE - REQUIRED TYPE OF VALUE EXPECTED. MUST BE ONE OF: ; - 'AS [CII]' ASCII VALUE ; - 'NU [MERIC]' NUMERIC (OCTAL VALUE) ; - 'OC [TAL]' SAME AS NUMERIC ; - 'DE [CIMAL]' DECIMAL. ; - AS DISCUSSED IN THE CSI$ DOCUMENTATION, THE DECIMAL ; - OR OCTAL DEFAULT CAN BE OVERRIDDEN BY A '#' OR '.' ; - RESPECTIVELY. ; VALUE - ADDRESS OF WORD TO HOLD NUMERIC VALUE, OR BYTE ; - ARRAY TO HOLD ASCII VALUE. ; LEN - LENGTH OF ASCII STRING EXPECTED. THIS ARGUMENT ; - IS REQUIRED FOR TYPE 'ASCII', BUT IS IGNORED FOR ; - NUMERIC CONVERSIONS, AS THE LENGTH FOR THESE TYPES ; - IS ALWAYS 2. ; IER - OPTIONAL ERROR CODE RETURN. ; - POSSIBLE VALUES ARE: ; - 0 SUCCESS ; - -1 OVERFLOW ; - -2 ILLEGAL TYPE FOR CONVERSION ; - -4 REQUIRED ARGUMENT NOT PRESENT ; ; VALTAB, TYPE AND VALUE ARGUMENTS ARE REQUIRED, AND LEN IS REQUIRED ; IF TYPE IS 'ASCII'. ;- CNV.AS=1 ; ASCII CONVERSION BIT CNV.NU=2 ; NUMERIC/OCTAL CONVERSION BIT CNV.OC=CNV.NU ; DITTO CNV.DE=3 ; DECIMAL CONVERSION BIT ; CSISV:: MOV R0,-(SP) MOV R1,-(SP) CLR -(SP) ; MAKE ROOM FOR ERROR CODE MOVARG 1,R0,,,ERRSV ; GET ADDESS OF SVTAB MOV (R0),R1 ; PRESENT LENGTH OF TABLE BNE 1$ ; NOT ZERO - DON'T INITIALIZE MOV #2,R1 ; START AT 3RD WORD MOV R1,(R0) ; AND UPDATE POINTER 1$: ADD #3,R1 ; CHECK FOR POSSIBLE OVERFLOW CMP R1,2(R0) BLE 2$ ; NO PROBLEM MOV #-1,(SP) ; WHOOPS! BR DONESV 2$: MOV (R0),R1 ; RESTORE LENGTH ADD #2,(R0) ; UPDATE POINTER ASL R1 ; PREPARE TO MAKE ADDRESS ADD R1,R0 ; OF NEXT WORD IN TABLE MOVARG 2,R1,I,,ERRSV ; GET TYPE CMP R1,#"AS ; ASCII? BNE 3$ ; NO MOVB #CNV.AS,(R0)+ ; PUT BIT IN FIRST BYTE OF TABLE ENTRY MOVARG 4,R1,I,,ERRSV ; GET LENGTH MOVB R1,(R0)+ ; STORE IN TABLE AS NEXT BYTE BR 10$ ; AND CONTINUE 3$: CMP R1,#"NU ; NUMERIC? BEQ 4$ ; YES CMP R1,#"OC ; OR OCTAL? BNE 5$ ; NO - KEEP CHECKING 4$: MOVB #CNV.OC,(R0)+ ; SET BIT IN BYTE BR 7$ 5$: CMP R1,#"DE ; DECIMAL? BNE 6$ ; NO - FOR SHAME MOVB #CNV.DE,(R0)+ ; SET IT BR 7$ ; CONTINUE 6$: MOV #-2,(SP) ; INCORRECT TYPE ENTRY BR DONESV ; 7$: MOVB #2,(R0)+ ; LENGTH FOR NUMERIC ITEMS IS 2 10$: MOVARG 3,(R0),,,ERRSV ; VALUE ADDRESS BR DONESV ; ALL FINISHED ; ERRSV: MOV #-4,(SP) ; REQUIRED PARAMETER MISSING ; DONESV: MOVARG 5,R1,,,1$ ; IS IER THERE? MOV (SP),(R1) ; YES - INFORM CALLER 1$: TST (SP)+ MOV (SP)+,R1 MOV (SP)+,R0 RETURN .SBTTL CSIINI - INITIALIZE SWITH OR VALUE TABLES ;+ ; SUBROUTINE CSIINI(TABLE,LENGTH) ; WHERE: ; TABLE - EITHER A FUTURE SWITCH OR VALUE TABLE ARRAY. ; LENGTH - ALLOCATED LENGTH OF THIS ARRAY. ; ; "CSIINI" WILL INITIALIZE THE FIRST WORD OF TABLE TO 0 AND THE ; SECOND WORD TO LENGTH. IT IS PROVIDED TO ALLOW CONSISTENCY IN ; INITIALIZATION. ;- CSIINI:: MOV R0,-(SP) MOV 2(R5),R0 ; TABLE ADDRESS CLR (R0)+ ; FIRST WORD IS ZERO MOV @4(R5),(R0) ; SECOND WORD CONTAINS LENGTH MOV (SP)+,R0 RETURN ; ; .SBTTL CSIND - END OF TABLE ;+ ; SUBROUTINE CSIND(SWTAB [,IER]) ; WHERE: ; SWTAB - ADDRESS OF A SWITCH TABLE CORRECTLY INITIALIZED BY ; - CSISW. ; IER - OPTIONAL ERROR CODE RETURN. ; - POSSIBLE VALUES: ; - 0 SUCCESS (SWTAB MAY NOW BE USED IN CSI2) ; - -1 OVERFLOW (NO ROOM FOR ZERO WORD!) ; ; CSIND IS CALLED TO TERMINATE A SWITCH TABLE. SUBSEQUENTLY, THIS TABLE ; MAY BE USED BY CSI2 WHENEVER DESIRED. ;- CSIND:: MOV R0,-(SP) MOV R1,-(SP) CLR -(SP) MOVARG 1,R0 MOV (R0),R1 ; PRESENT LENGTH OF TABLE CMP R1,2(R0) ; ROOM FOR ONE MORE? BLT 1$ ; LET'S SEE... MOV #-1,(SP) ; NO - ERROR BR 2$ 1$: INC (R0) ; BUMP TABLE LENGTH ASL R1 ; MAKE ADDRESS OF END OF TABLE ADD R1,R0 ; IN R0 CLR (R0) ; AND CLEAR IT OUT!. 2$: MOVARG 2,R1,,,3$ ; IS IER THERE? MOV (SP),(R1) ; YEP 3$: TST (SP)+ ; BUMP STACK MOV (SP)+,R1 MOV (SP)+,R0 RETURN .SBTTL GETSTR - GET FILE NAME STRING ;+ ; SUBROUTINE CSISTR(CSIBLK,STRING,LENGTH) (OR GETSTR(...)) ; GETS ENTIRE FILENAME STRING WITH POSSIBLE DEFAULT DEVICE AND UIC ; ; SUBROUTINE CSIDEV(CSIBLK,STRING,LENGTH) ; GETS DEVICE NAME SPECIFICATION ; ; SUBROUTINE CSIUIC(CSIBLK,STRING,LENGTH) ; GETS UIC SPECIFICATION ; ; SUBROUTINE CSINAM(CSIBLK,STRING,LENGTH) ; GETS FILENAME, EXTENSION, AND VERSION ; ; CSIBLK - AS ALWAYS ; STRING - BYTE ARRAY OF SUFFICIENT LENGTH FOR PURPOSE ; LENGTH - RETURNED LENGTH OF DATA IN STRING (IN CHARACTERS) ;- CSISTR:: GETSTR::MOV R4,-(SP) MOV #7,R4 ; GET ALL PORTIONS BR CONT ; CSIDEV::MOV R4,-(SP) MOV #1,R4 ; JUST DEVICE BR CONT ; CSIUIC::MOV R4,-(SP) MOV #2,R4 ; JUST UIC BR CONT ; CSINAM::MOV R4,-(SP) MOV #4,R4 ; JUST FILENAME ; CONT: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV 2(R5),R0 ; CSI CONTROL BLOCK MOV 4(R5),R3 ; STRING ADDRESS CLR -(SP) ; LENGTH BIT #1,R4 ; DO WE WANT DEVICE? BEQ 1$ ; NO MOV C.DEVD(R0),R1 ; LENGTH OF DEVICE STRING (IF ANY) BEQ 1$ ; NO ADD R1,(SP) ; COUNT IT MOV C.DEVD+2(R0),R2 ; SAVE START OF SPEC. STRING INC R1 ; INCLUDE COLON INC (SP) 11$: MOVB (R2)+,(R3)+ SOB R1,11$ ; 1$: BIT #2,R4 ; WANT UIC? BEQ 2$ ; NO MOV C.DIRD(R0),R1 ; LENGTH OF DIRECTORY STRING (IF ANY) BEQ 2$ ; NO ADD R1,(SP) ; ACCUMULATE MOV C.DIRD+2(R0),R2 ; SAVE IT 12$: MOVB (R2)+,(R3)+ SOB R1,12$ 2$: BIT #4,R4 ; WANT FILE NAME? BEQ 4$ ; NO MOV C.FILD(R0),R1 ; FILE NAME BEQ 4$ ; NO AGAIN! MOV C.FILD+2(R0),R2 ADD R1,(SP) ; ACCUMULATE 13$: MOVB (R2)+,(R3)+ SOB R1,13$ 4$: MOV (SP),@6(R5) ; RETURN LENGTH CLRB (R3)+ ; APPEND NULL BYTE TST (SP)+ MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 MOV (SP)+,R4 RETURN .SBTTL CSIMSK ;+ ; SUBROUTINE CSIMSK(CSIBLK,MSKW1,MSKW2) ; WHERE: ; CSIBLK - THE WELL KNOWN COMMAND STRING INTERPRETER CONTROL ; - BLOCK. (AFTER CSI2 HAS BEEN CALLED!) ; MSKW1 - ON RETURN CONTAINS CONTENTS OF C.MKW1. ; - I.E., THE LOGICAL OR OF ALL MASKS OF SWITCHES ; - WHICH OCCURED IN THE MOST RECENT SPECIFIER. ; MSKW2 - CONTAINS CONTENTS OF C.MKW2 ON RETURN. ; - I.E., FOR EACH MASK OR'ED INTO C.MKW1, MSKW2 HAS ; - THIS (OR THESE) BIT SET OR CLEARED ACCORDING TO THE ; - SENSE OF THE SWITCH. THAT IS, IF THE SWITCH IS ; - NEGATED THE BIT(S) IS CLEARED, OTHERWISE SET. ; ; THIS IS THE ONLY WAY TO FIND WHICH, IF ANY SWITCHES HAVE BEEN ; SPECIFIED, UNLESS A MASK WORD ADDRESS IS PRESENT IN THE CALL TO ; THE APPROPRIATE CSISW. ; ; NOTE THAT ALL ARGUMENTS ARE REQUIRED! ;- CSIMSK:: MOV R0,-(SP) MOV 2(R5),R0 MOV C.MKW1(R0),@4(R5) MOV C.MKW2(R0),@6(R5) MOV (SP)+,R0 RETURN .SBTTL FLAG FUNCTIONS ;+ ; FOLLOWING ARE FORTRAN LOGICAL*1 FUNCTIONS WHICH TEST VARIOUS ; FLAGS IN C.STAT. ;- TRUE=377 ; ; EQUALS SIGN (=) PRESENT? ; CSIEQU:: MOV #CS.EQU,R0 BR TESTAT ; ; MORE SPECS PRESENT (,) ; CSIMOR:: MOV #CS.MOR,R0 BR TESTAT ; ; FILE NAME PRESENT? ; CSIFNM:: MOV #CS.NMF,R0 BR TESTAT ; ; UIC PRESENT ; CSIDIR:: MOV #CS.DIF,R0 BR TESTAT ; ; DEVICE NAME PRESENT? ; CSIDVN:: MOV #CS.DVF,R0 BR TESTAT ; ; ; ; TESTAT: MOV R1,-(SP) MOV 2(R5),R1 ; CONTROL BLOCK ADDR BITB R0,C.STAT(R1) ; TEST THE FLAG BEQ 1$ ; NOT SET MOV #TRUE,R0 ; SET - TRUE BR 2$ 1$: CLR R0 ; NOT SET - FALSE 2$: MOV (SP)+,R1 RETURN .END