; 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 TWOSEG .REQUEST DSKB:B361LB.REL[1,4] 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 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==: 61 CHK%2CHAR==: 62 CHK%CRC==: 63 MAX%MSG==: 140 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 ; 0319 MOVE AC1,C.1 ; 0320 MOVEM AC1,U.3 MOVEI AC1,TERM%DUMP ; 0321 MOVEM AC1,U.1 POPJ SP, ; 0277 C.1: POINT 7,U.4-1,34 ; Routine Size: 7 words ; 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 TT%SET%OUTPUT:: MOVE AC1,U.1 ; 0369 MOVE AC2,-1(SP) ; 0370 MOVEM AC2,U.1 POPJ SP, ; 0325 ; Routine Size: 4 words ; 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 TT%OUTPUT:: SETZ AC1, ; 0420 IDPB AC1,U.3 MOVE AC1,U.1 ; 0421 PUSH SP,C.2 PUSH SP,U.2 PUSHJ SP,0(AC1) SETZM U.2 ; 0425 MOVE AC1,C.1 ; 0426 MOVEM AC1,U.3 ADJSP SP,-2 ; 0412 POPJ SP, ; 0375 C.2: XWD 0,U.4 ; Routine Size: 12 words ; 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 TT%CHAR:: AOS U.2 ; 0473 MOVE AC1,-1(SP) ; 0477 IDPB AC1,U.3 MOVEI AC1,12 ; 0482 CAMN AC1,-1(SP) PUSHJ SP,TT%OUTPUT MOVEI AC1,377 ; 0486 CAMN AC1,U.2 PUSHJ SP,TT%OUTPUT POPJ SP, ; 0431 ; Routine Size: 10 words ; 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 TT%TEXT:: PUSH SP,AC14 ; 0494 PUSH SP,AC16 MOVE AC1,-3(SP) ; 0542 MOVEI AC1,-1(AC1) HRLI AC1,10700 MOVE AC14,AC1 ILDB AC16,AC14 ; 0546 L.1: JUMPE AC16,L.2 ; 0552 PUSH SP,AC16 ; 0554 PUSHJ SP,TT%CHAR ILDB AC16,AC14 ; 0555 ADJSP SP,-1 ; 0553 JRST L.1 ; 0552 L.2: POP SP,AC16 ; 0494 POP SP,AC14 POPJ SP, ; Routine Size: 16 words ; 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: PUSH SP,AC16 ; 0601 MOVE AC16,-2(SP) ; 0604 CAILE AC16,11 JRST L.3 MOVE AC1,AC16 ; 0606 ADDI AC1,60 PUSH SP,AC1 PUSHJ SP,TT%CHAR JRST L.4 ; 0604 L.3: MOVE AC1,AC16 ; 0609 IDIVI AC1,12 PUSH SP,AC1 PUSHJ SP,U.11 MOVE AC1,AC16 ; 0610 IDIVI AC1,12 ADDI AC2,60 PUSH SP,AC2 PUSHJ SP,TT%CHAR ADJSP SP,-1 ; 0608 L.4: ADJSP SP,-1 ; 0602 POP SP,AC16 ; 0601 POPJ SP, ; Routine Size: 22 words ; 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 TT%NUMBER:: SKIPL -1(SP) ; 0615 JRST L.5 PUSH SP,C.3 ; 0618 PUSHJ SP,TT%CHAR MOVNS -2(SP) ; 0619 ADJSP SP,-1 ; 0617 L.5: PUSH SP,-1(SP) ; 0622 PUSHJ SP,U.11 ADJSP SP,-1 ; 0600 POPJ SP, ; 0562 C.3: EXP 55 ; Routine Size: 11 words ; 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 TT%CRLF:: PUSH SP,C.4 ; 0666 PUSHJ SP,TT%CHAR PUSH SP,C.5 ; 0667 PUSHJ SP,TT%CHAR ADJSP SP,-2 ; 0665 POPJ SP, ; 0627 C.4: EXP 15 C.5: EXP 12 ; Routine Size: 8 words ; 0669 ; 0670 %SBTTL 'End of KERTRM' ; 0671 END ! End of module ; 0672 ; 0673 ELUDOM END ; Low segment length: 55 words ; High segment length: 90 words ; Compilation Complete END