File: LI.TK of Tape: Sources/Multi8/m8-tk-etc-20-10-80
(Source file text)
/LI.TK 14-MAY-80 / /NAME: IN ("I^100+"N&3777) LIN / /FUNCTION:THIS MODULE READS ONE LINE OF TEXT AND PUTS THE / CHARACTERS ONE BY ONE INTO THE BUFFER OF THE CALLING / MODULE, WHICH ALSO SPECIFIES THE INPUT DEVICE NAME. / THE MODULE SERVES ALSO FOR OUTPUT ONLY. / /CONCEPT:A LOT OF MODULES NEED PROPER INPUT FROM SOME / INPUT DEVICE, WHILE NOT BOTHERING ABOUT THINGS LIKE / RUBOUT CHARACTERS ETC. THE CALLING MODULE ONLY / SPECIFIES THE INPUT DEVICE AND THE SIZE OF THE / RESERVED BUFFER. THE BUFFER MAY BE LOCATED IN / ANY FIELD. (SEE FORMAT) /THE FOLLOWING CONTROLCHARS ARE RECOGNISED: / RUBOUT :DELETE ONE CHAR TO THE LEFT / CTRL/U :DELETE THE WHOLE LINE / LF :REPEAT THE WHOLE LINE / CR :TERMINATES THE LINE;TAKES NORMAL RETURN / CONTROL CHARS. :IGNORED (EXCEPT BELL,BS,TAB) / / THE VERY FIRST THING THE MODULE DOES, IS TO / PRINT ALL CHARACTERS IN THE BUFFER UNTIL IT / ENCOUNTERS A 0000. THEN THE INPUTSTRING IS / ENTERED OVER THE OUTPUTSTRING. / /ERRORS:1) NO INPUT DEVICE SPECIFIED / 2) INPUT MODULE BUSY OR NOT AVAILABLE / 3) ILLEGAL CONTROL CHARACTER TYPED / 4) LINE TOO LONG FOR BUFFER;TYPES "?" / /TASKCIRCULATION:BETWEEN TYPE-INS AND ECHOES /USE: CDF TO FIELD OF BUFFER / TAD (POINTER TO BUFFER / JMS MONITOR / CALL / "I^100+"N&3777 / ERROR RETURN /"IN" NOT AVAILABLE / NORMAL RETURN; ERROR RETURN IF AC UNEQ. 0 /NOTE! UPON RETURN DF STILL POINTS TO FIELD OF BUFFER. /FORMAT IN: /BUFFER,NAME OF INPUT DEVICE / -LENGTH OF BUFFER / ZBLOCK (LENGTH) /THE ACTUAL BUFFER AREA /THE BUFFER MAY ALSO CONTAIN TEXT TO BE PUT OUT: /BUFFER,NAME OF INPUT DEVICE / -LENGTH OF BUFFER / "T;"E;"X;"T;0000 /TEXT;ZERO IS TERMINATOR / ZBLOCK (THE REST) /IF 215=TERMINATOR:NO INPUT!! / /NOTE THAT THE INPUTSTRING STARTS AT BUFFER+2 !! SCOPE=1 /IF MOST TERMINALS ARE VIDEO /NOT THAT THE DATAFIELD POINTS TO THE CALLER'S FIELD /NEARLY ALL THE TIME. LINPTR, "I^100+"N&3777 /NAME 'IN' 200 /ONE PAGE;NO CONNECTS LINSWI, 0 /-1 IF ERROR LINBEG, LINE, DCA LINBEG /SET UP POINTER TO FETCH ARGS LINCNT, TAD I LINBEG /SAVE INPUT DEVICENAME LINLEN, DCA LINPUT TAD LINPUT TAD ("T-"K^100 /FORM OUTPUT DEVICE NAME DCA LINONAM ISZ LINBEG TAD I LINBEG /-MAX LENGTH DCA LINLENG TAD I ZMYCDF /SAVE CDF A NUMBER OF TIMES DCA LICDF TAD LICDF DCA LINCDF ISZ LINBEG /POINTS TO BEGINNING OF BUFFER LISTAR, TAD C215 /TYPE CRLF JMS LINOUT TAD C212 JMS LINOUT LINE0, TAD LINLENG /USE LINCNT AS COUNTER DCA LINCNT TAD LINBEG /MOVE POINTER TO BEGINNING DCA LINPTR LINE1, JMP LINE2 /READ A CHAR;BECOMES 'JMS MONITOR' CALL LINPUT, 0 /NAME OF INPUT MODULE JMP LINE1 /MODULE BUSY? LICDF, HLT /RESTORE DF;YOU NEVER CAN TELL DCA I LINPTR /SAVE IN BUFFER LINE2, TAD I LINPTR /BRANCH FOR CONTROLS SNA /IGNORE BLANKS JMP LIPATCH TAD (-377 SNA JMP LINERUB /RUBOUT TAD (-212+377 SNA JMP LINLF /LF TAD M3 /(-215+212 SNA JMP LINECR /CR TAD M10 /(-225+215 SNA JMP LINEU /CTRL/U, LINE OVER TAD (-240+225 SMA /PRINTING CHAR ? JMP LISPACE /OK TAD (-212+240 /^A-^H, BELL, BS, TAB ? SMA JMP LINE1 /NO, CONTROL CHARS ABOVE TAB IGNORED TAD (-240+212 /YES, ECHO THEM LISPAC, TAD C240 JMS LINOUT /ECHO THE CHAR ISZ LINPTR /MOVE PNTR ISZ LINCNT /BUF FULL? LINJMP, JMP LINE1 /N LINERR, ACM1 /AC=7777=ERROR DCA LINSWI /PRINT "?(CRLF)", TAKE ERROR RET. TAD ("? JMS LINOUT LINECR, TAD C215 /PRINT "(CRLF)", TAKE NORMAL RET. JMS LINOUT TAD (4212 /RELEASE OUTPUT TASK JMS LINOUT TAD LINSWI LINEX, JMS MONITOR EXIT SWPOUT /NEEDS A NEW IMAGE EVERY TIME LINEU, IFNDEF SCOPE < TAD ("^ /ECHO ^U CRLF JMS LINOUT TAD ("U JMS LINOUT JMP LISTAR /START ALL OVER AGAIN > IFDEF SCOPE < JMS RUBIT /RUBOUT,RUBOUT,... JMP LINEU / > LINOUT, .-. /OUTPUT ONE CHAR TAD (4000 LINO1, ISZ COUNT SKP JMP LINEX /WAITING TOO LONG LJMSM, JMS MONITOR CALL LINONAM, 0 /NAME FILLED IN HERE JMP LINO1 /DEVICE BUSY CLA DCA COUNT LINCDF, HLT /RESTORE DF JMP I LINOUT LINERUB,JMS RUBIT JMP LINE1 RUBIT, 0 TAD LINCNT /BUF EMPTY? CIA TAD LINLENG SNA CLA JMP LINE0 /Y ACM1 /N;COUNTER -1 TAD LINCNT DCA LINCNT ACM1 /POINTER -1 TAD LINPTR DCA LINPTR IFDEF SCOPE < TAD (210 /PRINT BACKSPACE JMS LINOUT TAD C240 /SPACE JMS LINOUT TAD (210 /BACKSPACE > IFNDEF SCOPE < TAD ("\ /PRINT BACKSLASH > JMS LINOUT JMP I RUBIT COUNT, 0 /LF: REPEAT THE WHOLE LINE /THE MECHANISM IS AS FOLLOWS: THE LF CHAR IS REPLACED /BY A 0000. THEN A PATCH IS MADE AT LINE1, IN ORDER THAT /INPUT IS FROM THE BUFFER ITSELF. AS THERE ARE NEVER /ZEROES IN THE BUFFER, THE VERY FIRST ZERO RESTORES THE /PATCHED LOCATION. IN FACT IT DOES NO HARM TO DO IT /FOR EVERY BLANK: /THE LINEFEED PATCHES A 'JMP LINE2' LINLF, DCA I LINPTR /PUT A ZERO IN BUFFER TAD (JMP LINE2 DCA LINE1 JMP LISTAR /PRINT CRLF AND THE WHOLE LINE LIPATCH,TAD LJMSM /'JMS MONITOR' DCA LINE1 JMP LINE1 /FOR THE VERY FIRST TIME A 0000 HAS A DIFFERENT MEANING: /IT TERMINATES THE BUFFER-TYPEOUT.THERE IS A PATCH /OVER A PATCH: *LIPATCH+2 TAD LINJMP /RESTORE 'JMP LINE1' DCA .-1 JMP LINE0 PAGE $$$$$$