; 0001 0 MODULE KERSYS (IDENT = '3.1.066' ; 0002 0 ) = ; 0003 1 BEGIN ; 0004 1 ; 0005 1 !++ ; 0006 1 ! FACILITY: ; 0007 1 ! KERMIT-32 ; 0008 1 ! ; 0009 1 ! ABSTRACT: ; 0010 1 ! KERMIT-32 is an implementation of the KERMIT protocal to allow the ; 0011 1 ! transfer of files from micro computers to the DECsystem-10, DECSYSTEM-20 ; 0012 1 ! and now the VAX/VMS systems. ; 0013 1 ! ; 0014 1 ! ENVIRONMENT: ; 0015 1 ! User mode ; 0016 1 ! ; 0017 1 ! AUTHOR: Robert C. McQueen, Nick Bush, CREATION DATE: 24-January-1983 ; 0018 1 ! ; 0019 1 ! MODIFIED BY: ; 0020 1 ! ; 0021 1 !-- ; 0022 1 ; 0023 1 %SBTTL 'Table of Contents' ; 0024 1 %SBTTL 'Revision History' ; 0025 1 ; 0026 1 !++ ; 0027 1 ! ; 0028 1 ! 2.0.032 By: Nick Bush On: 25-Feb-1984 ; 0029 1 ! Add code for LOCAL and REMOTE commands. These depend ; 0030 1 ! upon support in KERMSG and KERSYS. ; 0031 1 ! ; 0032 1 ! 3.0.045 Start of version 3. ; 0033 1 ! ; 0034 1 ! 3.1.057 By: Nick Bush On: 21-Feb-1985 ; 0035 1 ! Determine VMS version on startup and remember for later ; 0036 1 ! use. Use it in KERSYS to determine whether we will need ; 0037 1 ! to force an end-of-file on the mailbox when the subprocess ; 0038 1 ! on the other end goes away. ; 0039 1 ! ; 0040 1 ! 3.1.064 By: Nick Bush On: 30-March-1985 ; 0041 1 ! Fix LIB$SPAWN call to set SYS$INPUT for the subprocess ; 0042 1 ! to be NLA0: so that it doesn't try to input from the ; 0043 1 ! terminal. ; 0044 1 ! ; 0045 1 ! 3.1.066 By: Nick Bush On: 22-April-1985 ; 0046 1 ! Don't use NLA0: as SYS$INPUT when spawning things under VMS 3. ; 0047 1 !-- ; 0048 1 ; 0049 1 %SBTTL 'Include files' ; 0050 1 ! ; 0051 1 ! INCLUDE FILES: ; 0052 1 ! ; 0053 1 ; 0054 1 LIBRARY 'SYS$LIBRARY:STARLET'; ; 0055 1 ; 0056 1 LIBRARY 'SYS$LIBRARY:TPAMAC'; ; 0057 1 ; 0058 1 REQUIRE 'KERCOM'; ! Common definitions ; 0263 1 ; 0264 1 REQUIRE 'KERERR'; ! Error message symbol definitions ; 0329 1 ; 0330 1 %SBTTL 'Storage -- Local' ; 0331 1 ! ; 0332 1 ! OWN STORAGE: ; 0333 1 ! ; 0334 1 ; 0335 1 OWN ; 0336 1 VMS_VERSION, ! Major version number of VMS ; 0337 1 ORG_DEFAULT_DIR_TEXT : VECTOR [MAX_FILE_NAME, BYTE], ! Text of default dir ; 0338 1 ORG_DEFAULT_DIR : BLOCK [8, BYTE], ! Original default directory ; 0339 1 ORG_DEFAULT_DEV_TEXT : VECTOR [MAX_FILE_NAME, BYTE], ! Text of default device ; 0340 1 ORG_DEFAULT_DEV : BLOCK [8, BYTE], ! Descriptor for orginal default device ; 0341 1 TIMER_HANDLE; ! Handle for timer ; 0342 1 ; 0343 1 ! ; 0344 1 %SBTTL 'External routines' ; 0345 1 ! ; 0346 1 ! EXTERNAL REFERENCES: ; 0347 1 ! ; 0348 1 ; 0349 1 EXTERNAL ROUTINE ; 0350 1 ! ; 0351 1 ! Library routines ; 0352 1 ! ; 0353 1 LIB$SIGNAL : ADDRESSING_MODE (GENERAL) NOVALUE, ; 0354 1 LIB$INIT_TIMER : ADDRESSING_MODE (GENERAL), ; 0355 1 LIB$STAT_TIMER : ADDRESSING_MODE (GENERAL), ; 0356 1 LIB$EDIV : ADDRESSING_MODE (GENERAL), ; 0357 1 LIB$SPAWN : ADDRESSING_MODE (GENERAL), ; 0358 1 OTS$CVT_L_TZ : ADDRESSING_MODE (GENERAL) NOVALUE, ; 0359 1 LIB$SET_LOGICAL : ADDRESSING_MODE (GENERAL), ; 0360 1 SYS$SETDDIR : ADDRESSING_MODE (GENERAL), ; 0361 1 ! ; 0362 1 ! KERTT - Text processing ; 0363 1 ! ; 0364 1 TT_INIT : NOVALUE, ! Initialization routine ; 0365 1 TT_TEXT : NOVALUE, ! Output a text string ; 0366 1 TT_NUMBER : NOVALUE, ! Output a number ; 0367 1 TT_CHAR : NOVALUE, ! Output a single character ; 0368 1 TT_OUTPUT : NOVALUE, ! Routine to dump the current ; 0369 1 ! text line. ; 0370 1 TT_CRLF : NOVALUE; ! Output the line ; 0371 1 ; 0372 1 %SBTTL 'External storage' ; 0373 1 ! ; 0374 1 ! EXTERNAL Storage: ; 0375 1 ! ; 0376 1 ; 0377 1 EXTERNAL ; 0378 1 ! ; 0379 1 ! KERMSG storage ; 0380 1 ! ; 0381 1 GEN_1DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Data for generic command ; 0382 1 GEN_1SIZE, ! Size of data in GEN_1DATA ; 0383 1 GEN_2DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Second argument for generic command ; 0384 1 GEN_2SIZE, ! Size of data in GEN_2DATA ; 0385 1 GEN_3DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Third arg for generic command ; 0386 1 GEN_3SIZE, ! Size of data in GEN_3DATA ; 0387 1 ! ; 0388 1 ! Misc constants. ; 0389 1 ! ; 0390 1 FILE_SIZE, ! Number of characters in FILE_NAME ; 0391 1 FILE_NAME : VECTOR [CH$ALLOCATION (MAX_FILE_NAME)]; ; 0392 1 ; 0393 1 %SBTTL 'SY_INIT - Initialize KERSYS' ; 0394 1 ; 0395 1 GLOBAL ROUTINE SY_INIT : NOVALUE = ; 0396 1 ; 0397 1 !++ ; 0398 1 ! FUNCTIONAL DESCRIPTION: ; 0399 1 ! ; 0400 1 ! This routine will initialize the module KERSYS. ; 0401 1 ! ; 0402 1 ! CALLING SEQUENCE: ; 0403 1 ! ; 0404 1 ! SY_INIT (); ; 0405 1 ! ; 0406 1 ! INPUT PARAMETERS: ; 0407 1 ! ; 0408 1 ! None. ; 0409 1 ! ; 0410 1 ! IMPLICIT INPUTS: ; 0411 1 ! ; 0412 1 ! None. ; 0413 1 ! ; 0414 1 ! OUPTUT PARAMETERS: ; 0415 1 ! ; 0416 1 ! None. ; 0417 1 ! ; 0418 1 ! IMPLICIT OUTPUTS: ; 0419 1 ! ; 0420 1 ! None. ; 0421 1 ! ; 0422 1 ! COMPLETION CODES: ; 0423 1 ! ; 0424 1 ! None. ; 0425 1 ! ; 0426 1 ! SIDE EFFECTS: ; 0427 1 ! ; 0428 1 ! KERSYS storage initialized ; 0429 1 ! ; 0430 1 !-- ; 0431 1 ; 0432 2 BEGIN ; 0433 2 ; 0434 2 LITERAL ; 0435 2 SYI_EFN = 10; ! EFN to use for $GETSYI ; 0436 2 ; 0437 2 LOCAL ; 0438 2 VERSION_STRING : VECTOR [8, BYTE], ! Return version string here ; 0439 2 VERSION_LENGTH, ! And length here ; 0440 2 SYI_ITEM_LIST : BLOCK [16, BYTE], ! Argument list for $GETSYI ; 0441 2 LENGTH, ! Length of default dir returned ; 0442 2 STATUS; ; 0443 2 ! ; 0444 2 ! Set up arg list for $GETSYI ; 0445 2 ! ; 0446 2 SYI_ITEM_LIST [0, 0, 16, 0] = 8; ! We expect an 8-byte string ; 0447 2 SYI_ITEM_LIST [2, 0, 16, 0] = SYI$_VERSION; ! Want the VMS version ; 0448 2 SYI_ITEM_LIST [4, 0, 32, 0] = VERSION_STRING; ! Put it here ; 0449 2 SYI_ITEM_LIST [8, 0, 32, 0] = VERSION_LENGTH; ! Length goes here ; 0450 2 SYI_ITEM_LIST [12, 0, 32, 0] = 0; ! End the list ; 0451 2 STATUS = $GETSYI (EFN=SYI_EFN, ITMLST=SYI_ITEM_LIST); ! Get the data ; 0452 2 IF NOT .STATUS ! If we can't get the version ; 0453 2 THEN ; 0454 2 VMS_VERSION = 0 ! Assume very old VMS? ; 0455 2 ELSE ; 0456 3 BEGIN ; 0457 3 STATUS = $WAITFR (EFN=SYI_EFN); ! Wait for completion ; 0458 3 IF .STATUS ! If we got it ; 0459 3 THEN ; 0460 4 BEGIN ; 0461 4 IF .VERSION_STRING [0] GEQ %C'0' AND ; 0462 4 .VERSION_STRING [0] LEQ %C'9' ! If first character is numeric ; 0463 4 THEN ; 0464 4 VMS_VERSION = (.VERSION_STRING[0] - %C'0')*10 ! save first digit ; 0465 4 ELSE ; 0466 4 VMS_VERSION = 0; ! No first digit, store 0 ; 0467 4 VMS_VERSION = .VMS_VERSION + .VERSION_STRING[1] - %C'0' ! Get rest of version ; 0468 4 END ; 0469 3 ELSE ; 0470 3 VMS_VERSION = 0; ! Can't get version? ; 0471 2 END; ; 0472 2 ! ; 0473 2 ! Initialize the timer we will use ; 0474 2 ! ; 0475 2 TIMER_HANDLE = 0; ! Clear to get free block ; 0476 2 STATUS = LIB$INIT_TIMER (TIMER_HANDLE); ! Initialize ; 0477 2 ! ; 0478 2 ! Set up original default directory ; 0479 2 ! ; 0480 2 ORG_DEFAULT_DIR [DSC$B_CLASS] = DSC$K_CLASS_S; ; 0481 2 ORG_DEFAULT_DIR [DSC$B_DTYPE] = DSC$K_DTYPE_T; ; 0482 2 ORG_DEFAULT_DIR [DSC$W_LENGTH] = MAX_FILE_NAME; ; 0483 2 ORG_DEFAULT_DIR [DSC$A_POINTER] = ORG_DEFAULT_DIR_TEXT; ; 0484 2 STATUS = SYS$SETDDIR (0, LENGTH, ORG_DEFAULT_DIR); ; 0485 2 ; 0486 2 IF .STATUS THEN ORG_DEFAULT_DIR [DSC$W_LENGTH] = .LENGTH ELSE ORG_DEFAULT_DIR [DSC$W_LENGTH] = 0; ; 0487 2 ! ; 0488 2 ! Get original default device ; 0489 2 ! ; 0490 2 ORG_DEFAULT_DEV [DSC$B_CLASS] = DSC$K_CLASS_S; ; 0491 2 ORG_DEFAULT_DEV [DSC$B_DTYPE] = DSC$K_DTYPE_T; ; 0492 2 ORG_DEFAULT_DEV [DSC$W_LENGTH] = MAX_FILE_NAME; ; 0493 2 ORG_DEFAULT_DEV [DSC$A_POINTER] = ORG_DEFAULT_DEV_TEXT; ; 0494 2 STATUS = $TRNLOG (LOGNAM = %ASCID'SYS$DISK', RSLBUF = ORG_DEFAULT_DEV, RSLLEN = LENGTH); ; 0495 2 ; 0496 2 IF .STATUS THEN ORG_DEFAULT_DEV [DSC$W_LENGTH] = .LENGTH ELSE ORG_DEFAULT_DEV [DSC$W_LENGTH] = 0; ; 0497 2 ; 0498 1 END; ! End of SY_INIT .TITLE KERSYS .IDENT \3.1.066\ .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAB: .ASCII \SYS$DISK\ ; ; P.AAA: .LONG 17694728 ; ; .ADDRESS P.AAB ; ; .PSECT $OWN$,NOEXE,2 ;VMS_VERSION U.1: .BLKB 4 ;ORG_DEFAULT_DIR_TEXT U.2: .BLKB 132 ;ORG_DEFAULT_DIR U.3: .BLKB 8 ;ORG_DEFAULT_DEV_TEXT U.4: .BLKB 132 ;ORG_DEFAULT_DEV U.5: .BLKB 8 ;TIMER_HANDLE U.6: .BLKB 4 FNM_NORMAL== 1 FNM_FULL== 2 FNM_UNTRAN== 4 PR_MIN== 0 PR_NONE== 0 PR_MARK== 1 PR_EVEN== 2 PR_ODD== 3 PR_SPACE== 4 PR_MAX== 4 GC_MIN== 1 GC_EXIT== 1 GC_DIRECTORY== 2 GC_DISK_USAGE== 3 GC_DELETE== 4 GC_TYPE== 5 GC_HELP== 6 GC_LOGOUT== 7 GC_LGN== 8 GC_CONNECT== 9 GC_RENAME== 10 GC_COPY== 11 GC_WHO== 12 GC_SEND_MSG== 13 GC_STATUS== 14 GC_COMMAND== 15 GC_KERMIT== 16 GC_JOURNAL== 17 GC_VARIABLE== 18 GC_PROGRAM== 19 GC_MAX== 19 DP_FULL== 0 DP_HALF== 1 CHK_1CHAR== 49 CHK_2CHAR== 50 CHK_CRC== 51 MAX_MSG== 100 .EXTRN LIB$SIGNAL, LIB$INIT_TIMER, LIB$STAT_TIMER, LIB$EDIV, LIB$SPAWN, OTS$CVT_L_TZ, LIB$SET_LOGICAL .EXTRN SYS$SETDDIR, TT_INIT, TT_TEXT, TT_NUMBER, TT_CHAR, TT_OUTPUT, TT_CRLF, GEN_1DATA, GEN_1SIZE .EXTRN GEN_2DATA, GEN_2SIZE, GEN_3DATA, GEN_3SIZE, FILE_SIZE, FILE_NAME, SYS$GETSYI, SYS$WAITFR .EXTRN SYS$TRNLOG .PSECT $CODE$,NOWRT,2 .ENTRY SY_INIT, ^M ;SY_INIT, Save R2 ; 0395 MOVAB W^U.1, R2 ;U.1, R2 ; SUBL2 #32, SP ;#32, SP ; MOVL #268435464, 8(SP) ;#268435464, SYI_ITEM_LIST ; 0446 MOVAB 24(SP), 12(SP) ;VERSION_STRING, SYI_ITEM_LIST+4 ; 0448 MOVAB (SP), 16(SP) ;VERSION_LENGTH, SYI_ITEM_LIST+8 ; 0449 CLRL 20(SP) ;SYI_ITEM_LIST+12 ; 0450 CLRQ -(SP) ;-(SP) ; 0451 CLRL -(SP) ;-(SP) ; PUSHAB 20(SP) ;SYI_ITEM_LIST ; CLRQ -(SP) ;-(SP) ; PUSHL #10 ;#10 ; CALLS #7, G^SYS$GETSYI ;#7, SYS$GETSYI ; BLBC R0, 3$ ;STATUS, 3$ ; 0452 PUSHL #10 ;#10 ; 0457 CALLS #1, G^SYS$WAITFR ;#1, SYS$WAITFR ; BLBC R0, 3$ ;STATUS, 3$ ; 0458 CMPB 24(SP), #48 ;VERSION_STRING, #48 ; 0461 BLSSU 1$ ;1$ ; CMPB 24(SP), #57 ;VERSION_STRING, #57 ; 0462 BGTRU 1$ ;1$ ; MOVZBL 24(SP), R1 ;VERSION_STRING, R1 ; 0464 SUBL2 #48, R1 ;#48, R1 ; MULL3 #10, R1, (R2) ;#10, R1, VMS_VERSION ; BRB 2$ ;2$ ; 1$: CLRL (R2) ;VMS_VERSION ; 0466 2$: MOVZBL 25(SP), R1 ;VERSION_STRING+1, R1 ; 0467 ADDL2 (R2), R1 ;VMS_VERSION, R1 ; MOVAB -48(R1), (R2) ;-48(R1), VMS_VERSION ; BRB 4$ ;4$ ; 3$: CLRL (R2) ;VMS_VERSION ; 0470 4$: CLRL 284(R2) ;TIMER_HANDLE ; 0475 PUSHAB 284(R2) ;TIMER_HANDLE ; 0476 CALLS #1, G^LIB$INIT_TIMER ;#1, LIB$INIT_TIMER ; MOVL #17694852, 136(R2) ;#17694852, ORG_DEFAULT_DIR ; 0482 MOVAB 4(R2), 140(R2) ;ORG_DEFAULT_DIR_TEXT, ORG_DEFAULT_DIR+4 ; 0483 PUSHAB 136(R2) ;ORG_DEFAULT_DIR ; 0484 PUSHAB 8(SP) ;LENGTH ; CLRL -(SP) ;-(SP) ; CALLS #3, G^SYS$SETDDIR ;#3, SYS$SETDDIR ; BLBC R0, 5$ ;STATUS, 5$ ; 0486 MOVW 4(SP), 136(R2) ;LENGTH, ORG_DEFAULT_DIR ; BRB 6$ ;6$ ; 5$: CLRW 136(R2) ;ORG_DEFAULT_DIR ; 6$: MOVL #17694852, 276(R2) ;#17694852, ORG_DEFAULT_DEV ; 0492 MOVAB 144(R2), 280(R2) ;ORG_DEFAULT_DEV_TEXT, ORG_DEFAULT_DEV+4 ; 0493 CLRQ -(SP) ;-(SP) ; 0494 CLRL -(SP) ;-(SP) ; PUSHAB 276(R2) ;ORG_DEFAULT_DEV ; PUSHAB 20(SP) ;LENGTH ; PUSHAB W^P.AAA ;P.AAA ; CALLS #6, G^SYS$TRNLOG ;#6, SYS$TRNLOG ; BLBC R0, 7$ ;STATUS, 7$ ; 0496 MOVW 4(SP), 276(R2) ;LENGTH, ORG_DEFAULT_DEV ; RET ; ; 7$: CLRW 276(R2) ;ORG_DEFAULT_DEV ; RET ; ; 0498 ; Routine Size: 219 bytes, Routine Base: $CODE$ + 0000 ; 0499 1 ; 0500 1 %SBTTL 'SY_LOGOUT - delete the process.' ; 0501 1 ; 0502 1 GLOBAL ROUTINE SY_LOGOUT : NOVALUE = ; 0503 1 ; 0504 1 !++ ; 0505 1 ! FUNCTIONAL DESCRIPTION: ; 0506 1 ! ; 0507 1 ! This routine will delete this process. ; 0508 1 ! ; 0509 1 ! CALLING SEQUENCE: ; 0510 1 ! ; 0511 1 ! SY_LOGOUT (); ; 0512 1 ! ; 0513 1 ! INPUT PARAMETERS: ; 0514 1 ! ; 0515 1 ! None. ; 0516 1 ! ; 0517 1 ! IMPLICIT INPUTS: ; 0518 1 ! ; 0519 1 ! None. ; 0520 1 ! ; 0521 1 ! OUTPUT PARAMETERS: ; 0522 1 ! ; 0523 1 ! None. ; 0524 1 ! ; 0525 1 ! IMPLICIT OUTPUTS: ; 0526 1 ! ; 0527 1 ! None. ; 0528 1 ! ; 0529 1 ! COMPLETION CODES: ; 0530 1 ! ; 0531 1 ! None. ; 0532 1 ! ; 0533 1 ! SIDE EFFECTS: ; 0534 1 ! ; 0535 1 ! None. ; 0536 1 ! ; 0537 1 !-- ; 0538 1 ; 0539 2 BEGIN ; 0540 2 $DELPRC (); ; 0541 1 END; ! End of SY_LOGOUT .EXTRN SYS$DELPRC .ENTRY SY_LOGOUT, ^M<> ;SY_LOGOUT, Save nothing ; 0502 CLRQ -(SP) ;-(SP) ; 0540 CALLS #2, G^SYS$DELPRC ;#2, SYS$DELPRC ; RET ; ; 0541 ; Routine Size: 12 bytes, Routine Base: $CODE$ + 00DB ; 0542 1 ; 0543 1 %SBTTL 'SY_GENERIC - Perform a generic command' ; 0544 1 ; 0545 1 GLOBAL ROUTINE SY_GENERIC (GCMD_TYPE, STRING_ADDRESS, STRING_LENGTH, GET_CHR_RTN) = ; 0546 1 ; 0547 1 !++ ; 0548 1 ! FUNCTIONAL DESCRIPTION: ; 0549 1 ! ; 0550 1 ! This routine will perform a generic command. ; 0551 1 ! ; 0552 1 ! CALLING SEQUENCE: ; 0553 1 ! ; 0554 1 ! SY_GENERIC (GCMD_TYPE, STRING_ADDRESS, STRING_LENGTH, GET_CHR_RTN); ; 0555 1 ! ; 0556 1 ! INPUT PARAMETERS: ; 0557 1 ! ; 0558 1 ! GCMD_TYPE - GC_xxx value for command to be performed ; 0559 1 ! STRING_ADDRESS - Place to return address of string result ; 0560 1 ! STRING_LENGTH - Place to return length of string result ; 0561 1 ! GET_CHR_RTN - Place to return address of a get a character routine ; 0562 1 ! ; 0563 1 ! IMPLICIT INPUTS: ; 0564 1 ! ; 0565 1 ! None. ; 0566 1 ! ; 0567 1 ! OUTPUT PARAMETERS: ; 0568 1 ! ; 0569 1 ! Returns KER_xxx status ; 0570 1 ! ; 0571 1 ! IMPLICIT OUTPUTS: ; 0572 1 ! ; 0573 1 ! None. ; 0574 1 ! ; 0575 1 ! COMPLETION CODES: ; 0576 1 ! ; 0577 1 ! None. ; 0578 1 ! ; 0579 1 ! SIDE EFFECTS: ; 0580 1 ! ; 0581 1 ! None. ; 0582 1 ! ; 0583 1 !-- ; 0584 1 ; 0585 2 BEGIN ; 0586 2 ; 0587 2 LITERAL ; 0588 2 MAX_CMD_LEN = 2*MAX_MSG, ! Max command length ; 0589 2 MAX_MBX_LEN = 20; ! Max mailbox name length ; 0590 2 ; 0591 2 OWN ; 0592 2 RSP_TEXT : VECTOR [MAX_CMD_LEN, BYTE], ! Return text ; 0593 2 RSP_LEN; ! Length of return text ; 0594 2 ; 0595 2 LOCAL ; 0596 2 STATUS, ! Status results ; 0597 2 FLAGS, ! Flag word for LIB$SPAWN ; 0598 2 OUR_PID, ! Our PID value ; 0599 2 ITMLST : VECTOR [4, LONG], ! GETJPI argument ; 0600 2 POINTER, ! Character pointer ; 0601 2 MBX_CHAN, ! Channel for mail box ; 0602 2 COMMAND_LENGTH, ! Length of command string ; 0603 2 COMMAND_DESC : BLOCK [8, BYTE], ! Descriptor for command string ; 0604 2 COMMAND_STR : VECTOR [MAX_CMD_LEN, BYTE], ! Actual command string ; 0605 2 MBX_DESC : BLOCK [8, BYTE], ! Mailbox equivalence name ; 0606 2 MBX_NAME : VECTOR [MAX_MBX_LEN, BYTE]; ! Storage for MBX name ; 0607 2 ; 0608 2 ROUTINE PROCESS_COMPLETION_AST (MBX_CHAN) = ; 0609 2 ! ; 0610 2 ! This routine is called upon process completion (of the process we spawned ; 0611 2 ! to perform the command). It will ensure that the mailbox gets an end-of-file. ; 0612 2 ! ; 0613 3 BEGIN ; 0614 3 RETURN $QIO (CHAN = .MBX_CHAN, FUNC = IO$_WRITEOF); ! Write the EOF ; 0615 2 END; .PSECT $OWN$,NOEXE,2 ;RSP_TEXT U.10: .BLKB 200 ;RSP_LEN U.11: .BLKB 4 .EXTRN SYS$QIO .PSECT $CODE$,NOWRT,2 ;PROCESS_COMPLETION_AST U.12: .WORD ^M<> ;Save nothing ; 0608 CLRQ -(SP) ;-(SP) ; 0614 CLRQ -(SP) ;-(SP) ; CLRQ -(SP) ;-(SP) ; CLRQ -(SP) ;-(SP) ; MOVQ #40, -(SP) ;#40, -(SP) ; PUSHL 4(AP) ;MBX_CHAN ; CLRL -(SP) ;-(SP) ; CALLS #12, G^SYS$QIO ;#12, SYS$QIO ; RET ; ; 0615 ; Routine Size: 26 bytes, Routine Base: $CODE$ + 00E7 ; 0616 2 ROUTINE CONCAT (SRC_ADR, SRC_LEN, DST_PTR, DST_LEN) : NOVALUE = ; 0617 2 ! ; 0618 2 ! This routine is called to concatenate a string onto the current string ; 0619 2 ! ; 0620 3 BEGIN ; 0621 3 ; 0622 3 LOCAL ; 0623 3 LENGTH; ! Length we will actually move ; 0624 3 ; 0625 3 LENGTH = .SRC_LEN; ! Get total length ; 0626 3 ; 0627 3 IF .LENGTH GTR MAX_CMD_LEN - ..DST_LEN THEN LENGTH = MAX_CMD_LEN - ..DST_LEN; ; 0628 3 ; 0629 3 CH$MOVE (.LENGTH, CH$PTR (.SRC_ADR), ..DST_PTR); ; 0630 3 .DST_PTR = CH$PLUS (.LENGTH, ..DST_PTR); ; 0631 3 .DST_LEN = ..DST_LEN + .LENGTH; ! Update length ; 0632 2 END; ;CONCAT U.13: .WORD ^M ;Save R2,R3,R4,R5,R6,R7 ; 0616 MOVL 8(AP), R7 ;SRC_LEN, LENGTH ; 0625 SUBL3 #200, @16(AP), R1 ;#200, @DST_LEN, R1 ; 0627 MNEGL R1, R0 ;R1, R0 ; CMPL R7, R0 ;LENGTH, R0 ; BLEQ 1$ ;1$ ; MNEGL R1, R7 ;R1, LENGTH ; 1$: MOVL 12(AP), R6 ;DST_PTR, R6 ; 0629 MOVC3 R7, @4(AP), @0(R6) ;LENGTH, @SRC_ADR, @0(R6) ; ADDL2 R7, (R6) ;LENGTH, (R6) ; 0630 ADDL2 R7, @16(AP) ;LENGTH, @DST_LEN ; 0631 RET ; ; 0632 ; Routine Size: 44 bytes, Routine Base: $CODE$ + 0101 ; 0633 2 ! ; 0634 2 ! Initialize the command descriptor ; 0635 2 ! ; 0636 2 COMMAND_DESC [DSC$B_CLASS] = DSC$K_CLASS_S; ; 0637 2 COMMAND_DESC [DSC$B_DTYPE] = DSC$K_DTYPE_T; ; 0638 2 COMMAND_LENGTH = 0; ! Nothing here yet ; 0639 2 COMMAND_DESC [DSC$A_POINTER] = COMMAND_STR; ! Point at string storage ; 0640 2 POINTER = CH$PTR (COMMAND_STR); ; 0641 2 ! ; 0642 2 ! Determine what to do with the command ; 0643 2 ! ; 0644 2 ; 0645 2 CASE .GCMD_TYPE FROM GC_MIN TO GC_MAX OF ; 0646 2 SET ; 0647 2 ; 0648 2 [GC_COPY] : ; 0649 3 BEGIN ; 0650 3 ; 0651 3 EXTERNAL ; 0652 3 GEN_COPY_CMD : BLOCK [8, BYTE]; ; 0653 3 ; 0654 3 CONCAT (.GEN_COPY_CMD [DSC$A_POINTER], .GEN_COPY_CMD [DSC$W_LENGTH], POINTER, COMMAND_LENGTH); ; 0655 3 CONCAT (GEN_1DATA, .GEN_1SIZE, POINTER, COMMAND_LENGTH); ; 0656 3 CONCAT (UPLIT (%ASCII' '), 1, POINTER, COMMAND_LENGTH); ; 0657 3 CONCAT (GEN_2DATA, .GEN_2SIZE, POINTER, COMMAND_LENGTH); ; 0658 2 END; ; 0659 2 ; 0660 2 [GC_CONNECT] : ; 0661 3 BEGIN ; 0662 3 ; 0663 3 LOCAL ; 0664 3 LENGTH, ; 0665 3 DIR_FAB : $FAB_DECL, ! FAB for $PARSE ; 0666 3 DIR_NAM : $NAM_DECL, ! NAM for $PARSE ; 0667 3 EXP_STR : VECTOR [NAM$C_MAXRSS, BYTE], ! Expanded file spec ; 0668 3 DEV_DESC : BLOCK [8, BYTE], ! Descriptor for device name ; 0669 3 DIR_DESC : BLOCK [8, BYTE]; ; 0670 3 ; 0671 3 DIR_DESC [DSC$B_CLASS] = DSC$K_CLASS_S; ; 0672 3 DIR_DESC [DSC$B_DTYPE] = DSC$K_DTYPE_T; ; 0673 3 DEV_DESC [DSC$B_CLASS] = DSC$K_CLASS_S; ; 0674 3 DEV_DESC [DSC$B_DTYPE] = DSC$K_DTYPE_T; ; 0675 3 ; 0676 3 IF .GEN_1SIZE GTR 0 ; 0677 3 THEN ; 0678 4 BEGIN ; 0679 4 $FAB_INIT (FAB = DIR_FAB, FOP = NAM, NAM = DIR_NAM, FNA = GEN_1DATA, FNS = .GEN_1SIZE); ; 0680 4 $NAM_INIT (NAM = DIR_NAM, ESA = EXP_STR, ESS = NAM$C_MAXRSS); ; 0681 4 STATUS = $PARSE (FAB = DIR_FAB); ; 0682 4 ; 0683 4 IF NOT .STATUS ; 0684 4 THEN ; 0685 5 BEGIN ; 0686 5 LIB$SIGNAL (.STATUS); ; 0687 5 RETURN .STATUS; ; 0688 4 END; ; 0689 4 ; 0690 4 IF .DIR_NAM [NAM$B_NODE] GTR 0 ; 0691 4 THEN ; 0692 5 BEGIN ; 0693 5 DEV_DESC [DSC$A_POINTER] = .DIR_NAM [NAM$L_NODE]; ; 0694 5 DEV_DESC [DSC$W_LENGTH] = .DIR_NAM [NAM$B_NODE] + .DIR_NAM [NAM$B_DEV]; ; 0695 5 END ; 0696 4 ELSE ; 0697 5 BEGIN ; 0698 5 DEV_DESC [DSC$W_LENGTH] = .DIR_NAM [NAM$B_DEV]; ; 0699 5 DEV_DESC [DSC$A_POINTER] = .DIR_NAM [NAM$L_DEV]; ; 0700 4 END; ; 0701 4 ; 0702 4 DIR_DESC [DSC$W_LENGTH] = .DIR_NAM [NAM$B_DIR]; ; 0703 4 DIR_DESC [DSC$A_POINTER] = .DIR_NAM [NAM$L_DIR]; ; 0704 4 END ; 0705 3 ELSE ; 0706 4 BEGIN ; 0707 4 DIR_DESC [DSC$W_LENGTH] = .ORG_DEFAULT_DIR [DSC$W_LENGTH]; ; 0708 4 DIR_DESC [DSC$A_POINTER] = .ORG_DEFAULT_DIR [DSC$A_POINTER]; ; 0709 4 DEV_DESC [DSC$W_LENGTH] = .ORG_DEFAULT_DEV [DSC$W_LENGTH]; ; 0710 4 DEV_DESC [DSC$A_POINTER] = .ORG_DEFAULT_DEV [DSC$A_POINTER]; ; 0711 3 END; ; 0712 3 ; 0713 3 STATUS = LIB$SET_LOGICAL (%ASCID'SYS$DISK', DEV_DESC); ; 0714 3 ; 0715 3 IF NOT .STATUS ; 0716 3 THEN ; 0717 4 BEGIN ; 0718 4 LIB$SIGNAL (.STATUS); ; 0719 4 RETURN .STATUS; ; 0720 3 END; ; 0721 3 ; 0722 3 STATUS = SYS$SETDDIR (DIR_DESC, 0, 0); ; 0723 3 ; 0724 3 IF NOT .STATUS ; 0725 3 THEN ; 0726 4 BEGIN ; 0727 4 LIB$SIGNAL (.STATUS); ; 0728 4 RETURN .STATUS; ; 0729 3 END; ; 0730 3 ; 0731 3 DIR_DESC [DSC$A_POINTER] = GEN_1DATA; ; 0732 3 DIR_DESC [DSC$W_LENGTH] = MAX_MSG; ; 0733 3 STATUS = SYS$SETDDIR (0, DIR_DESC [DSC$W_LENGTH], DIR_DESC); ; 0734 3 ; 0735 3 IF NOT .STATUS ; 0736 3 THEN ; 0737 4 BEGIN ; 0738 4 LIB$SIGNAL (.STATUS); ; 0739 4 RETURN .STATUS; ; 0740 3 END; ; 0741 3 ; 0742 3 POINTER = CH$PTR (RSP_TEXT); ; 0743 3 RSP_LEN = 0; ; 0744 3 CONCAT (UPLIT (%ASCII'Default directory set to '), 25, POINTER, RSP_LEN); ; 0745 3 CONCAT (.DEV_DESC [DSC$A_POINTER], .DEV_DESC [DSC$W_LENGTH], POINTER, RSP_LEN); ; 0746 3 CONCAT (.DIR_DESC [DSC$A_POINTER], .DIR_DESC [DSC$W_LENGTH], POINTER, RSP_LEN); ; 0747 3 .STRING_ADDRESS = RSP_TEXT; ; 0748 3 .STRING_LENGTH = .RSP_LEN; ; 0749 3 RETURN KER_NORMAL; ; 0750 2 END; ; 0751 2 ; 0752 2 [GC_DELETE] : ; 0753 3 BEGIN ; 0754 3 ; 0755 3 EXTERNAL ; 0756 3 GEN_DELETE_CMD : BLOCK [8, BYTE]; ; 0757 3 ; 0758 3 CONCAT (.GEN_DELETE_CMD [DSC$A_POINTER], .GEN_DELETE_CMD [DSC$W_LENGTH], POINTER, COMMAND_LENGTH); ; 0759 3 CONCAT (GEN_1DATA, .GEN_1SIZE, POINTER, COMMAND_LENGTH); ; 0760 2 END; ; 0761 2 ; 0762 2 [GC_DIRECTORY] : ; 0763 3 BEGIN ; 0764 3 ; 0765 3 EXTERNAL ; 0766 3 GEN_DIR_CMD : BLOCK [8, BYTE]; ; 0767 3 ; 0768 3 CONCAT (.GEN_DIR_CMD [DSC$A_POINTER], .GEN_DIR_CMD [DSC$W_LENGTH], POINTER, COMMAND_LENGTH); ; 0769 3 CONCAT (GEN_1DATA, .GEN_1SIZE, POINTER, COMMAND_LENGTH); ; 0770 2 END; ; 0771 2 ; 0772 2 [GC_DISK_USAGE] : ; 0773 3 BEGIN ; 0774 3 ; 0775 3 EXTERNAL ; 0776 3 GEN_USG_CMD : BLOCK [8, BYTE], ! Command without arg ; 0777 3 GEN_USG_ARG_CMD : BLOCK [8, BYTE]; ! Command with arg ; 0778 3 ; 0779 3 IF .GEN_1SIZE LEQ 0 ; 0780 3 THEN ; 0781 4 BEGIN ; 0782 4 CONCAT (.GEN_USG_CMD [DSC$A_POINTER], .GEN_USG_CMD [DSC$W_LENGTH], POINTER, COMMAND_LENGTH); ; 0783 4 END ; 0784 3 ELSE ; 0785 4 BEGIN ; 0786 4 CONCAT (.GEN_USG_ARG_CMD [DSC$A_POINTER], .GEN_USG_ARG_CMD [DSC$W_LENGTH], POINTER, ; 0787 4 COMMAND_LENGTH); ; 0788 4 CONCAT (GEN_1DATA, .GEN_1SIZE, POINTER, COMMAND_LENGTH); ; 0789 3 END; ; 0790 3 ; 0791 2 END; ; 0792 2 ; 0793 2 [GC_HELP] : ; 0794 3 BEGIN ; 0795 3 ; 0796 3 EXTERNAL ; 0797 3 GEN_HELP_TEXT : BLOCK [8, BYTE]; ; 0798 3 ; 0799 3 .STRING_ADDRESS = .GEN_HELP_TEXT [DSC$A_POINTER]; ; 0800 3 .STRING_LENGTH = .GEN_HELP_TEXT [DSC$W_LENGTH]; ; 0801 3 RETURN KER_NORMAL; ; 0802 2 END; ; 0803 2 ; 0804 2 [GC_RENAME] : ; 0805 3 BEGIN ; 0806 3 ; 0807 3 EXTERNAL ; 0808 3 GEN_REN_CMD : BLOCK [8, BYTE]; ; 0809 3 ; 0810 3 CONCAT (.GEN_REN_CMD [DSC$A_POINTER], .GEN_REN_CMD [DSC$W_LENGTH], POINTER, COMMAND_LENGTH); ; 0811 3 CONCAT (GEN_1DATA, .GEN_1SIZE, POINTER, COMMAND_LENGTH); ; 0812 3 CONCAT (UPLIT (%ASCII' '), 1, POINTER, COMMAND_LENGTH); ; 0813 3 CONCAT (GEN_2DATA, .GEN_2SIZE, POINTER, COMMAND_LENGTH); ; 0814 2 END; ; 0815 2 ; 0816 2 [GC_SEND_MSG] : ; 0817 3 BEGIN ; 0818 3 ; 0819 3 EXTERNAL ; 0820 3 GEN_SEND_CMD : BLOCK [8, BYTE]; ; 0821 3 ; 0822 3 CONCAT (.GEN_SEND_CMD [DSC$A_POINTER], .GEN_SEND_CMD [DSC$W_LENGTH], POINTER, COMMAND_LENGTH); ; 0823 3 CONCAT (GEN_1DATA, .GEN_1SIZE, POINTER, COMMAND_LENGTH); ; 0824 3 CONCAT (UPLIT (%ASCII' "'), 2, POINTER, COMMAND_LENGTH); ; 0825 3 CONCAT (GEN_2DATA, .GEN_2SIZE, POINTER, COMMAND_LENGTH); ; 0826 3 CONCAT (UPLIT (%ASCII'"'), 1, POINTER, COMMAND_LENGTH); ; 0827 2 END; ; 0828 2 ; 0829 2 [GC_TYPE] : ; 0830 2 ! ; 0831 2 ! While KERMSG handles this for server requests, COMND_LOCAL in KERMIT does ; 0832 2 ! not. Therefore, set up the request to open the correct file. ; 0833 2 ! ; 0834 3 BEGIN ; 0835 3 CH$COPY (.GEN_1SIZE, GEN_1DATA, CHR_NUL, MAX_FILE_NAME, FILE_NAME); ; 0836 3 FILE_SIZE = .GEN_1SIZE; ; 0837 3 RETURN KER_NORMAL; ; 0838 2 END; ; 0839 2 ; 0840 2 [GC_WHO] : ; 0841 3 BEGIN ; 0842 3 ; 0843 3 EXTERNAL ; 0844 3 GEN_WHO_CMD : BLOCK [8, BYTE]; ; 0845 3 ; 0846 3 CONCAT (.GEN_WHO_CMD [DSC$A_POINTER], .GEN_WHO_CMD [DSC$W_LENGTH], POINTER, COMMAND_LENGTH); ; 0847 3 CONCAT (GEN_1DATA, .GEN_1SIZE, POINTER, COMMAND_LENGTH); ; 0848 3 CONCAT (GEN_2DATA, .GEN_2SIZE, POINTER, COMMAND_LENGTH); ; 0849 2 END; ; 0850 2 ; 0851 2 [GC_COMMAND] : ; 0852 2 ! Host command. Just pass it to the process ; 0853 2 CONCAT (GEN_1DATA, .GEN_1SIZE, POINTER, COMMAND_LENGTH); ; 0854 2 ; 0855 2 [INRANGE, OUTRANGE] : ; 0856 3 BEGIN ; 0857 3 LIB$SIGNAL (KER_UNIMPLGEN); ; 0858 3 RETURN KER_UNIMPLGEN; ! We don't do any ; 0859 2 END; ; 0860 2 TES; ; 0861 2 ; 0862 2 ! ; 0863 2 ! If we fall out of the case statement, we need to create a mailbox and ; 0864 2 ! spawn a process to perform the command with its output going to the ; 0865 2 ! mailbox ; 0866 2 ! ; 0867 2 COMMAND_DESC [DSC$W_LENGTH] = .COMMAND_LENGTH; ! Copy command length ; 0868 2 ITMLST [0] = JPI$_PID^16 + 4; ! Get PID ; 0869 2 ITMLST [1] = OUR_PID; ! Into OUR_PID ; 0870 2 ITMLST [2] = ITMLST [2]; ! Get length here ; 0871 2 ITMLST [3] = 0; ! End of list ; 0872 2 $GETJPI (ITMLST = ITMLST); ! Get info for us ; 0873 2 CH$COPY (11, CH$PTR (UPLIT (%ASCII'KERMIT$MBX_')), CHR_NUL, ! Build name ; 0874 2 MAX_MBX_LEN, CH$PTR (MBX_NAME)); ! for mailbox ; 0875 2 MBX_DESC [DSC$B_CLASS] = DSC$K_CLASS_S; ; 0876 2 MBX_DESC [DSC$B_DTYPE] = DSC$K_DTYPE_T; ; 0877 2 MBX_DESC [DSC$W_LENGTH] = MAX_MBX_LEN - 12; ! MBX name length ; 0878 2 MBX_DESC [DSC$A_POINTER] = MBX_NAME + 11; ! Where to build rest of name ; 0879 2 OTS$CVT_L_TZ (OUR_PID, MBX_DESC, MAX_MBX_LEN - 12); ! Generate rest of name ; 0880 2 MBX_DESC [DSC$W_LENGTH] = MAX_MBX_LEN - 1; ! Set total length for create ; 0881 2 MBX_DESC [DSC$A_POINTER] = MBX_NAME; ! Point at start of name ; 0882 2 STATUS = $CREMBX (CHAN = MBX_CHAN, LOGNAM = MBX_DESC); ; 0883 2 ; 0884 2 IF NOT .STATUS ; 0885 2 THEN ; 0886 3 BEGIN ; 0887 3 LIB$SIGNAL (.STATUS); ; 0888 3 RETURN .STATUS; ; 0889 2 END; ; 0890 2 ; 0891 2 MBX_NAME [MAX_MBX_LEN - 1] = %C':'; ! Terminate with colon ; 0892 2 MBX_DESC [DSC$W_LENGTH] = MAX_MBX_LEN; ! Set total length including colon ; 0893 2 CH$COPY (MAX_MBX_LEN - 1, CH$PTR (MBX_NAME), CHR_NUL, MAX_FILE_NAME, CH$PTR (FILE_NAME)); ; 0894 2 FILE_SIZE = MAX_MBX_LEN - 1; ! Set up FILE_NAME ; 0895 2 FLAGS = 1; ! Don't wait for process ; 0896 2 STATUS = LIB$SPAWN ( ! Spawn a DCL subprocess ; 0897 2 COMMAND_DESC, ! to do this command ; 0898 3 (IF .VMS_VERSION LEQ 3 ! If old VMS ; 0899 3 THEN ; 0900 3 0 ! Then no SYS$INPUT arg ; 0901 3 ELSE ; 0902 2 %ASCID'NLA0:'), ! no SYS$INPUT ; 0903 2 MBX_DESC, ! set SYS$OUTPUT to mailbox ; 0904 2 FLAGS, ! don't wait for process to complete ; 0905 2 0, ! Process name ; 0906 2 0, ! process id ; 0907 2 0, ! completion status ; 0908 2 0, ! ? ; 0909 3 (IF .VMS_VERSION LEQ 3 ! If VMS 3 or earlier ; 0910 3 THEN ; 0911 3 PROCESS_COMPLETION_AST ! We need to force eof ; 0912 3 ELSE ! when process finishes ; 0913 2 0), ! 4.0 and on we get one free ; 0914 2 .MBX_CHAN); ! feed ast routine this value ; 0915 2 ; 0916 2 IF NOT .STATUS THEN LIB$SIGNAL (.STATUS); ; 0917 2 ; 0918 2 RETURN .STATUS; ; 0919 1 END; ! End of SY_GENERIC .PSECT $PLIT$,NOWRT,NOEXE,2 P.AAC: .ASCII \ \<0><0><0> ; ; P.AAE: .ASCII \SYS$DISK\ ; ; P.AAD: .LONG 17694728 ; ; .ADDRESS P.AAE ; ; P.AAF: .ASCII \Default directory set to \<0><0><0> ; ; P.AAG: .ASCII \ \<0><0><0> ; ; P.AAH: .ASCII \ "\<0><0> ; ; P.AAI: .ASCII \"\<0><0><0> ; ; P.AAJ: .ASCII \KERMIT$MBX_\<0> ; ; P.AAL: .ASCII \NLA0:\<0><0><0> ; ; P.AAK: .LONG 17694725 ; ; .ADDRESS P.AAL ; ; .EXTRN GEN_COPY_CMD, SYS$PARSE, GEN_DELETE_CMD, GEN_DIR_CMD, GEN_USG_CMD, GEN_USG_ARG_CMD .EXTRN GEN_HELP_TEXT, GEN_REN_CMD, GEN_SEND_CMD, GEN_WHO_CMD, SYS$GETJPI, SYS$CREMBX .PSECT $CODE$,NOWRT,2 .ENTRY SY_GENERIC, ^M ; ; MOVAB W^P.AAC, R11 ;P.AAC, R11 ; MOVAB W^GEN_1DATA, R10 ;GEN_1DATA, R10 ; MOVAB W^GEN_1SIZE, R9 ;GEN_1SIZE, R9 ; MOVAB W^U.11, R8 ;U.11, R8 ; MOVAB B^U.13, R7 ;U.13, R7 ; MOVAB -716(SP), SP ;-716(SP), SP ; MOVW #270, -22(FP) ;#270, COMMAND_DESC+2 ; 0637 CLRL -(SP) ;COMMAND_LENGTH ; 0638 MOVAB -224(FP), -20(FP) ;COMMAND_STR, COMMAND_DESC+4 ; 0639 MOVAB -224(FP), 4(SP) ;COMMAND_STR, POINTER ; 0640 CASEL 4(AP), #1, #18 ;GCMD_TYPE, #1, #18 ; 0645 1$: .WORD 2$-1$,- ;2$-1$,- ; 14$-1$,- ;14$-1$,- ; 15$-1$,- ;15$-1$,- ; 13$-1$,- ;13$-1$,- ; 22$-1$,- ;22$-1$,- ; 18$-1$,- ;18$-1$,- ; 2$-1$,- ;2$-1$,- ; 2$-1$,- ;2$-1$,- ; 4$-1$,- ;4$-1$,- ; 20$-1$,- ;20$-1$,- ; 3$-1$,- ;3$-1$,- ; 24$-1$,- ;24$-1$,- ; 21$-1$,- ;21$-1$,- ; 2$-1$,- ;2$-1$,- ; 26$-1$,- ;26$-1$,- ; 2$-1$,- ;2$-1$,- ; 2$-1$,- ;2$-1$,- ; 2$-1$,- ;2$-1$,- ; 2$-1$ ;2$-1$ ; 2$: PUSHL #134316210 ;#134316210 ; 0857 CALLS #1, G^LIB$SIGNAL ;#1, LIB$SIGNAL ; MOVL #134316210, R0 ;#134316210, R0 ; 0858 RET ; ; 3$: PUSHL SP ;SP ; 0654 PUSHAB 8(SP) ;POINTER ; MOVZWL W^GEN_COPY_CMD, -(SP) ;GEN_COPY_CMD, -(SP) ; PUSHL W^GEN_COPY_CMD+4 ;GEN_COPY_CMD+4 ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0655 PUSHAB 8(SP) ;POINTER ; PUSHL (R9) ;GEN_1SIZE ; PUSHL R10 ;R10 ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0656 PUSHAB 8(SP) ;POINTER ; PUSHL #1 ;#1 ; PUSHL R11 ;R11 ; BRW 25$ ;25$ ; 4$: MOVW #270, 22(SP) ;#270, DIR_DESC+2 ; 0672 MOVW #270, 30(SP) ;#270, DEV_DESC+2 ; 0674 MOVL (R9), R6 ;GEN_1SIZE, R6 ; 0676 BGTR 5$ ;5$ ; BRW 8$ ;8$ ; 5$: MOVC5 #0, (SP), #0, #80, -332(FP) ;#0, (SP), #0, #80, $RMS_PTR ; 0679 MOVW #20483, -332(FP) ;#20483, $RMS_PTR ; MOVL #16777216, -328(FP) ;#16777216, $RMS_PTR+4 ; MOVB #2, -310(FP) ;#2, $RMS_PTR+22 ; MOVB #2, -301(FP) ;#2, $RMS_PTR+31 ; MOVAB 292(SP), -292(FP) ;DIR_NAM, $RMS_PTR+40 ; MOVAB (R10), -288(FP) ;GEN_1DATA, $RMS_PTR+44 ; MOVB R6, -280(FP) ;R6, $RMS_PTR+52 ; MOVC5 #0, (SP), #0, #96, 292(SP) ;#0, (SP), #0, #96, $RMS_PTR ; 0680 MOVW #24578, 292(SP) ;#24578, $RMS_PTR ; MNEGB #1, 302(SP) ;#1, $RMS_PTR+10 ; MOVAB 36(SP), 304(SP) ;EXP_STR, $RMS_PTR+12 ; PUSHAB -332(FP) ;DIR_FAB ; 0681 CALLS #1, G^SYS$PARSE ;#1, SYS$PARSE ; MOVL R0, R6 ;R0, STATUS ; BLBC R6, 10$ ;STATUS, 10$ ; 0683 MOVZBL 348(SP), R0 ;DIR_NAM+56, R0 ; 0690 BLEQ 6$ ;6$ ; MOVL 356(SP), 32(SP) ;DIR_NAM+64, DEV_DESC+4 ; 0693 MOVZBL 349(SP), R1 ;DIR_NAM+57, R1 ; 0694 ADDW3 R1, R0, 28(SP) ;R1, R0, DEV_DESC ; BRB 7$ ;7$ ; 0690 6$: MOVZBW 349(SP), 28(SP) ;DIR_NAM+57, DEV_DESC ; 0698 MOVL -360(FP), 32(SP) ;DIR_NAM+68, DEV_DESC+4 ; 0699 7$: MOVZBW 350(SP), 20(SP) ;DIR_NAM+58, DIR_DESC ; 0702 MOVL -356(FP), 24(SP) ;DIR_NAM+72, DIR_DESC+4 ; 0703 BRB 9$ ;9$ ; 0676 8$: MOVW -352(R8), 20(SP) ;ORG_DEFAULT_DIR, DIR_DESC ; 0707 MOVL -348(R8), 24(SP) ;ORG_DEFAULT_DIR+4, DIR_DESC+4 ; 0708 MOVW -212(R8), 28(SP) ;ORG_DEFAULT_DEV, DEV_DESC ; 0709 MOVL -208(R8), 32(SP) ;ORG_DEFAULT_DEV+4, DEV_DESC+4 ; 0710 9$: PUSHAB 28(SP) ;DEV_DESC ; 0713 PUSHAB 12(R11) ;P.AAD ; CALLS #2, G^LIB$SET_LOGICAL ;#2, LIB$SET_LOGICAL ; MOVL R0, R6 ;R0, STATUS ; BLBC R6, 11$ ;STATUS, 11$ ; 0715 CLRQ -(SP) ;-(SP) ; 0722 PUSHAB 28(SP) ;DIR_DESC ; CALLS #3, G^SYS$SETDDIR ;#3, SYS$SETDDIR ; MOVL R0, R6 ;R0, STATUS ; 10$: BLBC R6, 11$ ;STATUS, 11$ ; 0724 MOVAB (R10), 24(SP) ;GEN_1DATA, DIR_DESC+4 ; 0731 MOVZBW #100, 20(SP) ;#100, DIR_DESC ; 0732 PUSHAB 20(SP) ;DIR_DESC ; 0733 PUSHAB 24(SP) ;DIR_DESC ; CLRL -(SP) ;-(SP) ; CALLS #3, G^SYS$SETDDIR ;#3, SYS$SETDDIR ; MOVL R0, R6 ;R0, STATUS ; 11$: BLBS R6, 12$ ;STATUS, 12$ ; 0735 BRW 32$ ;32$ ; 12$: MOVAB -200(R8), 4(SP) ;RSP_TEXT, POINTER ; 0742 CLRL (R8) ;RSP_LEN ; 0743 PUSHL R8 ;R8 ; 0744 PUSHAB 8(SP) ;POINTER ; PUSHL #25 ;#25 ; PUSHAB 20(R11) ;P.AAF ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL R8 ;R8 ; 0745 PUSHAB 8(SP) ;POINTER ; MOVZWL 36(SP), -(SP) ;DEV_DESC, -(SP) ; PUSHL 44(SP) ;DEV_DESC+4 ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL R8 ;R8 ; 0746 PUSHAB 8(SP) ;POINTER ; MOVZWL 28(SP), -(SP) ;DIR_DESC, -(SP) ; PUSHL 36(SP) ;DIR_DESC+4 ; CALLS #4, (R7) ;#4, CONCAT ; MOVAB -200(R8), @8(AP) ;RSP_TEXT, @STRING_ADDRESS ; 0747 MOVL (R8), @12(AP) ;RSP_LEN, @STRING_LENGTH ; 0748 BRB 19$ ;19$ ; 0749 13$: PUSHL SP ;SP ; 0758 PUSHAB 8(SP) ;POINTER ; MOVZWL W^GEN_DELETE_CMD, -(SP) ;GEN_DELETE_CMD, -(SP) ; PUSHL W^GEN_DELETE_CMD+4 ;GEN_DELETE_CMD+4 ; BRB 17$ ;17$ ; 14$: PUSHL SP ;SP ; 0768 PUSHAB 8(SP) ;POINTER ; MOVZWL W^GEN_DIR_CMD, -(SP) ;GEN_DIR_CMD, -(SP) ; PUSHL W^GEN_DIR_CMD+4 ;GEN_DIR_CMD+4 ; BRB 17$ ;17$ ; 15$: TSTL (R9) ;GEN_1SIZE ; 0779 BGTR 16$ ;16$ ; PUSHL SP ;SP ; 0782 PUSHAB 8(SP) ;POINTER ; MOVZWL W^GEN_USG_CMD, -(SP) ;GEN_USG_CMD, -(SP) ; PUSHL W^GEN_USG_CMD+4 ;GEN_USG_CMD+4 ; BRW 27$ ;27$ ; 16$: PUSHL SP ;SP ; 0786 PUSHAB 8(SP) ;POINTER ; MOVZWL W^GEN_USG_ARG_CMD, -(SP) ;GEN_USG_ARG_CMD, -(SP) ; PUSHL W^GEN_USG_ARG_CMD+4 ;GEN_USG_ARG_CMD+4 ; 17$: CALLS #4, (R7) ;#4, CONCAT ; BRW 26$ ;26$ ; 0788 18$: MOVL W^GEN_HELP_TEXT+4, @8(AP) ;GEN_HELP_TEXT+4, @STRING_ADDRESS ; 0799 MOVZWL W^GEN_HELP_TEXT, @12(AP) ;GEN_HELP_TEXT, @STRING_LENGTH ; 0800 19$: BRB 23$ ;23$ ; 0801 20$: PUSHL SP ;SP ; 0810 PUSHAB 8(SP) ;POINTER ; MOVZWL W^GEN_REN_CMD, -(SP) ;GEN_REN_CMD, -(SP) ; PUSHL W^GEN_REN_CMD+4 ;GEN_REN_CMD+4 ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0811 PUSHAB 8(SP) ;POINTER ; PUSHL (R9) ;GEN_1SIZE ; PUSHL R10 ;R10 ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0812 PUSHAB 8(SP) ;POINTER ; PUSHL #1 ;#1 ; PUSHAB 48(R11) ;P.AAG ; BRB 25$ ;25$ ; 21$: PUSHL SP ;SP ; 0822 PUSHAB 8(SP) ;POINTER ; MOVZWL W^GEN_SEND_CMD, -(SP) ;GEN_SEND_CMD, -(SP) ; PUSHL W^GEN_SEND_CMD+4 ;GEN_SEND_CMD+4 ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0823 PUSHAB 8(SP) ;POINTER ; PUSHL (R9) ;GEN_1SIZE ; PUSHL R10 ;R10 ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0824 PUSHAB 8(SP) ;POINTER ; PUSHL #2 ;#2 ; PUSHAB 52(R11) ;P.AAH ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0825 PUSHAB 8(SP) ;POINTER ; PUSHL W^GEN_2SIZE ;GEN_2SIZE ; PUSHAB W^GEN_2DATA ;GEN_2DATA ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0826 PUSHAB 8(SP) ;POINTER ; PUSHL #1 ;#1 ; PUSHAB 56(R11) ;P.AAI ; BRB 27$ ;27$ ; 22$: MOVC5 (R9), (R10), #0, #132, W^FILE_NAME ;GEN_1SIZE, GEN_1DATA, #0, #132, FILE_NAME ; 0835 MOVL (R9), W^FILE_SIZE ;GEN_1SIZE, FILE_SIZE ; 0836 23$: MOVL #134316043, R0 ;#134316043, R0 ; 0837 RET ; ; 24$: PUSHL SP ;SP ; 0846 PUSHAB 8(SP) ;POINTER ; MOVZWL W^GEN_WHO_CMD, -(SP) ;GEN_WHO_CMD, -(SP) ; PUSHL W^GEN_WHO_CMD+4 ;GEN_WHO_CMD+4 ; CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0847 PUSHAB 8(SP) ;POINTER ; PUSHL (R9) ;GEN_1SIZE ; PUSHL R10 ;R10 ; 25$: CALLS #4, (R7) ;#4, CONCAT ; PUSHL SP ;SP ; 0848 PUSHAB 8(SP) ;POINTER ; PUSHL W^GEN_2SIZE ;GEN_2SIZE ; PUSHAB W^GEN_2DATA ;GEN_2DATA ; BRB 27$ ;27$ ; 26$: PUSHL SP ;SP ; 0853 PUSHAB 8(SP) ;POINTER ; PUSHL (R9) ;GEN_1SIZE ; PUSHL R10 ;R10 ; 27$: CALLS #4, (R7) ;#4, CONCAT ; MOVW (SP), -24(FP) ;COMMAND_LENGTH, COMMAND_DESC ; 0867 MOVL #51970052, -16(FP) ;#51970052, ITMLST ; 0868 MOVAB 8(SP), -12(FP) ;OUR_PID, ITMLST+4 ; 0869 MOVAB -8(FP), -8(FP) ;ITMLST+8, ITMLST+8 ; 0870 CLRL -4(FP) ;ITMLST+12 ; 0871 CLRQ -(SP) ;-(SP) ; 0872 CLRL -(SP) ;-(SP) ; PUSHAB -16(FP) ;ITMLST ; CLRQ -(SP) ;-(SP) ; CLRL -(SP) ;-(SP) ; CALLS #7, G^SYS$GETJPI ;#7, SYS$GETJPI ; MOVC5 #11, 60(R11), #0, #20, -252(FP) ;#11, P.AAJ, #0, #20, MBX_NAME ; 0874 MOVL #17694728, -232(FP) ;#17694728, MBX_DESC ; 0877 MOVAB -241(FP), -228(FP) ;MBX_NAME+11, MBX_DESC+4 ; 0878 PUSHL #8 ;#8 ; 0879 PUSHAB -232(FP) ;MBX_DESC ; PUSHAB 16(SP) ;OUR_PID ; CALLS #3, G^OTS$CVT_L_TZ ;#3, OTS$CVT_L_TZ ; MOVW #19, -232(FP) ;#19, MBX_DESC ; 0880 MOVAB -252(FP), -228(FP) ;MBX_NAME, MBX_DESC+4 ; 0881 PUSHAB -232(FP) ;MBX_DESC ; 0882 CLRQ -(SP) ;-(SP) ; CLRQ -(SP) ;-(SP) ; PUSHAB 32(SP) ;MBX_CHAN ; CLRL -(SP) ;-(SP) ; CALLS #7, G^SYS$CREMBX ;#7, SYS$CREMBX ; MOVL R0, R6 ;R0, STATUS ; BLBC R6, 32$ ;STATUS, 32$ ; 0884 MOVB #58, -233(FP) ;#58, MBX_NAME+19 ; 0891 MOVW #20, -232(FP) ;#20, MBX_DESC ; 0892 MOVC5 #19, -252(FP), #0, #132, W^FILE_NAME ;#19, MBX_NAME, #0, #132, FILE_NAME ; 0893 MOVL #19, W^FILE_SIZE ;#19, FILE_SIZE ; 0894 MOVL #1, 16(SP) ;#1, FLAGS ; 0895 PUSHL 12(SP) ;MBX_CHAN ; 0914 CLRL R1 ;R1 ; 0909 CMPL -488(R8), #3 ;VMS_VERSION, #3 ; BGTR 28$ ;28$ ; INCL R1 ;R1 ; MOVAB -26(R7), R0 ;PROCESS_COMPLETION_AST, R0 ; PUSHL R0 ;R0 ; BRB 29$ ;29$ ; 28$: CLRL -(SP) ;-(SP) ; 29$: CLRQ -(SP) ;-(SP) ; 0896 CLRQ -(SP) ;-(SP) ; PUSHAB 40(SP) ;FLAGS ; PUSHAB -232(FP) ;MBX_DESC ; BLBC R1, 30$ ;R1, 30$ ; 0898 CLRL -(SP) ;-(SP) ; BRB 31$ ;31$ ; 30$: MOVAB 80(R11), R0 ;P.AAK, R0 ; 0901 PUSHL R0 ;R0 ; 31$: PUSHAB -24(FP) ;COMMAND_DESC ; 0896 CALLS #10, G^LIB$SPAWN ;#10, LIB$SPAWN ; MOVL R0, R6 ;R0, STATUS ; BLBS R6, 33$ ;STATUS, 33$ ; 0916 32$: PUSHL R6 ;STATUS ; CALLS #1, G^LIB$SIGNAL ;#1, LIB$SIGNAL ; 33$: MOVL R6, R0 ;STATUS, R0 ; 0918 RET ; ; 0919 ; Routine Size: 989 bytes, Routine Base: $CODE$ + 012D ; 0920 1 ; 0921 1 %SBTTL 'SY_DISMISS - Sleep for N seconds' ; 0922 1 ; 0923 1 GLOBAL ROUTINE SY_DISMISS (SECONDS) : NOVALUE = ; 0924 1 ; 0925 1 !++ ; 0926 1 ! FUNCTIONAL DESCRIPTION: ; 0927 1 ! ; 0928 1 ! This routine is called to cause KERMIT to sleep for the ; 0929 1 ! specified number of seconds. ; 0930 1 ! ; 0931 1 ! CALLING SEQUENCE: ; 0932 1 ! ; 0933 1 ! SY_DISMISS(Number of seconds); ; 0934 1 ! ; 0935 1 ! INPUT PARAMETERS: ; 0936 1 ! ; 0937 1 ! Number of seconds to sleep. ; 0938 1 ! ; 0939 1 ! IMPLICIT INPUTS: ; 0940 1 ! ; 0941 1 ! None. ; 0942 1 ! ; 0943 1 ! OUTPUT PARAMETERS: ; 0944 1 ! ; 0945 1 ! None. ; 0946 1 ! ; 0947 1 ! IMPLICIT OUTPUTS: ; 0948 1 ! ; 0949 1 ! None. ; 0950 1 ! ; 0951 1 ! COMPLETION CODES: ; 0952 1 ! ; 0953 1 ! None. ; 0954 1 ! ; 0955 1 ! SIDE EFFECTS: ; 0956 1 ! ; 0957 1 ! None. ; 0958 1 ! ; 0959 1 !-- ; 0960 1 ; 0961 2 BEGIN ; 0962 2 ; 0963 2 LOCAL ; 0964 2 STATUS, ; 0965 2 TOTAL_TIME : VECTOR [2, LONG]; ! Quad word for length of time to sleep ; 0966 2 ; 0967 2 IF .SECONDS EQL 0 THEN RETURN KER_NORMAL; ; 0968 2 ; 0969 2 TOTAL_TIME [0] = -.SECONDS*10*1000*1000; ; 0970 2 TOTAL_TIME [1] = -1; ; 0971 2 STATUS = $SETIMR (EFN = 1, DAYTIM = TOTAL_TIME); ; 0972 2 ; 0973 2 IF NOT .STATUS THEN LIB$SIGNAL (.STATUS); ; 0974 2 ; 0975 2 STATUS = $WAITFR (EFN = 1); ; 0976 2 ; 0977 2 IF NOT .STATUS THEN LIB$SIGNAL (.STATUS); ; 0978 2 ; 0979 1 END; ! End of SY_DISMISS(time) .EXTRN SYS$SETIMR .ENTRY SY_DISMISS, ^M ;SY_DISMISS, Save R2,R3 ; 0923 MOVAB G^LIB$SIGNAL, R3 ;LIB$SIGNAL, R3 ; SUBL2 #8, SP ;#8, SP ; TSTL 4(AP) ;SECONDS ; 0967 BEQL 2$ ;2$ ; MULL3 #10000000, 4(AP), R0 ;#10000000, SECONDS, R0 ; 0969 MNEGL R0, (SP) ;R0, TOTAL_TIME ; MNEGL #1, 4(SP) ;#1, TOTAL_TIME+4 ; 0970 CLRQ -(SP) ;-(SP) ; 0971 PUSHAB 8(SP) ;TOTAL_TIME ; PUSHL #1 ;#1 ; CALLS #4, G^SYS$SETIMR ;#4, SYS$SETIMR ; MOVL R0, R2 ;R0, STATUS ; BLBS R2, 1$ ;STATUS, 1$ ; 0973 PUSHL R2 ;STATUS ; CALLS #1, (R3) ;#1, LIB$SIGNAL ; 1$: PUSHL #1 ;#1 ; 0975 CALLS #1, G^SYS$WAITFR ;#1, SYS$WAITFR ; MOVL R0, R2 ;R0, STATUS ; BLBS R2, 2$ ;STATUS, 2$ ; 0977 PUSHL R2 ;STATUS ; CALLS #1, (R3) ;#1, LIB$SIGNAL ; 2$: RET ; ; 0979 ; Routine Size: 79 bytes, Routine Base: $CODE$ + 050A ; 0980 1 ; 0981 1 %SBTTL 'SY_TIME - Return elapsed time' ; 0982 1 ; 0983 1 GLOBAL ROUTINE SY_TIME = ; 0984 1 ; 0985 1 !++ ; 0986 1 ! FUNCTIONAL DESCRIPTION: ; 0987 1 ! ; 0988 1 ! This routine will return the elapsed time to the calling routine. ; 0989 1 ! This will allow for the calculation of the effective baud rate. ; 0990 1 ! ; 0991 1 ! CALLING SEQUENCE: ; 0992 1 ! ; 0993 1 ! TIME = SY_TIME (); ; 0994 1 ! ; 0995 1 ! INPUT PARAMETERS: ; 0996 1 ! ; 0997 1 ! None. ; 0998 1 ! ; 0999 1 ! IMPLICIT INPUTS: ; 1000 1 ! ; 1001 1 ! None. ; 1002 1 ! ; 1003 1 ! OUTPUT PARAMETERS: ; 1004 1 ! ; 1005 1 ! Time in milliseconds. ; 1006 1 ! ; 1007 1 ! IMPLICIT OUTPUTS: ; 1008 1 ! ; 1009 1 ! None. ; 1010 1 ! ; 1011 1 ! COMPLETION CODES: ; 1012 1 ! ; 1013 1 ! None. ; 1014 1 ! ; 1015 1 ! SIDE EFFECTS: ; 1016 1 ! ; 1017 1 ! None. ; 1018 1 ! ; 1019 1 !-- ; 1020 1 ; 1021 2 BEGIN ; 1022 2 ! ; 1023 2 ! Local storage ; 1024 2 ! ; 1025 2 ; 1026 2 LOCAL ; 1027 2 STATUS, ! Status returned by lower level ; 1028 2 TIMER_MILLI_SECONDS, ! Time in milliseconds ; 1029 2 TIMER_REMAINDER, ! Remainder on EDIV ; 1030 2 TIMER_VALUE : VECTOR [2, LONG], ! Quad word TIME value ; 1031 2 TEN_FOURTH : VECTOR [2, LONG], ! to hold 10**4 ; 1032 2 TIMER_CODE; ! Type of TIMER request ; 1033 2 ; 1034 2 ! ; 1035 2 ! Set up the type of request we want (elapsed time) ; 1036 2 ! ; 1037 2 TIMER_CODE = 1; ; 1038 2 ! ; 1039 2 ! Get the elapsed time from VMS ; 1040 2 ! ; 1041 2 STATUS = LIB$STAT_TIMER (TIMER_CODE, TIMER_VALUE, TIMER_HANDLE); ; 1042 2 ; 1043 2 IF NOT .STATUS THEN RETURN 0; ; 1044 2 ; 1045 2 ! ; 1046 2 ! Compute the LONG word value from the QUAD word given ; 1047 2 ! ; 1048 2 TEN_FOURTH [0] = 1000*10; ; 1049 2 TEN_FOURTH [1] = 0; ; 1050 2 STATUS = LIB$EDIV (TEN_FOURTH, TIMER_VALUE, TIMER_MILLI_SECONDS, TIMER_REMAINDER); ; 1051 2 ; 1052 2 IF NOT .STATUS THEN RETURN 0; ; 1053 2 ; 1054 2 RETURN .TIMER_MILLI_SECONDS; ; 1055 1 END; ! End of SY_TIME .ENTRY SY_TIME, ^M<> ;SY_TIME, Save nothing ; 0983 SUBL2 #24, SP ;#24, SP ; PUSHL #1 ;#1 ; 1037 PUSHAB W^U.6 ;U.6 ; 1041 PUSHAB 24(SP) ;TIMER_VALUE ; PUSHAB 8(SP) ;TIMER_CODE ; CALLS #3, G^LIB$STAT_TIMER ;#3, LIB$STAT_TIMER ; BLBC R0, 1$ ;STATUS, 1$ ; 1043 MOVZWL #10000, 12(SP) ;#10000, TEN_FOURTH ; 1048 CLRL 16(SP) ;TEN_FOURTH+4 ; 1049 PUSHAB 4(SP) ;TIMER_REMAINDER ; 1050 PUSHAB 12(SP) ;TIMER_MILLI_SECONDS ; PUSHAB 28(SP) ;TIMER_VALUE ; PUSHAB 24(SP) ;TEN_FOURTH ; CALLS #4, G^LIB$EDIV ;#4, LIB$EDIV ; BLBC R0, 1$ ;STATUS, 1$ ; 1052 MOVL 8(SP), R0 ;TIMER_MILLI_SECONDS, R0 ; 1054 RET ; ; 1$: CLRL R0 ;R0 ; 1055 RET ; ; ; Routine Size: 66 bytes, Routine Base: $CODE$ + 0559 ; 1056 1 ; 1057 1 %SBTTL 'End of KERSYS.BLI' ; 1058 1 END ! End of module ; 1059 1 ; 1060 0 ELUDOM ; PSECT SUMMARY ; ; Name Bytes Attributes ; ; $OWN$ 492 NOVEC, WRT, RD ,NOEXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; $PLIT$ 104 NOVEC,NOWRT, RD ,NOEXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; $CODE$ 1435 NOVEC,NOWRT, RD , EXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; . ABS . 0 NOVEC,NOWRT,NORD ,NOEXE,NOSHR, LCL, ABS, CON,NOPIC,ALIGN(0) ; Library Statistics ; ; -------- Symbols -------- Pages Processing ; File Total Loaded Percent Mapped Time ; ; SYS$COMMON:[SYSLIB]STARLET.L32;1 9776 84 0 581 00:00.8 ; SYS$COMMON:[SYSLIB]TPAMAC.L32;1 42 0 0 14 00:00.1 ; COMMAND QUALIFIERS ; BLISS KERSYS/LIST=KERSYS.MAR/MACHINE_CODE=(ASSEM,NOBINARY,UNIQUE)/NOOBJECT/SOURCE=NOHEADER ; Compilation Complete .END