; 0001 MODULE KERTT (IDENT = '2.0.003' ; 0002 ) = ; 0003 BEGIN ; 0004 ; 0005 SWITCHES LANGUAGE (COMMON); ; 0006 ; 0007 ! ; 0008 ; 0009 !++ ; 0010 ! FACILITY: ; 0011 ! ; 0012 ! KERMIT text processing ; 0013 ! ; 0014 ! ABSTRACT: ; 0015 ! ; 0016 ! This module contains all of the text processing required for ; 0017 ! KERMSG. ; 0018 ! ; 0019 ! ENVIRONMENT: ; 0020 ! ; 0021 ! TOPS-10, P/OS, VAX/VMS ; 0022 ! ; 0023 ! AUTHOR: Robert C. McQueen, CREATION DATE: 29-August-1983 ; 0024 !-- ; 0025 ; 0026 %SBTTL 'Table of Contents' ; 0027 ! ; 0028 ! TABLE OF CONTENTS: ; 0029 ! ; 0030 %SBTTL 'Revision History' ; 0031 ; 0032 !++ ; 0033 ! ; 0034 ! Create this module for PRO/Kermit 1.0, Kermit-10 2(100) and Kermit-32 1.2 ; 0035 ! ; 0036 ! 1.2.000 By: Robert C. McQueen On: 29-August-1983 ; 0037 ! Create this module. ; 0038 ! ; 0039 ! 1.2.001 By: Robert C. McQueen On: 9-Sept-1983 ; 0040 ! Make the string passed to TERM_DUMP a counted ASCIZ string, ; 0041 ! not a counted ASCII string. ; 0042 ! ; 0043 ! 1.2.002 By: Robert C. McQueen On: 16-September-1983 ; 0044 ! Make TT_OUTPUT a global routine, so we can force information ; 0045 ! output a various points in time. ; 0046 ! ; 0047 ! 2.0.003 Release for TOPS-10 KERMIT-10 version 2. ; 0048 ! Release for VAX/VMS KERMIT-32 version 2. ; 0049 !-- ; 0050 ; 0051 %SBTTL 'Library files' ; 0052 ! ; 0053 ! INCLUDE FILES: ; 0054 ! ; 0055 ! ; 0056 ! KERMIT common definitions ; 0057 ! ; 0058 ; 0059 REQUIRE 'KERCOM'; ; 0229 ; 0230 %SBTTL 'Symbol definitions' ; 0231 ! ; 0232 ! EQUATED SYMBOLS: ; 0233 ! ; 0234 ; 0235 LITERAL ; 0236 TEXT_BFR_LENGTH = 256; ! Length of the text buffer ; 0237 ; 0238 %SBTTL 'Storage' ; 0239 ! ; 0240 ! OWN STORAGE: ; 0241 ! ; 0242 ! ; 0243 ! TT_xxxxx routine storage ; 0244 ! ; 0245 ; 0246 OWN ; 0247 DUMP_ROUTINE, ! Address of routine to dump text ; 0248 TEXT_COUNT, ! Count of the characters ; 0249 TEXT_POINTER, ! Pointer to store characters ; 0250 TEXT_BUFFER : VECTOR [CH$ALLOCATION (TEXT_BFR_LENGTH)]; ! Buffer of characters ; 0251 ; 0252 %SBTTL 'External storage' ; 0253 ; 0254 !++ ; 0255 ! The following is the various external storage locations that are ; 0256 ! referenced from this module. ; 0257 !-- ; 0258 ; 0259 ! ; 0260 ! KERMSG storage ; 0261 ! ; 0262 ; 0263 EXTERNAL ; 0264 CONNECT_FLAG; ! Flag if communications line is TT: ; 0265 ; 0266 !++ ; 0267 ! The following is the only external routine used by this module. This ; 0268 ! routine will cause the terminal buffer that we have been building to be ; 0269 ! output on the terminal ; 0270 !-- ; 0271 ; 0272 EXTERNAL ROUTINE ; 0273 TERM_DUMP : NOVALUE; ! Output the terminal buffer ; 0274 ; 0275 %SBTTL 'Terminal routines -- TT_INIT - Initialize this module' ; 0276 ; 0277 GLOBAL ROUTINE TT_INIT : NOVALUE = ; 0278 ; 0279 !++ ; 0280 ! FUNCTIONAL DESCRIPTION: ; 0281 ! ; 0282 ! This routine will initialize the terminal processing module. It will ; 0283 ! initialize the various data locations in this module. ; 0284 ! ; 0285 ! CALLING SEQUENCE: ; 0286 ! ; 0287 ! TT_INIT(); ; 0288 ! ; 0289 ! INPUT PARAMETERS: ; 0290 ! ; 0291 ! None. ; 0292 ! ; 0293 ! IMPLICIT INPUTS: ; 0294 ! ; 0295 ! None. ; 0296 ! ; 0297 ! OUTPUT PARAMETERS: ; 0298 ! ; 0299 ! None. ; 0300 ! ; 0301 ! IMPLICIT OUTPUTS: ; 0302 ! ; 0303 ! None. ; 0304 ! ; 0305 ! COMPLETION CODES: ; 0306 ! ; 0307 ! None. ; 0308 ! ; 0309 ! SIDE EFFECTS: ; 0310 ! ; 0311 ! None. ; 0312 ! ; 0313 !-- ; 0314 ; 0315 BEGIN ; 0316 ! ; 0317 ! Now initialize the various pointers ; 0318 ! ; 0319 TEXT_COUNT = 0; ; 0320 TEXT_POINTER = CH$PTR (TEXT_BUFFER); ; 0321 DUMP_ROUTINE = TERM_DUMP; ! Initial output routine is to terminal ; 0322 END; ! End of TT_INIT .TITLE KERTT .IDENT \2.0.003\ .PSECT $OWN$,NOEXE,2 ;DUMP_ROUTINE U.1: .BLKB 4 ;TEXT_COUNT U.2: .BLKB 4 ;TEXT_POINTER U.3: .BLKB 4 ;TEXT_BUFFER U.4: .BLKB 256 PR_MIN== 0 PR_NONE== 0 PR_MARK== 1 PR_EVEN== 2 PR_ODD== 3 PR_SPACE== 4 PR_MAX== 4 GC_MIN== 0 GC_LOGOUT== 0 GC_EXIT== 1 GC_MAX== 1 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 nothing ; 0277 CLRL W^U.2 ;U.2 ; 0319 MOVAB W^U.4, W^U.3 ;U.4, U.3 ; 0320 MOVAB W^TERM_DUMP, W^U.1 ;TERM_DUMP, U.1 ; 0321 RET ; ; 0277 ; Routine Size: 21 bytes, Routine Base: $CODE$ + 0000 ; 0323 ; 0324 %SBTTL 'TT_SET_OUTPUT - Set output routine to use' ; 0325 GLOBAL ROUTINE TT_SET_OUTPUT (OUT_RTN) = ; 0326 ; 0327 !++ ; 0328 ! FUNCTIONAL DESCRIPTION: ; 0329 ! ; 0330 ! This routine will set the output routine to use for the TT_xxx routines. ; 0331 !The argument is a routine address which will output a counted ASCIZ string. ; 0332 !It will return the address of the previous output routine. ; 0333 ! ; 0334 ! CALLING SEQUENCE: ; 0335 ! ; 0336 ! OLD_RTN = TT_SET_OUTPUT (OUT_RTN); ; 0337 ! ; 0338 ! INPUT PARAMETERS: ; 0339 ! ; 0340 ! OUT_RTN - Address of routine to output a counted ASCIZ string ; 0341 ! called as OUT_RTN (Address of string, length of string) ; 0342 ! ; 0343 ! IMPLICIT INPUTS: ; 0344 ! ; 0345 ! DUMP_ROUTINE - Previous output routine ; 0346 ! ; 0347 ! OUPTUT PARAMETERS: ; 0348 ! ; 0349 ! The value of the routine is the previous output routine address. ; 0350 ! ; 0351 ! IMPLICIT OUTPUTS: ; 0352 ! ; 0353 ! DUMP_ROUTINE - New output routine ; 0354 ! ; 0355 ! COMPLETION CODES: ; 0356 ! ; 0357 ! None. ; 0358 ! ; 0359 ! SIDE EFFECTS: ; 0360 ! ; 0361 ! None. ; 0362 ! ; 0363 !-- ; 0364 ; 0365 BEGIN ; 0366 LOCAL ; 0367 OLD_RTN; ! Old routine address ; 0368 ; 0369 OLD_RTN = .DUMP_ROUTINE; ! Remember the old address ; 0370 DUMP_ROUTINE = .OUT_RTN; ! Save the new ; 0371 RETURN .OLD_RTN; ! And return the old value ; 0372 END; ! End of TT_SET_OUTPUT .ENTRY TT_SET_OUTPUT, ^M<> ;TT_SET_OUTPUT, Save nothing ; 0325 MOVL W^U.1, R0 ;U.1, OLD_RTN ; 0369 MOVL 4(AP), W^U.1 ;OUT_RTN, U.1 ; 0370 RET ; ; 0325 ; Routine Size: 14 bytes, Routine Base: $CODE$ + 0015 ; 0373 ; 0374 %SBTTL 'Terminal routines -- TT_OUTPUT - Output the buffer' ; 0375 GLOBAL ROUTINE TT_OUTPUT : NOVALUE = ; 0376 ; 0377 !++ ; 0378 ! FUNCTIONAL DESCRIPTION: ; 0379 ! ; 0380 ! This routine will dump the text buffer on the output device. ; 0381 ! ; 0382 ! CALLING SEQUENCE: ; 0383 ! ; 0384 ! TT_OUTPUT(); ; 0385 ! ; 0386 ! INPUT PARAMETERS: ; 0387 ! ; 0388 ! None. ; 0389 ! ; 0390 ! IMPLICIT INPUTS: ; 0391 ! ; 0392 ! None. ; 0393 ! ; 0394 ! OUTPUT PARAMETERS: ; 0395 ! ; 0396 ! None. ; 0397 ! ; 0398 ! IMPLICIT OUTPUTS: ; 0399 ! ; 0400 ! None. ; 0401 ! ; 0402 ! COMPLETION CODES: ; 0403 ! ; 0404 ! None. ; 0405 ! ; 0406 ! SIDE EFFECTS: ; 0407 ! ; 0408 ! None. ; 0409 ! ; 0410 !-- ; 0411 ; 0412 BEGIN ; 0413 ; 0414 LOCAL ; 0415 STATUS; ! Status returned by the library routine ; 0416 ; 0417 ! ; 0418 ! Output the text ; 0419 ! ; 0420 CH$WCHAR_A (CHR_NUL, TEXT_POINTER); ; 0421 (.DUMP_ROUTINE) (TEXT_BUFFER, .TEXT_COUNT); ! Output the buffer to the correct place ; 0422 ! ; 0423 ! Now reset the descriptor and the pointer to a virgin state ; 0424 ! ; 0425 TEXT_COUNT = 0; ; 0426 TEXT_POINTER = CH$PTR (TEXT_BUFFER); ; 0427 ! ; 0428 END; ! End of TT_OUTPUT .ENTRY TT_OUTPUT, ^M ;TT_OUTPUT, Save R2 ; 0375 MOVAB W^U.3, R2 ;U.3, R2 ; CLRB @0(R2) ;@TEXT_POINTER ; 0420 INCL (R2) ;TEXT_POINTER ; PUSHL -4(R2) ;TEXT_COUNT ; 0421 PUSHAB 4(R2) ;TEXT_BUFFER ; CALLS #2, @-8(R2) ;#2, @DUMP_ROUTINE ; CLRL -4(R2) ;TEXT_COUNT ; 0425 MOVAB 4(R2), (R2) ;TEXT_BUFFER, TEXT_POINTER ; 0426 RET ; ; 0375 ; Routine Size: 30 bytes, Routine Base: $CODE$ + 0023 ; 0429 %SBTTL 'Terminal routines -- TT_CHAR - Output a single character' ; 0430 ; 0431 GLOBAL ROUTINE TT_CHAR (CHARACTER) : NOVALUE = ; 0432 ; 0433 !++ ; 0434 ! FUNCTIONAL DESCRIPTION: ; 0435 ! ; 0436 ! This routine will store a character into the text buffer. It will ; 0437 ! cause the text to be output if the character is a line terminator. ; 0438 ! ; 0439 ! CALLING SEQUENCE: ; 0440 ! ; 0441 ! TT_CHAR(Character); ; 0442 ! ; 0443 ! INPUT PARAMETERS: ; 0444 ! ; 0445 ! Character - Character to store into the text buffer. ; 0446 ! ; 0447 ! IMPLICIT INPUTS: ; 0448 ! ; 0449 ! None. ; 0450 ! ; 0451 ! OUTPUT PARAMETERS: ; 0452 ! ; 0453 ! None. ; 0454 ! ; 0455 ! IMPLICIT OUTPUTS: ; 0456 ! ; 0457 ! None. ; 0458 ! ; 0459 ! COMPLETION CODES: ; 0460 ! ; 0461 ! None. ; 0462 ! ; 0463 ! SIDE EFFECTS: ; 0464 ! ; 0465 ! None. ; 0466 ! ; 0467 !-- ; 0468 ; 0469 BEGIN ; 0470 ! ; 0471 ! Increment the count of the characters ; 0472 ! ; 0473 TEXT_COUNT = .TEXT_COUNT + 1; ; 0474 ! ; 0475 ! And store the character ; 0476 ! ; 0477 CH$WCHAR_A (.CHARACTER, TEXT_POINTER); ; 0478 ! ; 0479 ! If this is a line feed then just output the text string ; 0480 ! ; 0481 ; 0482 IF .CHARACTER EQL CHR_LFD THEN TT_OUTPUT (); ; 0483 ! ; 0484 ! Check to make sure we are not exceeding the limit of the buffer ; 0485 ! ; 0486 IF .TEXT_COUNT EQL TEXT_BFR_LENGTH-1 THEN TT_OUTPUT (); ; 0487 ; 0488 ; 0489 ! ; 0490 END; ! End of TT_CHAR .ENTRY TT_CHAR, ^M ;TT_CHAR, Save R2 ; 0431 MOVAB W^U.2, R2 ;U.2, R2 ; INCL (R2) ;TEXT_COUNT ; 0473 MOVB 4(AP), @4(R2) ;CHARACTER, @TEXT_POINTER ; 0477 INCL 4(R2) ;TEXT_POINTER ; CMPL 4(AP), #10 ;CHARACTER, #10 ; 0482 BNEQ 1$ ;1$ ; CALLS #0, B^TT_OUTPUT ;#0, TT_OUTPUT ; 1$: CMPL (R2), #255 ;TEXT_COUNT, #255 ; 0486 BNEQ 2$ ;2$ ; CALLS #0, B^TT_OUTPUT ;#0, TT_OUTPUT ; 2$: RET ; ; 0431 ; Routine Size: 41 bytes, Routine Base: $CODE$ + 0041 ; 0491 ; 0492 %SBTTL 'Terminal routines -- TT_TEXT - Output a text string' ; 0493 ; 0494 GLOBAL ROUTINE TT_TEXT (ADDRESS) : NOVALUE = ; 0495 ; 0496 !++ ; 0497 ! FUNCTIONAL DESCRIPTION: ; 0498 ! ; 0499 ! This routine will output text on the user's terminal. It will ; 0500 ! assume that it must check to determine if it can output the text ; 0501 ! or not. ; 0502 ! ; 0503 ! CALLING SEQUENCE: ; 0504 ! ; 0505 ! TT_TEXT(TEXT_ADDRESS); ; 0506 ! ; 0507 ! INPUT PARAMETERS: ; 0508 ! ; 0509 ! None. ; 0510 ! ; 0511 ! IMPLICIT INPUTS: ; 0512 ! ; 0513 ! None. ; 0514 ! ; 0515 ! OUTPUT PARAMETERS: ; 0516 ! ; 0517 ! None. ; 0518 ! ; 0519 ! IMPLICIT OUTPUTS: ; 0520 ! ; 0521 ! None. ; 0522 ! ; 0523 ! COMPLETION CODES: ; 0524 ! ; 0525 ! None. ; 0526 ! ; 0527 ! SIDE EFFECTS: ; 0528 ! ; 0529 ! None. ; 0530 ! ; 0531 !-- ; 0532 ; 0533 BEGIN ; 0534 ; 0535 LOCAL ; 0536 CHARACTER, ! Character being processed ; 0537 ARG_POINTER; ! Pointer to the argument's text ; 0538 ; 0539 ! ; 0540 ! Construct a pointer to the argument. ; 0541 ! ; 0542 ARG_POINTER = CH$PTR (.ADDRESS); ; 0543 ! ; 0544 ! Get the first character that was passed. ; 0545 ! ; 0546 CHARACTER = CH$RCHAR_A (ARG_POINTER); ; 0547 ! ; 0548 ! Loop reading characters and calling the output routine to process ; 0549 ! them ; 0550 ! ; 0551 ; 0552 WHILE .CHARACTER NEQ CHR_NUL DO ; 0553 BEGIN ; 0554 TT_CHAR (.CHARACTER); ; 0555 CHARACTER = CH$RCHAR_A (ARG_POINTER); ; 0556 END; ; 0557 ; 0558 END; ! End of TT_TEXT .ENTRY TT_TEXT, ^M ;TT_TEXT, Save R2,R3 ; 0494 MOVL 4(AP), R2 ;ADDRESS, ARG_POINTER ; 0542 1$: MOVZBL (R2)+, R3 ;(ARG_POINTER)+, CHARACTER ; 0546 BEQL 2$ ;2$ ; 0552 PUSHL R3 ;CHARACTER ; 0554 CALLS #1, B^TT_CHAR ;#1, TT_CHAR ; BRB 1$ ;1$ ; 0555 2$: RET ; ; 0494 ; Routine Size: 20 bytes, Routine Base: $CODE$ + 006A ; 0559 ; 0560 %SBTTL 'Terminal routines -- TT_NUMBER - Output a three digit number' ; 0561 ; 0562 GLOBAL ROUTINE TT_NUMBER (NUMBER) : NOVALUE = ; 0563 ; 0564 !++ ; 0565 ! FUNCTIONAL DESCRIPTION: ; 0566 ! ; 0567 ! This routine will store a three digit number into the text buffer. ; 0568 ! It will just return if the number is greater than 999. ; 0569 ! ; 0570 ! CALLING SEQUENCE: ; 0571 ! ; 0572 ! TT_NUMBER(Value); ; 0573 ! ; 0574 ! INPUT PARAMETERS: ; 0575 ! ; 0576 ! Value - Value to output. ; 0577 ! ; 0578 ! IMPLICIT INPUTS: ; 0579 ! ; 0580 ! None. ; 0581 ! ; 0582 ! OUTPUT PARAMETERS: ; 0583 ! ; 0584 ! None. ; 0585 ! ; 0586 ! IMPLICIT OUTPUTS: ; 0587 ! ; 0588 ! None. ; 0589 ! ; 0590 ! COMPLETION CODES: ; 0591 ! ; 0592 ! None. ; 0593 ! ; 0594 ! SIDE EFFECTS: ; 0595 ! ; 0596 ! None. ; 0597 ! ; 0598 !-- ; 0599 ; 0600 BEGIN ; 0601 ROUTINE TT_NUM_WORKER (VALUE) : NOVALUE = ; 0602 BEGIN ; 0603 ; 0604 IF .VALUE LEQ 9 ; 0605 THEN ; 0606 TT_CHAR (.VALUE + %C'0') ; 0607 ELSE ; 0608 BEGIN ; 0609 TT_NUM_WORKER (.VALUE/10); ; 0610 TT_CHAR ((.VALUE MOD 10) + %C'0'); ; 0611 END; ; 0612 ; 0613 END; ;TT_NUM_WORKER U.11: .WORD ^M<> ;Save nothing ; 0601 CMPL 4(AP), #9 ;VALUE, #9 ; 0604 BGTR 1$ ;1$ ; ADDL3 #48, 4(AP), -(SP) ;#48, VALUE, -(SP) ; 0606 BRB 2$ ;2$ ; 1$: DIVL3 #10, 4(AP), -(SP) ;#10, VALUE, -(SP) ; 0609 CALLS #1, B^U.11 ;#1, U.11 ; EMUL #1, 4(AP), #0, -(SP) ;#1, VALUE, #0, -(SP) ; 0610 EDIV #10, (SP)+, R0, R0 ;#10, (SP)+, R0, R0 ; PUSHAB 48(R0) ;48(R0) ; 2$: CALLS #1, B^TT_CHAR ;#1, TT_CHAR ; RET ; ; 0601 ; Routine Size: 43 bytes, Routine Base: $CODE$ + 007E ; 0614 ; 0615 IF .NUMBER LSS 0 ; 0616 THEN ; 0617 BEGIN ; 0618 TT_CHAR (%C'-'); ; 0619 NUMBER = -.NUMBER; ; 0620 END; ; 0621 ; 0622 TT_NUM_WORKER (.NUMBER); ; 0623 END; ! End of TT_NUMBER .ENTRY TT_NUMBER, ^M<> ;TT_NUMBER, Save nothing ; 0562 TSTL 4(AP) ;NUMBER ; 0615 BGEQ 1$ ;1$ ; PUSHL #45 ;#45 ; 0618 CALLS #1, B^TT_CHAR ;#1, TT_CHAR ; MNEGL 4(AP), 4(AP) ;NUMBER, NUMBER ; 0619 1$: PUSHL 4(AP) ;NUMBER ; 0622 CALLS #1, B^U.11 ;#1, U.11 ; RET ; ; 0562 ; Routine Size: 26 bytes, Routine Base: $CODE$ + 00A9 ; 0624 ; 0625 %SBTTL 'Terminal routines -- TT_CRLF - Output a CRLF' ; 0626 ; 0627 GLOBAL ROUTINE TT_CRLF : NOVALUE = ; 0628 ; 0629 !++ ; 0630 ! FUNCTIONAL DESCRIPTION: ; 0631 ! ; 0632 ! This routine will cause the contents of the terminal buffer to be ; 0633 ! output to SYS$OUTPUT:. ; 0634 ! ; 0635 ! CALLING SEQUENCE: ; 0636 ! ; 0637 ! TT_CRLF(); ; 0638 ! ; 0639 ! INPUT PARAMETERS: ; 0640 ! ; 0641 ! None. ; 0642 ! ; 0643 ! IMPLICIT INPUTS: ; 0644 ! ; 0645 ! None. ; 0646 ! ; 0647 ! OUTPUT PARAMETERS: ; 0648 ! ; 0649 ! None. ; 0650 ! ; 0651 ! IMPLICIT OUTPUTS: ; 0652 ! ; 0653 ! None. ; 0654 ! ; 0655 ! COMPLETION CODES: ; 0656 ! ; 0657 ! None. ; 0658 ! ; 0659 ! SIDE EFFECTS: ; 0660 ! ; 0661 ! None. ; 0662 ! ; 0663 !-- ; 0664 ; 0665 BEGIN ; 0666 TT_CHAR (CHR_CRT); ; 0667 TT_CHAR (CHR_LFD); ; 0668 END; ! End of TT_CRLF .ENTRY TT_CRLF, ^M<> ;TT_CRLF, Save nothing ; 0627 PUSHL #13 ;#13 ; 0666 CALLS #1, W^TT_CHAR ;#1, TT_CHAR ; PUSHL #10 ;#10 ; 0667 CALLS #1, W^TT_CHAR ;#1, TT_CHAR ; RET ; ; 0627 ; Routine Size: 17 bytes, Routine Base: $CODE$ + 00C3 ; 0669 ; 0670 %SBTTL 'End of KERTRM' ; 0671 END ! End of module ; 0672 ; 0673 ELUDOM ; PSECT SUMMARY ; ; Name Bytes Attributes ; ; $OWN$ 268 NOVEC, WRT, RD ,NOEXE,NOSHR, LCL, REL, CON,NOPIC,ALIGN(2) ; $CODE$ 212 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