.TITLE GCMLB .IDENT /V 2.1/ ; ; Allow a fortran program to use command files ; .MCALL GCMLD$, GCMLB$, GCML$ ; DEFLUN=1 ;DEFAULT LUN IS ONE DEFBUF=-1 ;DEFAULT BUFFER ADDRESS -1 DEFSIZ=80. ;DEFAULT BUFFER SIZE ; ; BUFFER ADDRESS AND SIZE MUST BE SPECIFIED AS PARAMETERS ; WHEN THE ROUTINE IS CALLED ; ; ; CALL GCMLB (LUN, PROMPT, BUFFER, SIZE) ; ; LUN: LOGICAL UNIT NUMBER - NOTE: IF TERMINAL IS DESIRED ; TO ENTER INPUT, THIS LUN MUST BE ASSIGNED TO DEVICE ; TI: EITHER THROUGH THE PDS> ASSIGN OR THE ASSIGN ; LOGICAL UNIT DIRECTIVE, OR AT TASK BUILD TIME WITH ; THE ASG OPTION. (E.G. ASG=TI:1 FOR UNIT 1) ; ; ; PROMPT: A THREE BYTE PROMPT STRING ; ; ; BUFFER: A BYTE ARRAY, THIS PARAMETER IS MANDATORY ; ; SIZE: THE SIZE IN BYTES OF THE BUFFER. THIS PARAMETER ; MUST BE SPECIFIED AND SHOULD BE GREATER THAN ; OR EQUAL TO 82. BYTES. (NOTE: THE LAST TWO BYTES ; OF THE BUFFER ARE USED BY THE SYSTEM) ; GCMLD$ ;DEFINE LOCAL SYMBOLS G.BUFF=156 ;DEFINE BUFFER ADDRESS OFFSET GCM: GCMLB$ 2,XXX,DEFBUF,DEFLUN, ,DEFSIZ ;SET UP COMMAND LINE BLOCK ; .EVEN GCMLB:: CMP #4, (R5) ;PROPER NUMBER OF PARAMETERS? BEQ P1 ;YES RTS PC ;GET OUT P1: CMP 2(R5), #-1 ;HAS A LUN BEEN SPECIFIED? BEQ P2 ;LEAVE DEFAULT LUN MOVB @2(R5), GCM+F.LUN ;INSERT SPECIFIED LUN P2: CMP 4(R5), #-1 ;HAS A PROMPT BEEN SPECIFIED BEQ P3 ;LEAVE DEFAULT PROMPT MOV 4(R5), R0 ;ADDRESS OF PROMPT STRING MOV #, R1 ;ADDRESS OF GCMLB PROMPT STRING TST (R1)+ ;SKIP OVER AND MOV #3, R2 ;LENGTH OF PROMPT IS 3 BYTES 1$: MOVB (R0)+, (R1)+ ;COPY ONE BYTE OF PROMPT SOB R2, 1$ ;REPEAT UNTIL COPY FINISHED P3: MOV 6(R5), GCM+G.BUFF ;INSERT BUFFER ADDRESS P4: MOV @10(R5), R1 ;R1 CONTAINS BUFFER SIZE (IN BYTES) MOV R1, GCM+G.SIZE ;INSERT THE SPECIFIED SIZE SUB #2, R1 ;R1 NOW CONTAINS EFFECTIVE BUFFER SIZE CMP R1, #80. ;SEE IF WE SHOULD ALLOW CONTINUATION MODE BLE RTN ;SMALL BUFFER - NO CONTINUATION (DEFAULT) BISB #GE.CON, GCM+G.MODE;SET CONTINUATION BIT RTN: RTS PC ;COMMAND BLOCK INITIALIZED ; GCML::IGCML:: ; ; This entry point will transfer the command input to user program ; NOTE: IF THE ROUTINE COULD BE INSTALLED SO THAT IT RECEIVES AN MCR ; COMMAND LINE, GCML SHOULD BE CALLED AS A FUNCTION AND THE VALUE ; RETURNED IS THE OFFSET INTO THE BUFFER ARRAY AS TO WHERE THE ; ACTUAL COMMAND STARTS. IGCML WILL DEFAULT TO TYPE INTEGER FOR CONVIENCE ; ; ; CALL GCML (LENGTH, EOF, ERROR) ; OR- ; INTEGER GCML ; I = GCML (LENGTH, EOF, ERROR) ; OR- ; I = IGCML (LENGTH, EOF, ERROR) ; ; LENGTH: I*2 = LENGTH OF COMMAND LINE IN BYTES ; EOF: I*2 = .TRUE. IF USER ENTERS CTRL Z OR HAVE READ ; A COMMAND LINE FROM MCR ; ERROR: I*2 = VALUE OF ERROR OBTAINED FROM LOCATION G.ERR ; CLR @6(R5) ;CLEAR ERROR PARAMETER CLR @4(R5) ;CLEAR EOF PARAMETER GCML$ #GCM ;GET COMMAND LINE BCC OKAY ;ANY ERRORS? MOVB GCM+G.ERR, R1 ;ERROR IN R1 WITH SIGN EXTENDED MOV R1, @6(R5) ;RETURN ERROR CODE TO CALLING ROUTINE CMPB #GE.EOF, GCM+G.ERR ;CHECK FOR END OF INPUT BEQ EOF RTS PC EOF: DEC @4(R5) ;RETURN .TRUE. FOR END OF FILE RTS PC ; OKAY: MOV GCM+G.CMLD, R1 ;R1 CONTAINS LENGTH OF INPUT (BYTES) TST R1 ;CHECK FOR - OR 0 LENGTH BLE GCML ;GET ANOTHER COMMAND LINE MOV R1, @2(R5) ;RETURN LENGTH AS FIRST PARAMETER MOV GCM+G.CMLD+2, R0 ;ADDRESS OF BEGINNING OF COMMAND SUB GCM+G.BUFF, R0 ;R0 NOW CONTAINS OFFSET INC R0 ;FORTRAN ARRAYS START AT 1 RTS PC ;RETURN TO CALLING ROUTINE .END