; 0001 0 MODULE KERTT (IDENT = '2.0.003' ; 0002 0 ) = ; 0003 1 BEGIN ; 0004 1 ; 0005 1 SWITCHES LANGUAGE (COMMON); ; 0006 1 ; 0007 1 ! ; 0008 1 ; 0009 1 !++ ; 0010 1 ! FACILITY: ; 0011 1 ! ; 0012 1 ! KERMIT text processing ; 0013 1 ! ; 0014 1 ! ABSTRACT: ; 0015 1 ! ; 0016 1 ! This module contains all of the text processing required for ; 0017 1 ! KERMSG. ; 0018 1 ! ; 0019 1 ! ENVIRONMENT: ; 0020 1 ! ; 0021 1 ! TOPS-10, P/OS, VAX/VMS ; 0022 1 ! ; 0023 1 ! AUTHOR: Robert C. McQueen, CREATION DATE: 29-August-1983 ; 0024 1 !-- ; 0025 1 ; 0026 1 %SBTTL 'Table of Contents' ; 0027 1 ! ; 0028 1 ! TABLE OF CONTENTS: ; 0029 1 ! ; 0030 1 %SBTTL 'Revision History' ; 0031 1 ; 0032 1 !++ ; 0033 1 ! ; 0034 1 ! Create this module for PRO/Kermit 1.0, Kermit-10 2(100) and Kermit-32 1.2 ; 0035 1 ! ; 0036 1 ! 1.2.000 By: Robert C. McQueen On: 29-August-1983 ; 0037 1 ! Create this module. ; 0038 1 ! ; 0039 1 ! 1.2.001 By: Robert C. McQueen On: 9-Sept-1983 ; 0040 1 ! Make the string passed to TERM%DUMP a counted ASCIZ string, ; 0041 1 ! not a counted ASCII string. ; 0042 1 ! ; 0043 1 ! 1.2.002 By: Robert C. McQueen On: 16-September-1983 ; 0044 1 ! Make TT%OUTPUT a global routine, so we can force information ; 0045 1 ! output a various points in time. ; 0046 1 ! ; 0047 1 ! 2.0.003 Release for TOPS-10 KERMIT-10 version 2. ; 0048 1 ! Release for VAX/VMS KERMIT-32 version 2. ; 0049 1 !-- ; 0050 1 ; 0051 1 %SBTTL 'Library files' ; 0052 1 ! ; 0053 1 ! INCLUDE FILES: ; 0054 1 ! ; 0055 1 ! ; 0056 1 ! KERMIT common definitions ; 0057 1 ! ; 0058 1 ; 0059 1 REQUIRE 'KERCOM'; ; 0264 1 ; 0265 1 %SBTTL 'Symbol definitions' ; 0266 1 ! ; 0267 1 ! EQUATED SYMBOLS: ; 0268 1 ! ; 0269 1 ; 0270 1 LITERAL ; 0271 1 TEXT%BFR%LENGTH = 256; ! Length of the text buffer ; 0272 1 ; 0273 1 %SBTTL 'Storage' ; 0274 1 ! ; 0275 1 ! OWN STORAGE: ; 0276 1 ! ; 0277 1 ! ; 0278 1 ! TT%xxxxx routine storage ; 0279 1 ! ; 0280 1 ; 0281 1 OWN ; 0282 1 DUMP%ROUTINE, ! Address of routine to dump text ; 0283 1 TEXT%COUNT, ! Count of the characters ; 0284 1 TEXT%POINTER, ! Pointer to store characters ; 0285 1 TEXT%BUFFER : VECTOR [CH$ALLOCATION (TEXT%BFR%LENGTH)]; ! Buffer of characters ; 0286 1 ; 0287 1 %SBTTL 'External storage' ; 0288 1 ; 0289 1 !++ ; 0290 1 ! The following is the various external storage locations that are ; 0291 1 ! referenced from this module. ; 0292 1 !-- ; 0293 1 ; 0294 1 ! ; 0295 1 ! KERMSG storage ; 0296 1 ! ; 0297 1 ; 0298 1 EXTERNAL ; 0299 1 CONNECT%FLAG; ! Flag if communications line is TT: ; 0300 1 ; 0301 1 !++ ; 0302 1 ! The following is the only external routine used by this module. This ; 0303 1 ! routine will cause the terminal buffer that we have been building to be ; 0304 1 ! output on the terminal ; 0305 1 !-- ; 0306 1 ; 0307 1 EXTERNAL ROUTINE ; 0308 1 TERM%DUMP : NOVALUE; ! Output the terminal buffer ; 0309 1 ; 0310 1 %SBTTL 'Terminal routines -- TT%INIT - Initialize this module' ; 0311 1 ; 0312 1 GLOBAL ROUTINE TT%INIT : NOVALUE = ; 0313 1 ; 0314 1 !++ ; 0315 1 ! FUNCTIONAL DESCRIPTION: ; 0316 1 ! ; 0317 1 ! This routine will initialize the terminal processing module. It will ; 0318 1 ! initialize the various data locations in this module. ; 0319 1 ! ; 0320 1 ! CALLING SEQUENCE: ; 0321 1 ! ; 0322 1 ! TT%INIT(); ; 0323 1 ! ; 0324 1 ! INPUT PARAMETERS: ; 0325 1 ! ; 0326 1 ! None. ; 0327 1 ! ; 0328 1 ! IMPLICIT INPUTS: ; 0329 1 ! ; 0330 1 ! None. ; 0331 1 ! ; 0332 1 ! OUTPUT PARAMETERS: ; 0333 1 ! ; 0334 1 ! None. ; 0335 1 ! ; 0336 1 ! IMPLICIT OUTPUTS: ; 0337 1 ! ; 0338 1 ! None. ; 0339 1 ! ; 0340 1 ! COMPLETION CODES: ; 0341 1 ! ; 0342 1 ! None. ; 0343 1 ! ; 0344 1 ! SIDE EFFECTS: ; 0345 1 ! ; 0346 1 ! None. ; 0347 1 ! ; 0348 1 !-- ; 0349 1 ; 0350 2 BEGIN ; 0351 2 ! ; 0352 2 ! Now initialize the various pointers ; 0353 2 ! ; 0354 2 TEXT%COUNT = 0; ; 0355 2 TEXT%POINTER = CH$PTR (TEXT%BUFFER); ; 0356 2 DUMP%ROUTINE = TERM%DUMP; ! Initial output routine is to terminal ; 0357 1 END; ! End of TT%INIT TITLE KERTT TWOSEG .REQUEST SYS:B361LB.REL RELOC 0 ; DUMP%ROUTINE U.1: BLOCK 1 ; TEXT%COUNT U.2: BLOCK 1 ; TEXT%POINTER U.3: BLOCK 1 ; TEXT%BUFFER U.4: BLOCK 64 EXTERN CONNECT%FLAG, TERM%DUMP 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==: 10 GC%CONNECT==: 11 GC%RENAME==: 12 GC%COPY==: 13 GC%WHO==: 14 GC%SEND%MSG==: 15 GC%STATUS==: 16 GC%COMMAND==: 17 GC%KERMIT==: 20 GC%JOURNAL==: 21 GC%VARIABLE==: 22 GC%PROGRAM==: 23 GC%MAX==: 23 DP%FULL==: 0 DP%HALF==: 1 CHK%1CHAR==: 61 CHK%2CHAR==: 62 CHK%CRC==: 63 MAX%MSG==: 1752 AC0= 0 AC1= 1 AC2= 2 AC3= 3 AC4= 4 AC5= 5 AC6= 6 AC7= 7 AC10= 10 AC11= 11 AC12= 12 AC13= 13 AC14= 14 FP= 15 AC16= 16 SP= 17 RELOC 400000 TT%INIT:: SETZM U.2 ; 0354 MOVE AC1,C.1 ; 0355 MOVEM AC1,U.3 MOVEI AC1,TERM%DUMP ; 0356 MOVEM AC1,U.1 POPJ SP, ; 0312 C.1: POINT 7,U.4-1,34 ; Routine Size: 7 words ; 0358 1 ; 0359 1 %SBTTL 'TT%SET%OUTPUT - Set output routine to use' ; 0360 1 GLOBAL ROUTINE TT%SET%OUTPUT (OUT%RTN) = ; 0361 1 ; 0362 1 !++ ; 0363 1 ! FUNCTIONAL DESCRIPTION: ; 0364 1 ! ; 0365 1 ! This routine will set the output routine to use for the TT%xxx routines. ; 0366 1 !The argument is a routine address which will output a counted ASCIZ string. ; 0367 1 !It will return the address of the previous output routine. ; 0368 1 ! ; 0369 1 ! CALLING SEQUENCE: ; 0370 1 ! ; 0371 1 ! OLD%RTN = TT%SET%OUTPUT (OUT%RTN); ; 0372 1 ! ; 0373 1 ! INPUT PARAMETERS: ; 0374 1 ! ; 0375 1 ! OUT%RTN - Address of routine to output a counted ASCIZ string ; 0376 1 ! called as OUT%RTN (Address of string, length of string) ; 0377 1 ! ; 0378 1 ! IMPLICIT INPUTS: ; 0379 1 ! ; 0380 1 ! DUMP%ROUTINE - Previous output routine ; 0381 1 ! ; 0382 1 ! OUPTUT PARAMETERS: ; 0383 1 ! ; 0384 1 ! The value of the routine is the previous output routine address. ; 0385 1 ! ; 0386 1 ! IMPLICIT OUTPUTS: ; 0387 1 ! ; 0388 1 ! DUMP%ROUTINE - New output routine ; 0389 1 ! ; 0390 1 ! COMPLETION CODES: ; 0391 1 ! ; 0392 1 ! None. ; 0393 1 ! ; 0394 1 ! SIDE EFFECTS: ; 0395 1 ! ; 0396 1 ! None. ; 0397 1 ! ; 0398 1 !-- ; 0399 1 ; 0400 2 BEGIN ; 0401 2 LOCAL ; 0402 2 OLD%RTN; ! Old routine address ; 0403 2 ; 0404 2 OLD%RTN = .DUMP%ROUTINE; ! Remember the old address ; 0405 2 DUMP%ROUTINE = .OUT%RTN; ! Save the new ; 0406 2 RETURN .OLD%RTN; ! And return the old value ; 0407 1 END; ! End of TT%SET%OUTPUT TT%SET%OUTPUT:: MOVE AC1,U.1 ; 0404 MOVE AC2,-1(SP) ; 0405 MOVEM AC2,U.1 POPJ SP, ; 0360 ; Routine Size: 4 words ; 0408 1 ; 0409 1 %SBTTL 'Terminal routines -- TT%OUTPUT - Output the buffer' ; 0410 1 GLOBAL ROUTINE TT%OUTPUT : NOVALUE = ; 0411 1 ; 0412 1 !++ ; 0413 1 ! FUNCTIONAL DESCRIPTION: ; 0414 1 ! ; 0415 1 ! This routine will dump the text buffer on the output device. ; 0416 1 ! ; 0417 1 ! CALLING SEQUENCE: ; 0418 1 ! ; 0419 1 ! TT%OUTPUT(); ; 0420 1 ! ; 0421 1 ! INPUT PARAMETERS: ; 0422 1 ! ; 0423 1 ! None. ; 0424 1 ! ; 0425 1 ! IMPLICIT INPUTS: ; 0426 1 ! ; 0427 1 ! None. ; 0428 1 ! ; 0429 1 ! OUTPUT PARAMETERS: ; 0430 1 ! ; 0431 1 ! None. ; 0432 1 ! ; 0433 1 ! IMPLICIT OUTPUTS: ; 0434 1 ! ; 0435 1 ! None. ; 0436 1 ! ; 0437 1 ! COMPLETION CODES: ; 0438 1 ! ; 0439 1 ! None. ; 0440 1 ! ; 0441 1 ! SIDE EFFECTS: ; 0442 1 ! ; 0443 1 ! None. ; 0444 1 ! ; 0445 1 !-- ; 0446 1 ; 0447 2 BEGIN ; 0448 2 ; 0449 2 LOCAL ; 0450 2 STATUS; ! Status returned by the library routine ; 0451 2 ; 0452 2 ! ; 0453 2 ! Output the text ; 0454 2 ! ; 0455 2 CH$WCHAR%A (CHR%NUL, TEXT%POINTER); ; 0456 2 (.DUMP%ROUTINE) (TEXT%BUFFER, .TEXT%COUNT); ! Output the buffer to the correct place ; 0457 2 ! ; 0458 2 ! Now reset the descriptor and the pointer to a virgin state ; 0459 2 ! ; 0460 2 TEXT%COUNT = 0; ; 0461 2 TEXT%POINTER = CH$PTR (TEXT%BUFFER); ; 0462 2 ! ; 0463 1 END; ! End of TT%OUTPUT TT%OUTPUT:: SETZ AC1, ; 0455 IDPB AC1,U.3 MOVE AC1,U.1 ; 0456 PUSH SP,C.2 PUSH SP,U.2 PUSHJ SP,0(AC1) SETZM U.2 ; 0460 MOVE AC1,C.1 ; 0461 MOVEM AC1,U.3 ADJSP SP,-2 ; 0447 POPJ SP, ; 0410 C.2: XWD 0,U.4 ; Routine Size: 12 words ; 0464 1 %SBTTL 'Terminal routines -- TT%CHAR - Output a single character' ; 0465 1 ; 0466 1 GLOBAL ROUTINE TT%CHAR (CHARACTER) : NOVALUE = ; 0467 1 ; 0468 1 !++ ; 0469 1 ! FUNCTIONAL DESCRIPTION: ; 0470 1 ! ; 0471 1 ! This routine will store a character into the text buffer. It will ; 0472 1 ! cause the text to be output if the character is a line terminator. ; 0473 1 ! ; 0474 1 ! CALLING SEQUENCE: ; 0475 1 ! ; 0476 1 ! TT%CHAR(Character); ; 0477 1 ! ; 0478 1 ! INPUT PARAMETERS: ; 0479 1 ! ; 0480 1 ! Character - Character to store into the text buffer. ; 0481 1 ! ; 0482 1 ! IMPLICIT INPUTS: ; 0483 1 ! ; 0484 1 ! None. ; 0485 1 ! ; 0486 1 ! OUTPUT PARAMETERS: ; 0487 1 ! ; 0488 1 ! None. ; 0489 1 ! ; 0490 1 ! IMPLICIT OUTPUTS: ; 0491 1 ! ; 0492 1 ! None. ; 0493 1 ! ; 0494 1 ! COMPLETION CODES: ; 0495 1 ! ; 0496 1 ! None. ; 0497 1 ! ; 0498 1 ! SIDE EFFECTS: ; 0499 1 ! ; 0500 1 ! None. ; 0501 1 ! ; 0502 1 !-- ; 0503 1 ; 0504 2 BEGIN ; 0505 2 ! ; 0506 2 ! Increment the count of the characters ; 0507 2 ! ; 0508 2 TEXT%COUNT = .TEXT%COUNT + 1; ; 0509 2 ! ; 0510 2 ! And store the character ; 0511 2 ! ; 0512 2 CH$WCHAR%A (.CHARACTER, TEXT%POINTER); ; 0513 2 ! ; 0514 2 ! If this is a line feed then just output the text string ; 0515 2 ! ; 0516 2 ; 0517 2 IF .CHARACTER EQL CHR%LFD THEN TT%OUTPUT (); ; 0518 2 ! ; 0519 2 ! Check to make sure we are not exceeding the limit of the buffer ; 0520 2 ! ; 0521 2 IF .TEXT%COUNT EQL TEXT%BFR%LENGTH-1 THEN TT%OUTPUT (); ; 0522 2 ; 0523 2 ; 0524 2 ! ; 0525 1 END; ! End of TT%CHAR TT%CHAR:: AOS U.2 ; 0508 MOVE AC1,-1(SP) ; 0512 IDPB AC1,U.3 MOVEI AC1,12 ; 0517 CAMN AC1,-1(SP) PUSHJ SP,TT%OUTPUT MOVEI AC1,377 ; 0521 CAMN AC1,U.2 PUSHJ SP,TT%OUTPUT POPJ SP, ; 0466 ; Routine Size: 10 words ; 0526 1 ; 0527 1 %SBTTL 'Terminal routines -- TT%TEXT - Output a text string' ; 0528 1 ; 0529 1 GLOBAL ROUTINE TT%TEXT (ADDRESS) : NOVALUE = ; 0530 1 ; 0531 1 !++ ; 0532 1 ! FUNCTIONAL DESCRIPTION: ; 0533 1 ! ; 0534 1 ! This routine will output text on the user's terminal. It will ; 0535 1 ! assume that it must check to determine if it can output the text ; 0536 1 ! or not. ; 0537 1 ! ; 0538 1 ! CALLING SEQUENCE: ; 0539 1 ! ; 0540 1 ! TT%TEXT(TEXT%ADDRESS); ; 0541 1 ! ; 0542 1 ! INPUT PARAMETERS: ; 0543 1 ! ; 0544 1 ! None. ; 0545 1 ! ; 0546 1 ! IMPLICIT INPUTS: ; 0547 1 ! ; 0548 1 ! None. ; 0549 1 ! ; 0550 1 ! OUTPUT PARAMETERS: ; 0551 1 ! ; 0552 1 ! None. ; 0553 1 ! ; 0554 1 ! IMPLICIT OUTPUTS: ; 0555 1 ! ; 0556 1 ! None. ; 0557 1 ! ; 0558 1 ! COMPLETION CODES: ; 0559 1 ! ; 0560 1 ! None. ; 0561 1 ! ; 0562 1 ! SIDE EFFECTS: ; 0563 1 ! ; 0564 1 ! None. ; 0565 1 ! ; 0566 1 !-- ; 0567 1 ; 0568 2 BEGIN ; 0569 2 ; 0570 2 LOCAL ; 0571 2 CHARACTER, ! Character being processed ; 0572 2 ARG%POINTER; ! Pointer to the argument's text ; 0573 2 ; 0574 2 ! ; 0575 2 ! Construct a pointer to the argument. ; 0576 2 ! ; 0577 2 ARG%POINTER = CH$PTR (.ADDRESS); ; 0578 2 ! ; 0579 2 ! Get the first character that was passed. ; 0580 2 ! ; 0581 2 CHARACTER = CH$RCHAR%A (ARG%POINTER); ; 0582 2 ! ; 0583 2 ! Loop reading characters and calling the output routine to process ; 0584 2 ! them ; 0585 2 ! ; 0586 2 ; 0587 2 WHILE .CHARACTER NEQ CHR%NUL DO ; 0588 3 BEGIN ; 0589 3 TT%CHAR (.CHARACTER); ; 0590 3 CHARACTER = CH$RCHAR%A (ARG%POINTER); ; 0591 2 END; ; 0592 2 ; 0593 1 END; ! End of TT%TEXT TT%TEXT:: PUSH SP,AC14 ; 0529 PUSH SP,AC16 MOVE AC1,-3(SP) ; 0577 MOVEI AC16,-1(AC1) HRLI AC16,10700 ILDB AC14,AC16 ; 0581 L.1: JUMPE AC14,L.2 ; 0587 PUSH SP,AC14 ; 0589 PUSHJ SP,TT%CHAR ILDB AC14,AC16 ; 0590 ADJSP SP,-1 ; 0588 JRST L.1 ; 0587 L.2: POP SP,AC16 ; 0529 POP SP,AC14 POPJ SP, ; Routine Size: 15 words ; 0594 1 ; 0595 1 %SBTTL 'Terminal routines -- TT%NUMBER - Output a three digit number' ; 0596 1 ; 0597 1 GLOBAL ROUTINE TT%NUMBER (NUMBER) : NOVALUE = ; 0598 1 ; 0599 1 !++ ; 0600 1 ! FUNCTIONAL DESCRIPTION: ; 0601 1 ! ; 0602 1 ! This routine will store a three digit number into the text buffer. ; 0603 1 ! It will just return if the number is greater than 999. ; 0604 1 ! ; 0605 1 ! CALLING SEQUENCE: ; 0606 1 ! ; 0607 1 ! TT%NUMBER(Value); ; 0608 1 ! ; 0609 1 ! INPUT PARAMETERS: ; 0610 1 ! ; 0611 1 ! Value - Value to output. ; 0612 1 ! ; 0613 1 ! IMPLICIT INPUTS: ; 0614 1 ! ; 0615 1 ! None. ; 0616 1 ! ; 0617 1 ! OUTPUT PARAMETERS: ; 0618 1 ! ; 0619 1 ! None. ; 0620 1 ! ; 0621 1 ! IMPLICIT OUTPUTS: ; 0622 1 ! ; 0623 1 ! None. ; 0624 1 ! ; 0625 1 ! COMPLETION CODES: ; 0626 1 ! ; 0627 1 ! None. ; 0628 1 ! ; 0629 1 ! SIDE EFFECTS: ; 0630 1 ! ; 0631 1 ! None. ; 0632 1 ! ; 0633 1 !-- ; 0634 1 ; 0635 2 BEGIN ; 0636 2 ROUTINE TT%NUM%WORKER (VALUE) : NOVALUE = ; 0637 3 BEGIN ; 0638 3 ; 0639 3 IF .VALUE LEQ 9 ; 0640 3 THEN ; 0641 3 TT%CHAR (.VALUE + %C'0') ; 0642 3 ELSE ; 0643 4 BEGIN ; 0644 4 TT%NUM%WORKER (.VALUE/10); ; 0645 4 TT%CHAR ((.VALUE MOD 10) + %C'0'); ; 0646 3 END; ; 0647 3 ; 0648 2 END; ; TT%NUM%WORKER U.11: PUSH SP,AC16 ; 0636 MOVE AC16,-2(SP) ; 0639 CAILE AC16,11 JRST L.3 MOVE AC1,AC16 ; 0641 ADDI AC1,60 PUSH SP,AC1 PUSHJ SP,TT%CHAR JRST L.4 ; 0639 L.3: MOVE AC1,AC16 ; 0644 IDIVI AC1,12 PUSH SP,AC1 PUSHJ SP,U.11 MOVE AC1,AC16 ; 0645 IDIVI AC1,12 ADDI AC2,60 PUSH SP,AC2 PUSHJ SP,TT%CHAR ADJSP SP,-1 ; 0643 L.4: ADJSP SP,-1 ; 0637 POP SP,AC16 ; 0636 POPJ SP, ; Routine Size: 22 words ; 0649 2 ; 0650 2 IF .NUMBER LSS 0 ; 0651 2 THEN ; 0652 3 BEGIN ; 0653 3 TT%CHAR (%C'-'); ; 0654 3 NUMBER = -.NUMBER; ; 0655 2 END; ; 0656 2 ; 0657 2 TT%NUM%WORKER (.NUMBER); ; 0658 1 END; ! End of TT%NUMBER TT%NUMBER:: SKIPL -1(SP) ; 0650 JRST L.5 PUSH SP,C.3 ; 0653 PUSHJ SP,TT%CHAR MOVNS -2(SP) ; 0654 ADJSP SP,-1 ; 0652 L.5: PUSH SP,-1(SP) ; 0657 PUSHJ SP,U.11 ADJSP SP,-1 ; 0635 POPJ SP, ; 0597 C.3: EXP 55 ; Routine Size: 11 words ; 0659 1 ; 0660 1 %SBTTL 'Terminal routines -- TT%CRLF - Output a CRLF' ; 0661 1 ; 0662 1 GLOBAL ROUTINE TT%CRLF : NOVALUE = ; 0663 1 ; 0664 1 !++ ; 0665 1 ! FUNCTIONAL DESCRIPTION: ; 0666 1 ! ; 0667 1 ! This routine will cause the contents of the terminal buffer to be ; 0668 1 ! output to SYS$OUTPUT:. ; 0669 1 ! ; 0670 1 ! CALLING SEQUENCE: ; 0671 1 ! ; 0672 1 ! TT%CRLF(); ; 0673 1 ! ; 0674 1 ! INPUT PARAMETERS: ; 0675 1 ! ; 0676 1 ! None. ; 0677 1 ! ; 0678 1 ! IMPLICIT INPUTS: ; 0679 1 ! ; 0680 1 ! None. ; 0681 1 ! ; 0682 1 ! OUTPUT PARAMETERS: ; 0683 1 ! ; 0684 1 ! None. ; 0685 1 ! ; 0686 1 ! IMPLICIT OUTPUTS: ; 0687 1 ! ; 0688 1 ! None. ; 0689 1 ! ; 0690 1 ! COMPLETION CODES: ; 0691 1 ! ; 0692 1 ! None. ; 0693 1 ! ; 0694 1 ! SIDE EFFECTS: ; 0695 1 ! ; 0696 1 ! None. ; 0697 1 ! ; 0698 1 !-- ; 0699 1 ; 0700 2 BEGIN ; 0701 2 TT%CHAR (CHR%CRT); ; 0702 2 TT%CHAR (CHR%LFD); ; 0703 1 END; ! End of TT%CRLF TT%CRLF:: PUSH SP,C.4 ; 0701 PUSHJ SP,TT%CHAR PUSH SP,C.5 ; 0702 PUSHJ SP,TT%CHAR ADJSP SP,-2 ; 0700 POPJ SP, ; 0662 C.4: EXP 15 C.5: EXP 12 ; Routine Size: 8 words ; 0704 1 ; 0705 1 %SBTTL 'End of KERTRM' ; 0706 1 END ! End of module ; 0707 1 ; 0708 0 ELUDOM ; Low segment length: 55 words ; High segment length: 89 words ; Compilation Complete END