;TALK.MAC ; ; ; WRITTEN BY: MARK C. WESTON ; CITY OF GAINESVILLE, FLORIDA ; 10-FEB-81 ; ; TERMINAL CONVERSATION PROGRAM PATTERNED AFTER PLATO ; ; THIS PROGRAM ALLOWS TWO TERMINALS TO SIMULTANEOUSLY TALK WITH EACH OTHER ; BY ECHOING INPUT CHARACTER BY CHARACTER ON BOTH TERMINALS. ; THIS PROGRAM IS FOR DEC VT52 TERMINALS ONLY. INPUT IS ECHOED ON LINE 24 ; AND OUTPUT IS ECHOED ON LINE 25. BOTH TERMINAL MAY TYPE SIMULTANEOUSLY. ; ; THE IDEA FOR THIS PROGRAM COMES FROM THE CONTROL DATA CORPORATION ; PLATO TERM TALK FEATURE. (PLATO IS ACTUALLY FROM THE UNIV. OF ILLINOIS). ; ; ALLOWABLE INPUT: ALL ASCII PRINTABLE CHARACTERS ; BELL (CTRL G) ; RETURN (CLEARS LINE) ; CTRL Z (TERMINATE SESSION) ; ; ALL OTHER CODES ARE IGNORED (INCLUDING CONTROL C) ; EXCEPT CTRL Q,S,X, AND O WHICH ARE PASSED TO THE TERMINAL ; HANDLER AND INTERPRETED ACCORDINGLY. ; .TITLE TALK .MCALL QIO$C,ALUN$C,ALUN$S,EXIT$C,SPND$S,WTSE$C .MCALL EXIT$S,MRKT$C,CMKT$S,ASTX$S ; DATA ; IOST: .BLKW 2 ;I/O STATUS BLOCK PROMPT: .ASCII <12><15>/INPUT TERMINAL YOU DESIRE TO TALK WITH/ .ASCII <12><15>/FORM IS TTXX: >/ L.PRMT = .-PROMPT .EVEN INP: .BLKW 3 ;INPUT BUFFER L.INP = .-INP FATT: .ASCII <12><12><15>/SORRY, THAT TERMINAL IS BUSY RIGHT NOW./ .ASCII <12><15>/TRY AGAIN LATER./<12><15> L.FATT = .-FATT CLR: .ASCII <33>/H/<33>/J/<33><131><66><40>/>/<12><15>/>/<33><101> L.CLR = .-CLR END: .ASCII <12><15>/TALK SESSION TERMINATED/ L.END = .-END EEOL: .ASCII />/<33><113> ;ERASE TO END OF LINE FROM COLUMN 2 L.EEOL = .-EEOL DEL: .ASCII <10>/ /<10> L.DEL = .-DEL ; IN1: .BYTE 33,131,66 ;CURSOR ON LINE 23 TI1: .BYTE 41 ;COLUMN 2 L.R1 = .-IN1 TIZ1: .BYTE 0 ;INPUT BYTE L.IN1 = .-IN1 ; IN2: .BYTE 33,131,66 ;CURSOR ON LINE 23 TI2: .BYTE 41 ;COLUMN 2 L.R2 = .-IN2 TIZ2: .BYTE 0 ;INPUT L.IN2 = .-IN2 ; OUT1: .BYTE 33,131,67 ;OUTPUT AT LINE 24 OUTY1: .BYTE 41 ;COLUMN 2 L.S1 = .-OUT1 OUTZ1: .BYTE 0 ;OUTPUT L.OUT1 = .-OUT1 ; OUT2: .BYTE 33,131,67 ;OUTPUT AT LINE 24 OUTY2: .BYTE 41 ;COLUMN 2 L.S2 = .-OUT2 OUTZ2: .BYTE 0 ;OUTPUT L.OUT2 = .-OUT2 ; ; ; CODE ; .EVEN ; ; INITALIZATION ROUTINE ; TALK: ALUN$C 1,TI,0 ;ASSIGN LUN 1 TO TI QIO$C IO.WLB,1,1,,IOST,, ;WRITE PROMPT WTSE$C 1 ;WAIT ON QIO QIO$C IO.RLB,1,1,,IOST,, ;READ TERMINAL NUMBER WTSE$C 1 ;WAIT ON QIO MOV #INP+2,R0 ;GET BEGINNING OF TERMINAL NUMBER CALL $COTB ;CONVERT TERMINAL NUMBER FROM OCTAL TO BINARY ALUN$S #2,#"TT,R1 ;ASSIGN LUN 2 TO OTHER TERMINAL MRKT$C ,5,2,ATF ;MARK TIME FOR ATTACH QIO$C IO.ATA,2,1,,IOST,, ;ATTACH OTHER TERMINAL WTSE$C 1 ;WAIT ON ATTACH CMKT$S ;CANCEL MARK TIME FOR ATTACH QIO$C IO.ATA,1,1,,IOST,, ;ATTACH FIRST TERMINAL WTSE$C 1 ;WAIT ON QIO QIO$C IO.WAL,1,1,,IOST,, ;CLEAR SCREENS WTSE$C 1 ;WAIT ON QIO QIO$C IO.WAL,2,1,,IOST,, ;CLEAR OTHER SCREEN WTSE$C 1 ;WAIT ON QIO SPND$S ;SUSPEND TASK ; ; UNSOLICITED CHARACTER AST INPUT ROUTINE ; ; ; INPUT IS ON TOP OF STACK ; LOW ORDER OF WORD CONTAINS INPUT CHARACTER ; HIGH ORDER OF WORD CONTAINS LUN NUMBER (PARM 2 OF QIO.ATA) ; ASTIO: CMPB #40,(SP) ;INPUT LESS THAN 40 ? BLE CONT ;NO, CONTINUE CMPB #15,(SP) ;CR? BEQ CONT ;YES, CONTINUE CMPB #7,(SP) ;BELL? BEQ CONT ;YES, CONTINUE CMPB #32,(SP) ;CTRL(Z)? BNE IGNORE ;NO, IGNORE INPUT JMP QUIT ;YES, QUIT IGNORE: JMP EXIT ;AST EXIT CONT: CMPB #1,1(SP) ;WHICH LUN? BEQ ONE ;LUN #1 JMP TWO ;LUN #2 ; ; PROCESSING FOR EACH TERMINAL IS THE SAME ; ONE: CMPB #177,(SP) ;DELETE KEY? BNE CONE ;NO CMPB #41,TI1 ;COL 2? BNE OOK ;NO JMP EXIT ;YES, IGNORE AND EXIT OOK: QIO$C IO.WAL,1,1,,IOST,, ;DELETE LAST CHAR WTSE$C 1 ;WAIT DECB TI1 ;DEC POINTER QIO$C IO.WAL,2,1,,IOST,, ;POSITION CURSOR FOR OUTPUT WTSE$C 1 ;WAIT QIO$C IO.WAL,2,1,,IOST,, ;DELETE LAST CHAR WTSE$C 1 ;WAIT DECB OUTY2 ;DECREMENT POINTER QIO$C IO.WAL,2,1,,IOST,, ;RESTORE CURSOR WTSE$C 1 ;WAIT JMP EXIT ;AST EXIT CONE: CMPB #160,TI1 ;COL 80? BNE CON ;NO CMPB #15,(SP) ;CR? BEQ CON ;YES JMP EXIT ;YES, IGNORE INPUT CON: MOVB (SP),TIZ1 ;GET INPUT MOVB (SP),OUTZ2 ; QIO$C IO.WAL,1,1,,IOST,, ;WRITE OUTPUT WTSE$C 1 ;WAIT INCB TI1 ;INCREMENT POINTER QIO$C IO.WAL,2,1,,IOST,, ;WRITE OUTPUT WTSE$C 1 ;WAIT INCB OUTY2 ;INCREMENT POINTER CMPB #15,(SP) ;CR? BNE DONE1 ;NO QIO$C IO.WAL,1,1,,IOST,, ;ERASE LINE WTSE$C 1 ;WAIT QIO$C IO.WAL,2,1,,IOST,, ;ERASE LINE WTSE$C 1 ;WAIT MOVB #41,TI1 ;RESET POINTERS MOVB #41,OUTY2 ; DONE1: QIO$C IO.WAL,2,1,,IOST,, ;RESTORE POINTER JMP EXIT ;AST EXIT TWO: CMPB #177,(SP) ;DELETE KEY? BNE CTWO ;NO CMPB #41,TI2 ;COL 2? BNE TOK ;NO JMP EXIT ;YES, IGNORE AND EXIT TOK: QIO$C IO.WAL,2,1,,IOST,, ;DELETE LAST CHAR WTSE$C 1 ;WAIT DECB TI2 ;DEC POINTER QIO$C IO.WAL,1,1,,IOST,, ;POSITION CURSOR FOR OUTPUT WTSE$C 1 ;WAIT QIO$C IO.WAL,1,1,,IOST,, ;DELETE LAST CHAR WTSE$C 1 ;WAIT DECB OUTY1 ;DECREMENT POINTER QIO$C IO.WAL,1,1,,IOST,, ;RESTORE CURSOR WTSE$C 1 ;WAIT JMP EXIT ;AST EXIT CTWO: CMPB #160,TI2 ;COL 80? BNE CTW ;NO CMPB #15,(SP) ;CR? BEQ CTW ;YES JMP EXIT ;YES, IGNORE INPUT CTW: MOVB (SP),TIZ2 ;GET INPUT MOVB (SP),OUTZ1 ; QIO$C IO.WAL,2,1,,IOST,, ;WRITE OUTPUT WTSE$C 1 ;WAIT INCB TI2 ;INCREMENT POINTER QIO$C IO.WAL,1,1,,IOST,, ;WRITE OUTPUT WTSE$C 1 ;WAIT INCB OUTY1 ;INCREMENT POINTER CMPB #15,(SP) ;CR? BNE DONE2 ;NO QIO$C IO.WAL,2,1,,IOST,, ;ERASE LINE WTSE$C 1 ;WAIT QIO$C IO.WAL,1,1,,IOST,, ;ERASE LINE WTSE$C 1 ;WAIT MOVB #41,TI2 ;RESET POINTERS MOVB #41,OUTY1 ; DONE2: QIO$C IO.WAL,1,1,,IOST,, ;RESTORE POINTER EXIT: TST (SP)+ ;POP STACK ASTX$S ;AST EXIT ; ; TALK SESSION TERMINATE ROUTINE (CTRL Z) ; QUIT: QIO$C IO.WAL,1,1,,IOST,, ;PRINT TERMINATE MSG WTSE$C 1 ;WAIT ON MSG QIO$C IO.WAL,2,1,,IOST,, ;PRINT TERMINATE MSG WTSE$C 1 ;WAIT ON MSG QIO$C IO.DET,1,1 ;DETACH TERMINAL WTSE$C 1 QIO$C IO.DET,2,1 ;DETACH WTSE$C 1 EXIT$S ;QUIT ; ; AST ROUTINE FOR MARKTIME ; ATF: QIO$C IO.KIL,2,1,,IOST ;KILL I/O ATTACH WTSE$C 1 ;WAIT ON QIO QIO$C IO.WAL,1,1,,IOST,, ;BUSY TERMINAL WTSE$C 1 ;WAIT ON MSG EXIT$S ;EXIT .END TALK