.TITLE GCCI .IDENT /130984/ ; ; This procedure implements the GCCI (Get Command for Command-line ; Interpreter ) directive of RSX-11M V4.1. This directive ; is really only usefull for user-written CLI tasks. See the ; Executive Reference and System Management manuals for ; information on user-written CLIs. ; ; FILE: PA3:[22,310]GCCI.MAC ; Author: Jim Bostwick 13-Sep-84 ; History: ; ; Last Edit: 13-SEP-1984 16:34:07 ; ; PROCEDURE GCCI( VAR Buff: CH80; VAR Len:Integer; ; VAR Info: GCCI_Info_rec); EXTERNAL; ; ;{ Pascal-3 procedure to implement the GCCI$ directive. ; GCCI gets a command line for a CLI task. Buff is the buffer ; to receive the command, Len is the length of the command. ; Info is a structure containing all other data returned by ; GCCI$. This structure is defined in ex:[22,320]GCCI.TYP, ; Flags word and no-command word values are defined in ex:[22,320]GCCI.CON. ; ; Directive status is available in DSW upon return. ; ; } ; ; Assemble with PASMAC.MAC as prefix file. ; Compile with LB:[22,10]GCCIINFO.PAS as include file. ; ; NOTE: This procedure employs internal data PSECT CLIDAT. Therefore, ; it is not possible to include GCCI in a resident library. ; ; j.m.b. 13-SEP-1984 16:33:36 ; .MCALL GCCI$, DIR$ .PSECT CLIDAT, D, RW ; ; Local data. NOTE: Use of CLIDAT precludes inclusion of GCCI in ; a shared library. ; GCIDPB: GCCI$ GCCBUF,GCCLEN,, IBFL,, ; skeleton directive GCCLEN = 80.+G.CCBF ; command buffer length IBFL = G.CCCA+2 ; length of info buffer ; Define internal command buffer.. GCCBUF: .BLKB GCCLEN ; NOTE: ; The internal buffer maps directly into a part of the ; Pascal GCCI_Info record. ; ; The CW2 field marks the beginning of the information buffer ; in GCCI_INFO. .PSECT ; define the GCCI_INFO record in macro.... RECORD PASINF ; GCCI_INFO FIELD NOCMD, INTEGER ; NO-COMMAND CONTROL (BYTE) WORD FIELD DEVICE, INTEGER ; CH2 FIELD UNIT, INTEGER ; FIELD CCL, INTEGER ; ORIGINAL LENGTH FIELD FLAGS, INTEGER FIELD TERM, CHAR FIELD CW2, INTEGER FIELD PARENT, 4 FIELD POCB, ADDRESS FIELD LOGGR, INTEGER FIELD LOGME, INTEGER FIELD CURGR, INTEGER FIELD CURME, INTEGER FIELD CMDADR, ADDRESS ENDREC PROC GCCI PARAM BUFF, ADDRESS PARAM LEN, ADDRESS PARAM INFO, ADDRESS SAVE BEGIN MOV #GCIDPB, R1 ; R1-> GCCI$ DPB MOV INFO(SP), R0 ; R0-> GCCI_INFO MOV NOCMD(R0), G.CCNC(R1) ; COPY NO-COMMAND ACTION ADD #CW2, R0 ; R0-> INFORMATION BUFFER MOV R0, G.CCIA(R1) ; info buffer address to DPB DIR$ #GCIDPB BCS 50$ ; COPY RETURNED INFO BACK TO PASCAL... ; (THE INFO BUFFER IS RETURNED BY GCCI$ DIRECTLY ; TO PASCAL SPACE), BUT WE HAVE TO SHUFFLE IT ; A BIT TO TURN UICS FROM BYTES TO INTEGERS... MOV INFO(SP), R0 ; R0-> INFO BUFFER MOV CURGR(R0), CMDADR(R0) ; REPOSITION CMDADR MOVB LOGME+1(R0), CURGR(R0) CLRB CURGR+1(R0) MOVB LOGME(R0), CURME(R0) CLRB CURME+1(R0) MOVB LOGGR(R0), LOGME(R0) CLRB LOGME+1(R0) MOVB LOGGR+1(R0), LOGGR(R0) CLRB LOGGR+1(R0) MOV #GCCBUF, R1 ; R1-> INTERNAL BUFFER MOVB G.CCCT(R1), R2 ; R2= CHARACTER COUNT MOV R2, @LEN(SP) ; RETURN COUNT TO PASCAL BLE 3$ ; SKIP COPY IF NO LENGTH ADD #G.CCBF, R1 ; R1-> GCCI COMMAND TEXT MOV BUFF(SP), R0 ; R0-> PASCAL BUFFER 2$: MOVB (R1)+, (R0)+ ; COPY COMMAND TO PASCAL SOB R2, 2$ 3$: MOV #GCCBUF, R1 ; R1-> GCCI COMMAND BUFFER MOV INFO(SP), R0 ; R0-> PASCAL INFO RECORD MOV G.CCDV(R1), DEVICE(R0) ; COPY DEVICE MOVB G.CCUN(R1), UNIT(R0) ; COPY UNIT NUMBER CLRB UNIT+1(R0) ; CLEAR HI BYTE MOV G.CCCL(R1), CCL(R0) ; COPY INPUT COMMAND LENGTH MOVB G.CCFL(R1), FLAGS(R0) ; FLAGS BYTE CLRB FLAGS+1(R0) ; CLEAR HI BYTE MOVB G.CCTC(R1), TERM(R0) ; COPY TERMINATOR 50$: ENDPR .END