ASMB,R,Q,C * NAME: CAPCK * SOURCE: 92067-18310 * RELOC: PART OF 92067-16268 * PGMR: G.L.M. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM CAPCK,6 92067-1X310 REV.2013 790801 ENT CAPCK EXT $SMCA,$CMAD,IDGET,$SMVE,.ZPRV,.ENTP,$ESTB * SPC 5 * * * PURPOSE: TO PROVIDE COMMAND VALIDATION AND CAPABILITY LEVEL * CHECKING OF RTE IVB SESSION OPERATOR COMMANDS. * * * * CALLING SEQUENCE: REG=CAPCK(IBUF,LEN,ISCB,ICAP) * ---- ---- * * WHERE: IBUF=COMMAND BUFFER TO BE CHECKED. * LEN = -BYTES OR + WORDS. * ISCB=OPTIONAL SCB ADDRESS TO BE USED. * ICAP=OPTIONAL CAPABILITY LEVEL TO CHECK * THE COMMAND AGAINST. * * RETURNS: (OK RETURN) (A)=ASCII COMMAND * (B)=PARAMETER COUNT * (X)=ADDRESS OF PARAMETER #1 IN * CAPCK'S BUFFER * * * (CAPABILITY ERROR) (A)=ASCII COMMAND * (B)=-1 * (X)=ADDR OF PARM #1 * * * (COMMAND UNDEFINED) (A)=-1 * (B)=PARAMETER COUNT * (X)=ADDR OF PARM #1 * * * * COMMAND TABLE STRUCTURE: * ** ** *$CMND DEF EINDX DEFINE THE ADDRESS OF HIGHEST CAPABILITY * DEF BEGIN DEFINE BEGINNING OF TABLE * DEF END DEFINE END OF TABLE ** *L60 DEC -60 LEVEL 60 *L60A DEF BEGIN DEFINE START OF THIS CAPABILITY ** *L50 DEC -50 *L50A DEF L.50 ** *L30 DEC -30 *L30A DEF L.30 ** *L10 DEC -10 *L10A DEF L.10 ** *L00 NOP *L00A DEF L.00 ** *EINDX EQU *-2 ** ** ** * ORG $CMND * BSS L10A-L30A * BSS L30A-L50A * BSS L50A-L60A * ORR ** * SKP *L.60 EQU * *BEGIN ASC 1,QU * OCT 0 NOTE** NO COMMAND LIMITATION * ASC 1,DN * OCT 0 * ASC 1,LU * OCT 0 * ASC 1,EQ * OCT 0 * ASC 1,TO * OCT 0 * ASC 1,BL * OCT 0 * ASC 1,TM * OCT 0 * ASC 1,OF * OCT 0 * ASC 1,BR * OCT 0 * ASC 1,GO * OCT 0 * ASC 1,SS * OCT 0 ** *L.50 ASC 1,IT * OCT 0 * ASC 1,L3 ABILITY TO ADD AN ENTRY IN SST -- SL CMND * OCT 0 * ASC 1,AS * OCT 0 * ASC 1,UR * OCT 0 * ASC 1,ON * OCT 0 * ASC 1,PR * OCT 0 ** *L.30 ASC 1,RU * OCT 0 * ASC 1,OF * OCT 40000 NOTE** PROGRAM SPECIFIED MUST BELONG TO THIS SESSION * ASC 1,SS * OCT 40000 * ASC 1,GO * OCT 40000 * ASC 1,RT * OCT 0 * ASC 1,SZ * OCT 0 * ASC 1,L2 LEVEL 2 SL CMND -- SPOOL AN LU * OCT 0 ** *L.10 ASC 1,FL * OCT 0 * ASC 1,RS * OCT 0 * ASC 1,QU * OCT 100000 NOTE** ZERO PARAMETERS ALLOWED * ASC 1,BL * OCT 100000 * ASC 1,ST * OCT 0 * ASC 1,BR * OCT 40000 * ASC 1,EQ * OCT 100001 NOTE** ONLY 1 PARAMETR ALLOWED * ASC 1,SL * OCT 0 * ASC 1,TO * OCT 100001 * ASC 1,TE * OCT 0 * ASC 1,WH * OCT 0 * ASC 1,TI * OCT 0 * ASC 1,UP * OCT 0 * ASC 1,EN * OCT 0 ** *L.00 ASC 1,OP * OCT 0 * ASC 1,HE * OCT 0 ** *END EQU *-2 ** SKP SUP PRESS ALL EXTRANEOUS LISTING * IBUF NOP ILEN NOP ISCB NOP ICAP NOP * CAPCK NOP JSB .ZPRV DEF LIBX * * NOTE - NEED TO PRE-SET ISCB=DEF ZERO * JSB .ENTP DEF IBUF * * SET UP SESSION POINTERS * * NOTE: MUST CLEAR (A) BEFORE LOAD OF ISCB INDIRECT. * * CLA CLEAR A IN CASE ISCB OR ICAP1 NOT PASSED LDB ICAP,I FETCH POSSIBLE PASSED STB CAP1 CAPABILITY LEVEL (NON-SES PROGS ONLY) * LDB ISCB,I FETCH PASSED SCB ADDRESS SZB,RSS WAS IT REALLY PASSED? JSB $ESTB NO-SEE IF CALLER IN SESSION STB ISCB SAVE SCB ADDR OR ZERO SSB,RSS IF NO CAPABILITY CHECK REQUIRED OR SZB,RSS IF NOT IN SESSION, JMP NSES JUST DO PARSE * * WE HAVE A SESSION CONTROL BLOCK ADDRESS * NOW GET USER'S CAPABILITY LEVEL * JSB $SMVE DEF RTN1 DEF D1 DEF ISCB SCB LOCATION DEF $SMCA OFFSET TO SESSION CAPABILITY DEF CAP1 CAPABILITY PLACED HERE DEF D1 TRANSFER ONE WORD * RTN1 EQU * SKP * * NOW DO A QUICK PARSE ON THE REQUEST TO DETERMINE: * 1) COMMAND * 2) 1ST PARAMETER (ASCII ONLY-NO CONVERSION) * 3) NUMBER OF PARAMETERS * * INITIALIZE FOR PARSE * NSES CLA STA CHCNT CLEAR:CHARACTER COUNT STA CMCNT COMMA COUMT STA PCNT PARAMETER COUNT STA FAIL FAILURE FLAG STA CMND AND COMMAND BUFFER LDA DCMND SET ADDRESS OF COMMAND STA CMAD RESULT BUFFER LDA DPARM SET ADDRESS OF PARM#1 STA PARAD RESULT BUFFER * LDA NULL FILL RESULT STA PARM BUFFER WITH BLANKS STA PARM+1 STA PARM+2 * * GET BYTE ADDRESS OF REQUEST BUFFER AND SET COUNT * LDB IBUF FETCH DIRRECT ADDRESS OF REQUEST CLE,ELB BUFFER AND CONVERT TO BYTE ADDR STB IBUF SAVE IT LDA ILEN,I FETCH LENGTH SSA IF NEG BYTES JMP BCNT SAVE VALUE FOR SCAN CMA,INA,SZA,RSS SET NEG AND CHECK FOR ZERO JMP EXITX NOTHING PASSED NOTHING PARSED ************************************************* * CHECK EXIT VALUES IN THIS CASE ************************************************* BCNT STA ILEN SAVE NEG BYTE COUNT * * SCAN THE REQUEST BUFFER * NXTBT LBT FETCH BYTE FROM BUFFER CPA B40 IF NULL JMP CONT CONTINUE WITH NEXT CHAR * CPA COMMA ISIT A "," ? JMP ITCMA YEP-DO COMMA WORK * ISZ CHCNT BUMP CHARACTER COUNT LDB CMCNT FETCH COMMA COUNT SZB,RSS IS THIS THE COMMAND? JMP CMND1 YES PROCESS IT * CPB D1 IS THIS THE FIRST PARM? JMP FST YES--SAVE IT * * EAT ALL OTHER PARAMETERS * CONT ISZ IBUF IBUF BUMP BYTE ADDRRESS AND LDB IBUF FETCH IT ISZ ILEN BUMP CHAR COUNT, DONE ? JMP NXTBT NO, GETNEXT CHARACTER SKP * * * * SCAN FINISHED, IF NOT SESSION OR NO CHECK REQUESTED - EXIT * LDA ISCB IF SCB ADDR ADA CAP1 (*1940* FORCE CHECK IF CAP LEVEL PASSED& * CALLER NOT UNDER SESSION) SSA,RSS IS NEGATIVE OR SZA,RSS = ZERO THEN JMP EXOK EXIT OK * * * INITIALIZE FOR CAPABILITY LEVEL CHECK * LDA $CMAD FETCH POINTER TO COMMAND TABLE INDEX XLB A,I FETCH ADDR OF HIGHEST LEVEL POINTER STB QUIT AND SAVE AS HIGHEST LEVEL. * INA XLB A,I FETCH START OF COMMAND TABLE (ADDR) STB BEGIN AND SAVE AS START SEARCH POINT. * INA XLB A,I FETCH END OF COMMAND TABLE (ADDR) STB END AND SAVE AS TERMINATION POINT CLE,INA,RSS ADVANCE TO FIRST LEVEL DEFINITION * * * FIND END OF CALLER'S CAPABILITY LEVEL * * LEV? ADA D2 BUMP TABLE ADDRESS CPA QUIT END OF SPECIFICATION? JMP HIGH -YES, USE THIS DEFINITIION (SIGN OF B=0) XLB A,I -NO, FETCH THIS LEVEL (NEGATIVE VALUE) ADB CAP1 COMPARE WITH USER'S CAPABILITY SSB,SZB IF CALLER >= TO THIS LEVEL, USE IT JMP LEV? ELSE CONTINUE SEARCH * HIGH INA ADVANCE TO START ADDR OF THIS LEVEL XLB A,I FETCH START ADDRESS OF THIS CAPABILITY STB STRT SAVE FOR SECOND PASS * SKP * * * SCAN THE COMMAND TABLE TO IDENTIFY COMMAND AND * VERIFY ITS USAGE AT THIS CAPABILITY LEVEL. * * * * B=START ADDR OF TABLE * NXT2 XLA B,I FETCH ASCII COMMAND CPA CMND COMPARE WITH REQUESTED COMMAND JMP MTCH1 -IF MATCH,CHECK PARMS * CPB END END OF COMMAND TABLE? JMP DONE? YES- MAY NEED SECOND PASS * ADB D2 NOT END SO CHECK JMP NXT2 THE NEXT ONE * DONE? CCA PRE-SET FOR CMND UNDEFINED RETURN LDB FAIL FETCH FAIL FLAG SZB IF THIS IS SECOND PASS THEN JMP EXITX EXIT, (A=-1) CMND UNDEFINED] * * WE ONLY NEED TO SEARCH THE PORTION OF THE TABLE NOT COVERED * BY THE FIRST PASS * LDB STRT FETCH BEGINNING OF USER CAPABILITY STB END SET AS STOP SEARCH POINT * LDB BEGIN FETCH ACTUAL START LOCATION OF CMND TABLE STB FAIL SET SECOND PASS FLAG JMP NXT2 GO SEE IF CMND DEFINED * * * WE HAVE REACHED THE END OF THE USER'S CAPABILITY, BUT NOT * THE END OF THE COMMAND TABLE. WE MUST SEARCH THE REMAINING * PORTION OF THE COMMAND TABLE TO DETERMINE THE TYPE OF ERROR: * OP-CODE OR INSUFFICIENT CAPABILITY. * * * * WE HAVE A MATCH - IF "FAIL" IS NOT ZERO, INSUF CAP ERR EXIT * * ELSE CHECK FOR PARAMETER RESTRICTIONS * * MTCH1 LDA FAIL FETCH FAIL FLAG SZA IF NOT = 0 JMP INSUF EXIT * SKP * COMMAND IS DEFINED FOR THIS USER * CHECK FOR PARAMETER RESTRICTIONS * * STB CHCNT SAVE TABLE ADDR IN TEMP INB ADVANCE TO PARAMETER SPECIFICATION XLA B,I AND FETCH IT * SSA BIT 15=PARM COUNT RESTRICTION JMP CK# - GO CHECK COUNT * RAL BIT 14=PROGRAM SPECIFIED BY PARM1 MUST SSA BELONG TO SPECIFIED SESSION JMP IDCK GO CHECK SESSION WORD * * EXOK LDB PCNT FETCH PARAMETER COUNT EXNO LDA CMND FETCH ASCII COMMAND EXITX STA CMND CLA STA ISCB STA CAP1 LDA CMND LDX PARMA LIBX JMP CAPCK,I DEF CAPCK (MAKE GENERATOR AND LOADER HAPPY) * * A=CMND LIMIT WORD * * CK# AND B37 LOW 5 BITS = ALLOWED COUNT CMA SET IT NEG-1 LDB PCNT FETCH # OF REQUEST PARAMETERS ADA B ADD ALLOWED NUMBER SSA IF <= TO ALLOWED COUNT JMP EXOK EVERYTHINGS OK-- EXIT * INSUF CCB -CAPABILITY ERROR JMP EXNO ERROR EXIT * * IDCK JSB IDGET FETCH ID ADDR OF DEF *+2 PROGRAM SPECIFIED BY PARMA DEF PARM PARM #1 * SZA,RSS PROG NOT FOUND OR JMP EXOK NOT SPECIFIED IS OK * LDB D14 FETCH OFFSET TO TYPE WORD ADB A XLA B,I FETCH TYPE WORD AND D15 ISOLATE IT CPA D5 IF A SEGMENT JMP EXOK LET IT THROUGH (NO SESSION WORD) * ADB D18 ADVANCE TO SESSION WORD XLA B,I AND FETCH IT * SZA NOTE:THIS ALLOWS ACCESS OF NON-SESSION PROGRAMS * * CPA ISCB MATCH CALLER'S SPECIFICATION? JMP EXOK -YES, GO EXIT OK JMP INSUF -NO, CAPABILITY ERROR EXIT * SKP * * * * THE FOLLOWING SECTIONS ARE CALLED BY THE REQUEST SCAN PROCESSOR * * * FOUND A COMMA * ITCMA ISZ CMCNT BUMP COMMA COUNT CLB LDA CHCNT FETCH CHARACTER COUNT STB CHCNT AND THEN RESET FOR NEXT PARM * SZA ANY NON-NULL OR NON-COMMA CHARS SEEN? ISZ PCNT YES - BUMP PARAMETER COUNT JMP CONT CONTINUE WITH NEXT BYTE * * * * WORKING ON THE REQUESTED COMMAND * CMND1 LDB CHCNT FETCH CHARACTER COUNT ADB N3 IF MORE THAN 2 CHARS FOUND SSB,RSS THEN WE HAVE ALL WE NEED SO JMP CONT CONTINUE SCAN * LDB CMAD FETCH BYTE ADDRESS OF COMMAND BUFFER SBT SAVE THE BYTE STB CMAD SAVE NEW BYTE ADDRESS JMP CONT AND CONTINUE SCAN * * * WORKING ON 1ST PARAMETER * * FST LDB CHCNT FETCH CHAR COUNT ADB N6 IF MORE THAN 5 THEN SSB,RSS WE HAVE SEEN ENOUGH JMP CONT SO CONTINUE SCAN * LDB PARAD FETCH BYTE ADDRESS OF PARAMETER BUFFER SBT STORE THE BYTE STB PARAD SAVE NEW BYTE ADDR JMP CONT CONTINUE SCAN * SKP * * D1 OCT 1 D2 OCT 2 D5 DEC 5 D14 DEC 14 D15 DEC 15 D18 DEC 18 B37 OCT 37 N3 OCT -3 N6 OCT -6 COMMA OCT 54 NULL ASC 1, B40 OCT 40 CAP1 NOP QUIT NOP STRT NOP END NOP BEGIN NOP CMCNT NOP CHCNT NOP PCNT NOP CMND NOP CMAD NOP DCMND DBL CMND PARM ASC 3, DPARM DBL PARM PARAD NOP FAIL NOP OUCH! EQU * A EQU 0 B EQU 1 END