; 0001 0 MODULE KERTT (IDENT = '2.0.004' ; 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 ! 2.0.004 By: Nick Bush On: 22-December-1983 ; 0051 1 ! Add TT_HOLD to indicate that output should not be dumped ; 0052 1 ! when LF's are seen, only when buffer is full. ; 0053 1 !-- ; 0054 1 ; 0055 1 %SBTTL 'Library files' ; 0056 1 ! ; 0057 1 ! INCLUDE FILES: ; 0058 1 ! ; 0059 1 ! ; 0060 1 ! KERMIT common definitions ; 0061 1 ! ; 0062 1 ; 0063 1 REQUIRE 'KERCOM'; ; 0271 1 ; 0272 1 %SBTTL 'Symbol definitions' ; 0273 1 ! ; 0274 1 ! EQUATED SYMBOLS: ; 0275 1 ! ; 0276 1 ; 0277 1 LITERAL ; 0278 1 TEXT_BFR_LENGTH = 256; ! Length of the text buffer ; 0279 1 ; 0280 1 %SBTTL 'Storage' ; 0281 1 ! ; 0282 1 ! OWN STORAGE: ; 0283 1 ! ; 0284 1 ! ; 0285 1 ! TT_xxxxx routine storage ; 0286 1 ! ; 0287 1 ; 0288 1 OWN ; 0289 1 HOLD_FLAG, ! Output should be held even if CRLF seen ; 0290 1 DUMP_ROUTINE, ! Address of routine to dump text ; 0291 1 TEXT_COUNT, ! Count of the characters ; 0292 1 TEXT_POINTER, ! Pointer to store characters ; 0293 1 TEXT_BUFFER : VECTOR [CH$ALLOCATION (TEXT_BFR_LENGTH)]; ! Buffer of characters ; 0294 1 ; 0295 1 %SBTTL 'External storage' ; 0296 1 ; 0297 1 !++ ; 0298 1 ! The following is the various external storage locations that are ; 0299 1 ! referenced from this module. ; 0300 1 !-- ; 0301 1 ; 0302 1 ! ; 0303 1 ! KERMSG storage ; 0304 1 ! ; 0305 1 ; 0306 1 EXTERNAL ; 0307 1 CONNECT_FLAG; ! Flag if communications line is TT: ; 0308 1 ; 0309 1 !++ ; 0310 1 ! The following is the only external routine used by this module. This ; 0311 1 ! routine will cause the terminal buffer that we have been building to be ; 0312 1 ! output on the terminal ; 0313 1 !-- ; 0314 1 ; 0315 1 EXTERNAL ROUTINE ; 0316 1 TERM_DUMP : NOVALUE; ! Output the terminal buffer ; 0317 1 ; 0318 1 %SBTTL 'Terminal routines -- TT_INIT - Initialize this module' ; 0319 1 ; 0320 1 GLOBAL ROUTINE TT_INIT : NOVALUE = ; 0321 1 ; 0322 1 !++ ; 0323 1 ! FUNCTIONAL DESCRIPTION: ; 0324 1 ! ; 0325 1 ! This routine will initialize the terminal processing module. It will ; 0326 1 ! initialize the various data locations in this module. ; 0327 1 ! ; 0328 1 ! CALLING SEQUENCE: ; 0329 1 ! ; 0330 1 ! TT_INIT(); ; 0331 1 ! ; 0332 1 ! INPUT PARAMETERS: ; 0333 1 ! ; 0334 1 ! None. ; 0335 1 ! ; 0336 1 ! IMPLICIT INPUTS: ; 0337 1 ! ; 0338 1 ! None. ; 0339 1 ! ; 0340 1 ! OUTPUT PARAMETERS: ; 0341 1 ! ; 0342 1 ! None. ; 0343 1 ! ; 0344 1 ! IMPLICIT OUTPUTS: ; 0345 1 ! ; 0346 1 ! None. ; 0347 1 ! ; 0348 1 ! COMPLETION CODES: ; 0349 1 ! ; 0350 1 ! None. ; 0351 1 ! ; 0352 1 ! SIDE EFFECTS: ; 0353 1 ! ; 0354 1 ! None. ; 0355 1 ! ; 0356 1 !-- ; 0357 1 ; 0358 2 BEGIN ; 0359 2 ! ; 0360 2 ! Now initialize the various pointers ; 0361 2 ! ; 0362 2 TEXT_COUNT = 0; ; 0363 2 TEXT_POINTER = CH$PTR (TEXT_BUFFER); ; 0364 2 DUMP_ROUTINE = TERM_DUMP; ! Initial output routine is to terminal ; 0365 2 HOLD_FLAG = FALSE; ! Dump output on CRLF's ; 0366 1 END; ! End of TT_INIT .TITLE KERTT .IDENT \2.0.004\ .PSECT $OWN$,NOEXE,2 ;HOLD_FLAG U.1: .BLKB 4 ;DUMP_ROUTINE U.2: .BLKB 4 ;TEXT_COUNT U.3: .BLKB 4 ;TEXT_POINTER U.4: .BLKB 4 ;TEXT_BUFFER U.5: .BLKB 256 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== 96 .EXTRN CONNECT_FLAG, TERM_DUMP .PSECT $CODE$,NOWRT,2 .ENTRY TT_INIT, ^M ;TT_INIT, Save R2 ; 0320 MOVAB W^U.3, R2 ;U.3, R2 ; CLRL (R2) ;TEXT_COUNT ; 0362 MOVAB 8(R2), 4(R2) ;TEXT_BUFFER, TEXT_POINTER ; 0363 MOVAB W^TERM_DUMP, -4(R2) ;TERM_DUMP, DUMP_ROUTINE ; 0364 CLRL -8(R2) ;HOLD_FLAG ; 0365 RET ; ; 0366 ; Routine Size: 24 bytes, Routine Base: $CODE$ + 0000 ; 0367 1 ; 0368 1 %SBTTL 'TT_SET_OUTPUT - Set output routine to use' ; 0369 1 ; 0370 1 GLOBAL ROUTINE TT_SET_OUTPUT (OUT_RTN) = ; 0371 1 ; 0372 1 !++ ; 0373 1 ! FUNCTIONAL DESCRIPTION: ; 0374 1 ! ; 0375 1 ! This routine will set the output routine to use for the TT_xxx routines. ; 0376 1 !The argument is a routine address which will output a counted ASCIZ string. ; 0377 1 !It will return the address of the previous output routine. ; 0378 1 ! ; 0379 1 ! CALLING SEQUENCE: ; 0380 1 ! ; 0381 1 ! OLD_RTN = TT_SET_OUTPUT (OUT_RTN); ; 0382 1 ! ; 0383 1 ! INPUT PARAMETERS: ; 0384 1 ! ; 0385 1 ! OUT_RTN - Address of routine to output a counted ASCIZ string ; 0386 1 ! called as OUT_RTN (Address of string, length of string) ; 0387 1 ! ; 0388 1 ! IMPLICIT INPUTS: ; 0389 1 ! ; 0390 1 ! DUMP_ROUTINE - Previous output routine ; 0391 1 ! ; 0392 1 ! OUPTUT PARAMETERS: ; 0393 1 ! ; 0394 1 ! The value of the routine is the previous output routine address. ; 0395 1 ! ; 0396 1 ! IMPLICIT OUTPUTS: ; 0397 1 ! ; 0398 1 ! DUMP_ROUTINE - New output routine ; 0399 1 ! ; 0400 1 ! COMPLETION CODES: ; 0401 1 ! ; 0402 1 ! None. ; 0403 1 ! ; 0404 1 ! SIDE EFFECTS: ; 0405 1 ! ; 0406 1 ! None. ; 0407 1 ! ; 0408 1 !-- ; 0409 1 ; 0410 2 BEGIN ; 0411 2 ; 0412 2 LOCAL ; 0413 2 OLD_RTN; ! Old routine address ; 0414 2 ; 0415 2 OLD_RTN = .DUMP_ROUTINE; ! Remember the old address ; 0416 2 DUMP_ROUTINE = .OUT_RTN; ! Save the new ; 0417 2 RETURN .OLD_RTN; ! And return the old value ; 0418 1 END; ! End of TT_SET_OUTPUT .ENTRY TT_SET_OUTPUT, ^M<> ;TT_SET_OUTPUT, Save nothing ; 0370 MOVL W^U.2, R0 ;U.2, OLD_RTN ; 0415 MOVL 4(AP), W^U.2 ;OUT_RTN, U.2 ; 0416 RET ; ; 0418 ; Routine Size: 14 bytes, Routine Base: $CODE$ + 0018 ; 0419 1 ; 0420 1 %SBTTL 'TT_HOLD - Start holding text until TT_OUTPUT call' ; 0421 1 ; 0422 1 GLOBAL ROUTINE TT_HOLD (FLAG) : NOVALUE = ; 0423 1 ; 0424 1 !++ ; 0425 1 ! FUNCTIONAL DESCRIPTION: ; 0426 1 ! ; 0427 1 ! This routine is called to start buffering an amount of data ; 0428 1 ! which should not be output until TT_OUTPUT is called. It ; 0429 1 ! sets a flag to indicate that output should not be done on ; 0430 1 ! CRLF's. ; 0431 1 ! ; 0432 1 ! CALLING SEQUENCE: ; 0433 1 ! ; 0434 1 ! TT_HOLD (TRUE or FALSE); ; 0435 1 ! ; 0436 1 ! INPUT PARAMETERS: ; 0437 1 ! ; 0438 1 ! FLAG - True if output should be held past LF's. False if output ; 0439 1 ! should be dumped on each LF. ; 0440 1 ! ; 0441 1 ! IMPLICIT INPUTS: ; 0442 1 ! ; 0443 1 ! None. ; 0444 1 ! ; 0445 1 ! OUPTUT PARAMETERS: ; 0446 1 ! ; 0447 1 ! None. ; 0448 1 ! ; 0449 1 ! IMPLICIT OUTPUTS: ; 0450 1 ! ; 0451 1 ! HOLD_FLAG is set to true. ; 0452 1 ! ; 0453 1 ! COMPLETION CODES: ; 0454 1 ! ; 0455 1 ! None. ; 0456 1 ! ; 0457 1 ! SIDE EFFECTS: ; 0458 1 ! ; 0459 1 ! None. ; 0460 1 ! ; 0461 1 !-- ; 0462 1 ; 0463 2 BEGIN ; 0464 2 HOLD_FLAG = .FLAG; ; 0465 1 END; ! End of TT_HOLD .ENTRY TT_HOLD, ^M<> ;TT_HOLD, Save nothing ; 0422 MOVL 4(AP), W^U.1 ;FLAG, U.1 ; 0464 RET ; ; 0465 ; Routine Size: 9 bytes, Routine Base: $CODE$ + 0026 ; 0466 1 ; 0467 1 %SBTTL 'Terminal routines -- TT_OUTPUT - Output the buffer' ; 0468 1 ; 0469 1 GLOBAL ROUTINE TT_OUTPUT : NOVALUE = ; 0470 1 ; 0471 1 !++ ; 0472 1 ! FUNCTIONAL DESCRIPTION: ; 0473 1 ! ; 0474 1 ! This routine will dump the text buffer on the output device. ; 0475 1 ! ; 0476 1 ! CALLING SEQUENCE: ; 0477 1 ! ; 0478 1 ! TT_OUTPUT(); ; 0479 1 ! ; 0480 1 ! INPUT PARAMETERS: ; 0481 1 ! ; 0482 1 ! None. ; 0483 1 ! ; 0484 1 ! IMPLICIT INPUTS: ; 0485 1 ! ; 0486 1 ! None. ; 0487 1 ! ; 0488 1 ! OUTPUT PARAMETERS: ; 0489 1 ! ; 0490 1 ! None. ; 0491 1 ! ; 0492 1 ! IMPLICIT OUTPUTS: ; 0493 1 ! ; 0494 1 ! None. ; 0495 1 ! ; 0496 1 ! COMPLETION CODES: ; 0497 1 ! ; 0498 1 ! None. ; 0499 1 ! ; 0500 1 ! SIDE EFFECTS: ; 0501 1 ! ; 0502 1 ! None. ; 0503 1 ! ; 0504 1 !-- ; 0505 1 ; 0506 2 BEGIN ; 0507 2 ; 0508 2 LOCAL ; 0509 2 STATUS; ! Status returned by the library routine ; 0510 2 ; 0511 2 ! ; 0512 2 ! Output the text ; 0513 2 ! ; 0514 2 CH$WCHAR_A (CHR_NUL, TEXT_POINTER); ; 0515 2 (.DUMP_ROUTINE) (TEXT_BUFFER, .TEXT_COUNT); ! Output the buffer to the correct place ; 0516 2 ! ; 0517 2 ! Now reset the descriptor and the pointer to a virgin state ; 0518 2 ! ; 0519 2 TEXT_COUNT = 0; ; 0520 2 TEXT_POINTER = CH$PTR (TEXT_BUFFER); ; 0521 2 ! ; 0522 1 END; ! End of TT_OUTPUT .ENTRY TT_OUTPUT, ^M ;TT_OUTPUT, Save R2 ; 0469 MOVAB W^U.4, R2 ;U.4, R2 ; CLRB @0(R2) ;@TEXT_POINTER ; 0514 INCL (R2) ;TEXT_POINTER ; PUSHL -4(R2) ;TEXT_COUNT ; 0515 PUSHAB 4(R2) ;TEXT_BUFFER ; CALLS #2, @-8(R2) ;#2, @DUMP_ROUTINE ; CLRL -4(R2) ;TEXT_COUNT ; 0519 MOVAB 4(R2), (R2) ;TEXT_BUFFER, TEXT_POINTER ; 0520 RET ; ; 0522 ; Routine Size: 30 bytes, Routine Base: $CODE$ + 002F ; 0523 1 ; 0524 1 %SBTTL 'Terminal routines -- TT_CHAR - Output a single character' ; 0525 1 ; 0526 1 GLOBAL ROUTINE TT_CHAR (CHARACTER) : NOVALUE = ; 0527 1 ; 0528 1 !++ ; 0529 1 ! FUNCTIONAL DESCRIPTION: ; 0530 1 ! ; 0531 1 ! This routine will store a character into the text buffer. It will ; 0532 1 ! cause the text to be output if the character is a line terminator. ; 0533 1 ! ; 0534 1 ! CALLING SEQUENCE: ; 0535 1 ! ; 0536 1 ! TT_CHAR(Character); ; 0537 1 ! ; 0538 1 ! INPUT PARAMETERS: ; 0539 1 ! ; 0540 1 ! Character - Character to store into the text buffer. ; 0541 1 ! ; 0542 1 ! IMPLICIT INPUTS: ; 0543 1 ! ; 0544 1 ! None. ; 0545 1 ! ; 0546 1 ! OUTPUT PARAMETERS: ; 0547 1 ! ; 0548 1 ! None. ; 0549 1 ! ; 0550 1 ! IMPLICIT OUTPUTS: ; 0551 1 ! ; 0552 1 ! None. ; 0553 1 ! ; 0554 1 ! COMPLETION CODES: ; 0555 1 ! ; 0556 1 ! None. ; 0557 1 ! ; 0558 1 ! SIDE EFFECTS: ; 0559 1 ! ; 0560 1 ! None. ; 0561 1 ! ; 0562 1 !-- ; 0563 1 ; 0564 2 BEGIN ; 0565 2 ! ; 0566 2 ! Increment the count of the characters ; 0567 2 ! ; 0568 2 TEXT_COUNT = .TEXT_COUNT + 1; ; 0569 2 ! ; 0570 2 ! And store the character ; 0571 2 ! ; 0572 2 CH$WCHAR_A (.CHARACTER, TEXT_POINTER); ; 0573 2 ! ; 0574 2 ! If this is a line feed then just output the text string ; 0575 2 ! ; 0576 2 ; 0577 2 IF (.CHARACTER EQL CHR_LFD) AND NOT .HOLD_FLAG THEN TT_OUTPUT (); ; 0578 2 ; 0579 2 ! ; 0580 2 ! Check to make sure we are not exceeding the limit of the buffer ; 0581 2 ! ; 0582 2 ; 0583 2 IF .TEXT_COUNT EQL TEXT_BFR_LENGTH - 1 THEN TT_OUTPUT (); ; 0584 2 ; 0585 2 ! ; 0586 1 END; ! End of TT_CHAR .ENTRY TT_CHAR, ^M ;TT_CHAR, Save R2 ; 0526 MOVAB W^U.3, R2 ;U.3, R2 ; INCL (R2) ;TEXT_COUNT ; 0568 MOVB 4(AP), @4(R2) ;CHARACTER, @TEXT_POINTER ; 0572 INCL 4(R2) ;TEXT_POINTER ; CMPL 4(AP), #10 ;CHARACTER, #10 ; 0577 BNEQ 1$ ;1$ ; BLBS -8(R2), 1$ ;HOLD_FLAG, 1$ ; CALLS #0, B^TT_OUTPUT ;#0, TT_OUTPUT ; 1$: CMPL (R2), #255 ;TEXT_COUNT, #255 ; 0583 BNEQ 2$ ;2$ ; CALLS #0, B^TT_OUTPUT ;#0, TT_OUTPUT ; 2$: RET ; ; 0586 ; Routine Size: 45 bytes, Routine Base: $CODE$ + 004D ; 0587 1 ; 0588 1 %SBTTL 'Terminal routines -- TT_TEXT - Output a text string' ; 0589 1 ; 0590 1 GLOBAL ROUTINE TT_TEXT (ADDRESS) : NOVALUE = ; 0591 1 ; 0592 1 !++ ; 0593 1 ! FUNCTIONAL DESCRIPTION: ; 0594 1 ! ; 0595 1 ! This routine will output text on the user's terminal. It will ; 0596 1 ! assume that it must check to determine if it can output the text ; 0597 1 ! or not. ; 0598 1 ! ; 0599 1 ! CALLING SEQUENCE: ; 0600 1 ! ; 0601 1 ! TT_TEXT(TEXT_ADDRESS); ; 0602 1 ! ; 0603 1 ! INPUT PARAMETERS: ; 0604 1 ! ; 0605 1 ! None. ; 0606 1 ! ; 0607 1 ! IMPLICIT INPUTS: ; 0608 1 ! ; 0609 1 ! None. ; 0610 1 ! ; 0611 1 ! OUTPUT PARAMETERS: ; 0612 1 ! ; 0613 1 ! None. ; 0614 1 ! ; 0615 1 ! IMPLICIT OUTPUTS: ; 0616 1 ! ; 0617 1 ! None. ; 0618 1 ! ; 0619 1 ! COMPLETION CODES: ; 0620 1 ! ; 0621 1 ! None. ; 0622 1 ! ; 0623 1 ! SIDE EFFECTS: ; 0624 1 ! ; 0625 1 ! None. ; 0626 1 ! ; 0627 1 !-- ; 0628 1 ; 0629 2 BEGIN ; 0630 2 ; 0631 2 LOCAL ; 0632 2 CHARACTER, ! Character being processed ; 0633 2 ARG_POINTER; ! Pointer to the argument's text ; 0634 2 ; 0635 2 ! ; 0636 2 ! Construct a pointer to the argument. ; 0637 2 ! ; 0638 2 ARG_POINTER = CH$PTR (.ADDRESS); ; 0639 2 ! ; 0640 2 ! Get the first character that was passed. ; 0641 2 ! ; 0642 2 CHARACTER = CH$RCHAR_A (ARG_POINTER); ; 0643 2 ! ; 0644 2 ! Loop reading characters and calling the output routine to process ; 0645 2 ! them ; 0646 2 ! ; 0647 2 ; 0648 2 WHILE .CHARACTER NEQ CHR_NUL DO ; 0649 3 BEGIN ; 0650 3 TT_CHAR (.CHARACTER); ; 0651 3 CHARACTER = CH$RCHAR_A (ARG_POINTER); ; 0652 2 END; ; 0653 2 ; 0654 1 END; ! End of TT_TEXT .ENTRY TT_TEXT, ^M ;TT_TEXT, Save R2,R3 ; 0590 MOVL 4(AP), R2 ;ADDRESS, ARG_POINTER ; 0638 1$: MOVZBL (R2)+, R3 ;(ARG_POINTER)+, CHARACTER ; 0642 BEQL 2$ ;2$ ; 0648 PUSHL R3 ;CHARACTER ; 0650 CALLS #1, B^TT_CHAR ;#1, TT_CHAR ; BRB 1$ ;1$ ; 0651 2$: RET ; ; 0654 ; Routine Size: 20 bytes, Routine Base: $CODE$ + 007A ; 0655 1 ; 0656 1 %SBTTL 'Terminal routines -- TT_NUMBER - Output a three digit number' ; 0657 1 ; 0658 1 GLOBAL ROUTINE TT_NUMBER (NUMBER) : NOVALUE = ; 0659 1 ; 0660 1 !++ ; 0661 1 ! FUNCTIONAL DESCRIPTION: ; 0662 1 ! ; 0663 1 ! This routine will store a three digit number into the text buffer. ; 0664 1 ! It will just return if the number is greater than 999. ; 0665 1 ! ; 0666 1 ! CALLING SEQUENCE: ; 0667 1 ! ; 0668 1 ! TT_NUMBER(Value); ; 0669 1 ! ; 0670 1 ! INPUT PARAMETERS: ; 0671 1 ! ; 0672 1 ! Value - Value to output. ; 0673 1 ! ; 0674 1 ! IMPLICIT INPUTS: ; 0675 1 ! ; 0676 1 ! None. ; 0677 1 ! ; 0678 1 ! OUTPUT PARAMETERS: ; 0679 1 ! ; 0680 1 ! None. ; 0681 1 ! ; 0682 1 ! IMPLICIT OUTPUTS: ; 0683 1 ! ; 0684 1 ! None. ; 0685 1 ! ; 0686 1 ! COMPLETION CODES: ; 0687 1 ! ; 0688 1 ! None. ; 0689 1 ! ; 0690 1 ! SIDE EFFECTS: ; 0691 1 ! ; 0692 1 ! None. ; 0693 1 ! ; 0694 1 !-- ; 0695 1 ; 0696 2 BEGIN ; 0697 2 ROUTINE TT_NUM_WORKER (VALUE) : NOVALUE = ; 0698 3 BEGIN ; 0699 3 ; 0700 3 IF .VALUE LEQ 9 ; 0701 3 THEN ; 0702 3 TT_CHAR (.VALUE + %C'0') ; 0703 3 ELSE ; 0704 4 BEGIN ; 0705 4 TT_NUM_WORKER (.VALUE/10); ; 0706 4 TT_CHAR ((.VALUE MOD 10) + %C'0'); ; 0707 3 END; ; 0708 3 ; 0709 2 END; ;TT_NUM_WORKER U.13: .WORD ^M<> ;Save nothing ; 0697 CMPL 4(AP), #9 ;VALUE, #9 ; 0700 BGTR 1$ ;1$ ; ADDL3 #48, 4(AP), -(SP) ;#48, VALUE, -(SP) ; 0702 BRB 2$ ;2$ ; 1$: DIVL3 #10, 4(AP), -(SP) ;#10, VALUE, -(SP) ; 0705 CALLS #1, B^U.13 ;#1, U.13 ; EMUL #1, 4(AP), #0, -(SP) ;#1, VALUE, #0, -(SP) ; 0706 EDIV #10, (SP)+, R0, R0 ;#10, (SP)+, R0, R0 ; PUSHAB 48(R0) ;48(R0) ; 2$: CALLS #1, B^TT_CHAR ;#1, TT_CHAR ; RET ; ; 0709 ; Routine Size: 43 bytes, Routine Base: $CODE$ + 008E ; 0710 2 ; 0711 2 IF .NUMBER LSS 0 ; 0712 2 THEN ; 0713 3 BEGIN ; 0714 3 TT_CHAR (%C'-'); ; 0715 3 NUMBER = -.NUMBER; ; 0716 2 END; ; 0717 2 ; 0718 2 TT_NUM_WORKER (.NUMBER); ; 0719 1 END; ! End of TT_NUMBER .ENTRY TT_NUMBER, ^M<> ;TT_NUMBER, Save nothing ; 0658 TSTL 4(AP) ;NUMBER ; 0711 BGEQ 1$ ;1$ ; PUSHL #45 ;#45 ; 0714 CALLS #1, B^TT_CHAR ;#1, TT_CHAR ; MNEGL 4(AP), 4(AP) ;NUMBER, NUMBER ; 0715 1$: PUSHL 4(AP) ;NUMBER ; 0718 CALLS #1, B^U.13 ;#1, U.13 ; RET ; ; 0719 ; Routine Size: 26 bytes, Routine Base: $CODE$ + 00B9 ; 0720 1 ; 0721 1 %SBTTL 'Terminal routines -- TT_CRLF - Output a CRLF' ; 0722 1 ; 0723 1 GLOBAL ROUTINE TT_CRLF : NOVALUE = ; 0724 1 ; 0725 1 !++ ; 0726 1 ! FUNCTIONAL DESCRIPTION: ; 0727 1 ! ; 0728 1 ! This routine will cause the contents of the terminal buffer to be ; 0729 1 ! output to SYS$OUTPUT:. ; 0730 1 ! ; 0731 1 ! CALLING SEQUENCE: ; 0732 1 ! ; 0733 1 ! TT_CRLF(); ; 0734 1 ! ; 0735 1 ! INPUT PARAMETERS: ; 0736 1 ! ; 0737 1 ! None. ; 0738 1 ! ; 0739 1 ! IMPLICIT INPUTS: ; 0740 1 ! ; 0741 1 ! None. ; 0742 1 ! ; 0743 1 ! OUTPUT PARAMETERS: ; 0744 1 ! ; 0745 1 ! None. ; 0746 1 ! ; 0747 1 ! IMPLICIT OUTPUTS: ; 0748 1 ! ; 0749 1 ! None. ; 0750 1 ! ; 0751 1 ! COMPLETION CODES: ; 0752 1 ! ; 0753 1 ! None. ; 0754 1 ! ; 0755 1 ! SIDE EFFECTS: ; 0756 1 ! ; 0757 1 ! None. ; 0758 1 ! ; 0759 1 !-- ; 0760 1 ; 0761 2 BEGIN ; 0762 2 TT_CHAR (CHR_CRT); ; 0763 2 TT_CHAR (CHR_LFD); ; 0764 1 END; ! End of TT_CRLF .ENTRY TT_CRLF, ^M<> ;TT_CRLF, Save nothing ; 0723 PUSHL #13 ;#13 ; 0762 CALLS #1, W^TT_CHAR ;#1, TT_CHAR ; PUSHL #10 ;#10 ; 0763 CALLS #1, W^TT_CHAR ;#1, TT_CHAR ; RET ; ; 0764 ; Routine Size: 17 bytes, Routine Base: $CODE$ + 00D3 ; 0765 1 ; 0766 1 %SBTTL 'End of KERTRM' ; 0767 1 END ! End of module ; 0768 1 ; 0769 0 ELUDOM ; PSECT SUMMARY ; ; Name Bytes Attributes ; ; $OWN$ 272 NOVEC, WRT, RD ,NOEXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; $CODE$ 228 NOVEC,NOWRT, RD , EXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; . ABS . 0 NOVEC,NOWRT,NORD ,NOEXE,NOSHR, LCL, ABS, CON,NOPIC,ALIGN(0) ; COMMAND QUALIFIERS ; BLISS KERTT/LIST=KERTT.MAR/MACHINE_CODE=(ASSEM,NOBINARY,UNIQUE)/NOOBJECT/SOURCE=NOHEADER ; Compilation Complete .END