ASMB,R,L,C HED "REA.C" FMGR INPUT ROUTINE 1-78 (DLB) * NAME: REA.C * SOURCE: 92067-18208 * RELOC: 92067-16185 * PGMR: G.A.A., D.L.B. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM REA.C,8 92067-16185 REV.2026 800428 ENT REA.C EXT READF,MSS.,WRITF,$TIME,.MVW EXT .E.R.,CAM.I,TTY.,ECH.,C.BUF,IFBRK EXT REIO,PCIBF SPC 1 EXT TPSK.,NXTK.,EDSK.,CRSK.,C.TAB A EQU 0 B EQU 1 SPC 1 * PURPOSE: * THIS SUBROUTINE DOES ALL COMMAND INPUT FOR THE FMGR PROGRAM. * IF THE INPUT IS FROM A TRANSFER FILE (NON-TERMINAL) ALL COMMANDS * ARE IN THE STANDARD FMGR INPUT REQUIREMENTS. IF INPUT IS FROM * A TERMINAL (TTY. = 1) THERE ARE SEVERAL NEW FEATURES ADDED AS * TYPING AIDS. * * 1). ALL FMGR COMMANDS "EXECUTED" FROM A KEYBOARD ARE PUT INTO * INTO A "COMMAND STACK" (RESIDENT IN FMGR MODULE) SO THAT THEY * CAN BE DISPLAYED, MODIFIED AND EXECUTED LATER. THE MODIFY COMMANDS * WERE DELIBERATELY CHOSEN TO BE A SUBSET OF THE "EDITR" COMMANDS. * THE FOLLOWING IS A LIST OF THE COMMANDS THAT CAN BE USED TO * EDIT THE "COMMAND STACK". * * :Ln "n" IS NUMBER OF LINES TO LIST. IF :L THEN WHOLE COMMAND STACK. * :P DISPLAY PENDING LINE WITH SAME OPTIONS AS EDITR. (CNTL I,S,T,R,C) * :n POSITION PENDING LINE TO THE "n"TH LINE IN COMMAND STACK. * :^n OR :Rn POSITION n LINES PRECEDING PENDING LINE. * :/n POSITION n LINES PAST PENDING LINE. * :-n DELETE n LINES FROM COMMAND STACK FROM THE PENDING LINE. * * ONCE A LINE FROM THE COMMAND STACK HAS BEEN DISPLAYED AS THE * "PENDING" LINE, IT MAY BE EXECUTED BY TYPING A LONESOME CARRIAGE * RETURN (TLOG = 0 RETURN FROM EXEC). * * 2). ALL INPUT FROM A KEYBOARD THAT IS NOT A LEGAL "FMGR" COMMAND * OR A COMMAND STACK COMMAND WILL HAVE A :RU, PLACED IN FRONT OF * THE INPUT STRING AND PASSED ON AS A "RUN" COMMAND. THIS "IMPLIED * RUN" FEATURE MAKES THE SYSTEM SEEM MORE HOMOGENEOUS TO NEW USERS * WHO HAVE DIFFICULTY UNDERSTANDING THE DIFFERENCE BETWEEN A * "PROGRAM" AND A "FMGR" COMMAND. IT ALSO REDUCES THE TYPING FOR AN * EXPERIENCED RTE USER A SURPRISING AMOUNT. * * 3). AN AGING FEATURE IS PLACED ON THE "COMMAND STACK" BY ELIMINATING * DUPLICATE ENTRIES. BEFORE A NEW COMMAND IS PLACED AT THE BOTTOM * OF THE STACK, ALL THE OTHER ENTRYS ARE CHECKED FOR DUPLICATION AND * DELETED IF NECESSARY. THIS WAS DONE TO KEEP THE BOTTOM OF THE * STACK AS "FRESH" AS POSSIBLE -- REPRESENTING THE LATEST DIFFERENT * COMMANDS EXECUTED. * * 4). THE COMMAND STACK IMPLEMENTS A MECHANISM FOR DISPLAYING COMMANDS * THAT ARE PASSED TO THE "FMGR" TO BE EXECUTED FROM THE STRING BUFFER * PASSED FROM A SCHEDULE REQUEST OR RETURNED FROM A "RUN'ED PROGRAM". * THIS FEATURE MAKES IT MUCH EASIER TO UNDERSTAND THE AN ERROR * MESSAGE THAT MAY APPEAR WHEN EXECUTING A STRING BUFFER. THE * COMMAND THAT CAUSED THE ERROR MAY BE DISPLAYED BY TYPING :P . * * 5). A "NULL" COMMAND (::FILENA), I.E. THE "IMPLIED TRANSFER" * COMMAND IS NOT PLACED INTO THE COMMAND STACK BECAUSE IT WAS * NOTICED THAT "SOFT KEYS" FROM 26XX TERMINALS OFTEN USE THIS * COMMAND TO LOAD UP SOFT KEYS AND EXECUTE SOMETHING. PLACING * THESE "NULL" TRANSFER COMMANDS IN THE COMMAND STACK SIMPLY * CLUTTERS UP THE COMMAND STACK. IF IT IS DESIRED TO HAVE THESE * COMMANDS PUT INTO THE COMMAND STACK, THE FORMAL :TR,FILENA COMMAND * MAY BE PLACED IN THE SOFT KEYS. * * TEST PROGRAM: ** ASMB,R,L ** NAM TES,3 TEST PROGRAM FOR "REA.C" FMGR SUBROUTINE 780503 ** ENT MSS.,.E.R.,CAM.I,TTY.,ECH.,C.BUF ** ENT TPSK.,NXTK.,EDSK.,CRSK. ** EXT T0DCB,EXEC,REA.C,RMPAR ** SPC 1 ** BEGIN JSB RMPAR ** DEF *+2 ** DEF LU ** JSB T0DCB ** DEF *+4 ** DEF CAM.I DCB ** DEF .E.R. ** DEF LU ** CLA,INA ** STA TTY. ** BEGI1 JSB REA.C GO DO INPUT ** DEF *+1 ** JSB EXEC NOW WRITE OUT THE INPUT BUFFER ** DEF *+5 ** DEF O2 ** DEF LU ** DEF C.BUF ** DEF ECH. ** JMP BEGI1 ** SPC 1 ** NXTK. DEF BUF ** CRSK. DEF *+2 ** TPSK. DEF *+1 ** OCT 1 ** ASC 1,** ** BUF OCT 400 ** BSS 170 ** EDSK. DEF *-1 ** SPC 1 ** C.BUF BSS 36 ** CAM.I BSS 144 ** .E.R. NOP ** MSS. NOP ** HLT 0 ** ECH. NOP ** O7 OCT 7 ** LU BSS 5 ** O2 OCT 2 ** TTY. NOP ** END BEGIN SPC 1 DFDSP DEF DSPLY POINTER INTO DISPLAY BUFFER DSPLN NOP CURRENT DISPLAY BUFFER LENGTH IN WORDS ASC 1, LEADING SPACES FOR DISPLAY BUFFER DSPLY BSS 36 DISPLAY BUFFER ORG DSPLY MAKE ROOM FOR INITIALIZE CODE INIT LDA CLA GET CLA INSTRUCTION STA INIT1 PREVENT ANY FUTURE CALLS TO THIS CODE LDA DFC.B GET DEF TO C.BUF RSS AND MAKE A DIRECT ADDRESS FOR SURE (RTE-III GEN BUG) LDA A,I GET NEXT LEVEL RAL,CLE,SLA,ERA ETC. JMP *-2 STA DFC.B AND PUT BACK JMP INIT1 AND CONTINUE ORR RETURN TO MAIN CODE SPC 1 MODEF NOP EDIT MODE FLAG EDITF NOP EDITED PENDING BUFFER FLAG TTYLU NOP LU OF TERMINAL REA.C NOP ENTRY INIT1 JMP INIT CLA SET LENGTH OF DISPLAY BUFFER STA EDITF CLEAR THE EDITED PENDING DISPLAY FLAG STA DSPLN CLEAR DISPLAY BUFFER LENGTH REAC1 LDA DFMES RESET THE TIMOUT BRANCH ADDRESS STA MSFLG TO 0 TIMEOUT HISTORY LDA TTY. NOW GO CHECK IF KEYBOARD DEVICE? SZA,RSS KEYBOARD DEVICE? JMP REAC5 NO, SKIP THE ":" ECHO REAC2 LDB DFCOL GET ASCII ":_" CLA,INA LENGTH = 1 WORD JSB WRITI GO PROMPT THE COLON CCA PRESET THE INPUT BUFFER TO ILLEGAL VALUE STA C.BUF FOR ACTIVE TERMINAL TEST LDA $TIME GET THE CURRENT TIME CMA,INA NEGATE STA TIMER SAVE FOR LATER USE CLA CLA SET STARTING CHAR IN C.BUF STA GTCCT INIT THE GTC.B ROUTINE STA PCONT INIT THE PUTCR ROUTINE STA GTCDE INIT THE GTCSC ROUTINE STA MODEF INIT THE EDIT MODE FLAG LDA CAM.I+3 GET THE LU OF KEYBOARD IOR O400 MAKE SURE THE ECHO BIT IS SET STA TTYLU SAVE FOR REIO REQUEST JSB REIO AND REQUEST INPUT FROM KEYBOARD DEF *+5 DEF O1 DEF TTYLU DFC.B DEF C.BUF+0 DIRECT ADDRESS OF INPUT BUFFER!! DEF DM72 36 WORDS MAX SZB,RSS CHECK IF ANY INPUT? JMP EXECU NO, GO CHECK IF EXECUTE COMMAND STB CRCNT SAVE NUMBER OF CHARS INPUT SPC 1 * BEGIN HERE TO LEFT JUSTIFY INPUT BUFFER SPC 1 LDA OM6 FIX UP COMMAND LENGTH COUNTER STA MCDLN MAX COMMAND LENGTH = 6 CHARS PACK1 JSB GTC.B GET NEXT CHARACTER FROM INPUT BUFFER JMP PACK6 DONE, CONTINUE CPA O40 IGNORE LEADING SPACES JMP PACK1 IN BUFFER JMP PACK3 NOT SPACE, GO STORE SPC 1 * BEGIN HERE TO CALCULATE THE LENGTH OF POSSIBLE FMGR COMMAND SPC 1 PACK2 JSB GTC.B GET NEXT CHARACTER JMP PACK6 OUT OF BUFFER, GO CALCULATE LENGTH CPA O40 CHECK IF SPACE OR COMMA? RSS PACK3 CPA COMMA TO CALCULATE THE "COMMAND LENGTH" RSS COMMAND TERMINATOR, CALCULATE LENGTH CPA COLON : IS ALSO A TERMINATOR JMP PACK5 COMMAND TERMINATOR, CONTINUE JSB PTEBF OK, GO PUT INTO BUFFER ISZ MCDLN MAX LENGTH COMMAND = 6 CHARS JMP PACK2 TRY NEXT CHARACTER SPC 1 PACK4 JSB GTC.B GET NEXT CHARACTER JMP PACK6 OUT OF BUFFER, GO CALCULATE LENGTH PACK5 JSB PTEBF PUT THE CHARACTER INTO THE INPUT BUFFER JMP PACK4 GOT CHARACTER AND PACK IT IN SPC 1 PACK6 LDA PCONT GET CHARACTER LENGTH OF INPUT BUFFER STA CRCNT AND SET IT TO TRUE CHAR LENGTH INA AND ALSO SET THE WORD LENGTH FOR FMGR PARSE CLE,ERA DIVIDE BY TWO FOR WORD LENGTH STA ECH. FOR FMGR PARSE LDA O40 PUT IN A TRAILING SPACE IF ODD CHAR LENGTH JSB PTEBF PUT TRAILING SPACE INTO INPUT BUFFER CLA NOW RE-SET STARTING CHARS FOR GET & PUT STA GTCCT GET CHARACTER FROM INPUT BUFFER AND STA PCONT PUT CHARACTER TO INPUT BUFFER ROUTINE SPC 1 * NOW CHECK IF INPUT IS A FMGR COMMAND SPC 1 LDA MCDLN GET COMMAND LENGTH COUNTER CMA,INA NEGATE, AND FORM COUNTER ADA OM6 IN NEGATED FORM STA MCDLN FOR MATCH CALCULATION CPA OM2 CHECK IF 2 CHARACTER COMMAND? JMP MATII YES, USE FMGR TABLE FOR MATCHING SZA,RSS CHECK IF COMMAND LENGTH = 0 CHARACTERS? JMP EXIT2 YES, LET THE FMGR PARSE HANDLE INA,SZA,RSS CHECK IF COMMAND = 1 CHARACTER? JMP NAFMC YES, SKIP FMGR COMMAND CHECK SPC 1 * COMMAND LENGTH IS = 3 OR MORE CHARACTERS, CHECK LOCAL TABLE FOR * POSSIBLE FMGR COMMAND. (ANY COMMAND NOT IN THIS TABLE MUST BE * TWO CHARACTERS IN LENGTH, EXCEPT "RU" & "SY".) SPC 1 LDA C.BUF GET 1ST 2 CHARS OF INPUT BUFFER CPA ASCRU CHECK IF :RU_____ COMMAND? RSS YES CPA ASCSY CHECK IF :SY____ COMMAND? JMP EXIT1 YES, LET FMGR PARSE LDB EXLST GET STARTING ADDRESS OF EXTENDED FMGR COMMANDS MATC2 LDA B,I GET 1ST 2 CHARS SZA,RSS CHECK IF END OF LIST? JMP NAFMC YES, NOT A FMGR COMMAND CPA C.BUF CHECK IF MATCHING 2 CHARACTERS JMP MATC3 YES, NOW CHECK IF ALL CHARS OF COMMAND MATCH ADB O3 NO, BUMP TO NEXT ONE JMP MATC2 AND TRY NEXT COMMAND FROM LIST SPC 1 MATC3 RBL FORM CHARACTER ADDRESS OF COMMAND LIST STB MATCA SAVE CURRENT CHARACTER ADDRESS MATC4 LDB MATCA GET CURRENT CHARACTER ADDRESS ISZ MATCA AND BUMP TO NEXT CLE,ERB FORM WORD ADDRESS JSB GTCHR GET THE CHARACTER STA MATCB SAVE TEMP FOR LATER TEST JSB GTC.B GET NEXT CHARACTER FROM INPUT BUFFER JMP NAFMC MUST BE ZERO LENGTH COMMAND CPA MATCB CHECK IF MATCHING? RSS YES, KEEP ON TRUCKING JMP NAFMC NOT A FMGR COMMAND ISZ MCDLN CHECK IF ANY MORE CHARACTERS TO MATCH? JMP MATC4 YES, KEEP ON TRUCKING SPC 1 * MATCH WAS ACHIEVED, PUT COMMAND INTO BUFFER LIST AND EXIT. SPC 1 EXIT1 JSB PCIBF MUST BE LEGAL COMMAND>>PUT INTO BUFFER LIST DEF *+3 DEF C.BUF DEF ECH. EXIT2 LDA ECH. GET BUFFER LENGTH LDB REA.C,I GET RETURN ADDRESS JMP B,I AND EXIT TO CALLER SPC 1 MCDLN NOP NEG. NUMBERS IN COMMAND BUFFER MATCA NOP CURRENT CHAR ADDRESS FOR MATCHING BUFFER MATCB NOP CURRENT CHARACTER VALUE FROM MATCHING BUFFER SPC 1 * TWO CHARACTER COMMAND, CHECK IF "C.TAB" HAS MATCHING FMGR COMMAND. SPC 1 MATII LDB C.TAB GET STARTING ADDRESS OF C.TAB MATI1 ADB O2 SKIP 1ST ENTRY LDA B,I GET NEXT 2 CHARS SZA,RSS CHECK IF END OF LIST? JMP NAFMC YES, MUST NOT BE FMGR COMMAND RAL,CLE,ERA STRIP OFF BIT 15 CPA C.BUF CHECK IF MATCH? JMP EXIT1 YES, GO EXECUTE JMP MATI1 NO, TRY NEXT ONE SPC 1 * NOT A FMGR COMMAND, DO LOCAL PROCESSING SPC 1 NAFMC CLA RESET STARTING CHARACTER NUMBER FOR RE-SCAN STA GTCCT OF INPUT BUFFER JSB GTC.B YES, GET THE POSSIBLE COMMAND CHAR JMP EXIT2 CANT HAPPEN UNLESS BUG IN TTY. FLAG CPA ASCR CHECK IF RECALL COMMAND? RSS YES CPA ASCUP CHECK IF RECALL COMMAND? (^) JMP DECRM BACK UP THE CURRENT BUFFER POINTER CPA SLASH CHECK IF MOVE FORWARD COMMAND? JMP ADVNS GO MOVE THE COMMAND BUFFER POINTER CPA ASCL CHECK IF LIST COMMAND? JMP LISTC YES, GO PROCESS CPA ASCP CHECK IF EDIT COMMAND? JMP EDIT2 YES, GO PROCESS CPA MINUS CHECK IF DELETE COMMAND? JMP DELET YES, GO DELETE CURRENT LINE JSB NUMBR CHECK IF NUMERIC? SPC 1 * 1ST CHARACTER IS NUMBERIC, GO PARSE WHOLE INPUT AS NUMBER. SPC 1 CLA RESTART THE SCAN ROUTINE STA GTCCT TO THE 1ST CHARACTER JSB NMBLN YES, GO CONVERT SPC 1 * CONVERT TO NUMBER WAS SUCCESSFUL, COUNT DOWN N LINES FROM TOP. SPC 1 LDB TOPSK GET THE TOP OF THE STACK STB CURSK AND SET THE CURRENT TO TOP SSA,INA,SZA CHECK IF 0 OR -1? LINEN JSB ADVSK ADVANCE THE CURRENT BUFFER LIST POINTER JMP DECR2 BEYOND LAST, GO PRINT LAST LINE INA,SZA CHECK IF END?PRINT LAST ONE JMP LINEN NO, CONTINUE JMP DECR2 NOW, GO PRINT SPC 1 * AT THIS POINT IS MUST BE AN IMPLIED :RUN COMMAND. * STICK A ":RU," IN FRONT OF COMMAND AND EXIT. SPC 1 RUCMD CLA RESET THE STARTING CHARACTER NUMBER OF INPUT BUFFER STA GTCCT FOR INPUT BUFFER STA DSPLN FOR STORING NEW STRING WITH RU, LDA ASCR GET AN ASCII "R" JSB PUTCR AND PUT INTO DISPLAY BUFFER LDA ASCRU GET AN ASCII "U" JSB PUTCR AND PUT INTO DISPLAY BUFFER LDA COMMA GET ASCII COMMA RUCM1 JSB PUTCR AND PUT INTO DISPLAY BUFFER JSB GTC.B GET NEXT CHAR FROM INPUT BUFFER RSS DONE, GO CALCULATE BUFFER LENGTH JMP RUCM1 AND PUT INTO DISPLAY BUFFER LDA NXTSK FORCE THE BUFFER INTO BUFFER LIST STA CURSK AND FORCE THE EDIT MODE STA EDITF FLAG LDA O40 MAKE SURE THERE IS TRAILING SPACE IN BUFFER JSB PUTCR BECAUSE WE ARE GOING TO MAKE IT EVEN LDB DSPLN GET NUMBER OF CHARS STORED BRS DIVIDE BY 2 JMP REAC3 MOVE DISPLAY BUFFER INTO INPUT BUFFER SPC 1 * TLOG=0 ENTRY, EXECU CHECKS IF EXECUTE COMMAND WAS INPUT. SPC 1 EXECU LDA DSPLN GET CURRENT DISPLAY BUFFER LENGTH SZA,RSS CHECK IF THERE IS A DISPLAY BUFFER? JMP PWAIT NO, DISPLAY BUFFER >> WAITING FOR INPUTMEOUT? JSB TIMOT > 20 SECONDS ? SEZ,RSS E-REG = 1 IF > 20 SECONDS ISZ C.BUF NO, CHECK IF KEYBOARD TOUCHED? JMP PWAIT KEYBOARD TOUCHED OR > 20 SECONDS SPC 1 * EXECUTE REQUEST IS REQUIRED, MOVE DISPLAY BUFFER TO C.BUF & EXIT SPC 1 LDB DSPLN GET THE DISPLAY LENGTH REAC3 LDA DFDSP GET THE FROM BUFFER ADDRESS REAC4 STB ECH. SAVE LENGTY IN WORDS LDB DFC.B GET "TO" BUFFER ADDRESS JSB .MVW AND MOVE THE BUFFER DEF ECH. NUMBER OF WORD TO MOVE OCT 0 FUKIE-UPIE JMP EXIT1 PUT IN THE BUFFER LIST SPC 1 * SUBROUTINE TO DETERMINE IF 20 SECONDS HAS ELAPSED SINCE ":" OUTPUT. SPC 1 TIMOT NOP ENTRY A-REG IS NOT MODIFIED LDB $TIME GET CURRENT TIME ADB TIMER SUBTRACT THE PREVIOUS TIME O40 CLE DO A 16 BIT ARITHMETIC CHECK ADB DM2K 2000 TICKS OF CLOCK (20 SEC) JMP TIMOT,I E-REG = 1 IF > 20 SECONDS. SPC 1 * TIMOUT ENTRY, WRITE OUT THE CORRECT MESSAGE SPC 1 PWAIT JSB TIMOT CHECK IF 20 SECONDS LDA DFMES GET ADDRESS OF 1ST MESSAGE CLB,SEZ ELAPSED? ISZ C.BUF CHECK IF KEYBOARD TOUCHED? STA MSFLG START OVER IF < 20 SEC OR KEYBOARD TOUCHED. STB DSPLN CLEAR THE DISPLAY BUFFER LDB MSFLG,I GET POINTER TO MESSAGE LDA B,I GET MESSAGE LENGTH INB BUMP ADDRESS TO ASCII MESSAGE JSB WRITI AND WRITE OUT THE MESSAGE ISZ MSFLG BUMP TO NEXT MESSAGE LDA MSFLG CHECK IF "GONE"? CPA DFGON ? RSS USE "EX" PROCESSING JMP REAC2 GO PROMPT ":" SPC 1 * TIMED OUT!, GO EXECUTE "EX,SP,,KILL" SPC 1 LDA DFEXS GET MESSAGE "EX,SP,,KILL" LDB O5 GET MESSAGE LENGTH IN WORDS JMP REAC4 AND GO EXECUTE SPC 1 DFEXS DEF *+1 ASC 5,EX,SP,,KILL SPC 1 * ENTRY IS NORMAL DATA FROM FILE OTHER THAN A KEYBOARD. SPC 1 REAC5 JSB READF AND GO READ THE INPUT DEF *+6 DEF CAM.I DCB DEF .E.R. GLOBAL ERROR VALUE DEF C.BUF+0 INPUT BUFFER DEF D36 72 CHARACTERS MAX INPUT DEF ECH. SAVE NUMBER OF ! WORDS ! INPUT SSA CHECK IF ANY READ ERROR JMP EREXT YES, DO A ERROR EXIT LDA ECH. GET THE TLOG VALUE SZA,RSS CHECK IF ZERO LENGTH FILE RECORD? JMP REAC5 YES, IGNORE IT, AND CONTINUE TO NEXT SSA CHECK IF END OF FILE? JMP EXIT4 YES, EXIT WITH ZERO LENGTH RECORD JMP EXIT2 EXIT TO PROCESS THE INPUT BUFFER SPC 1 EREXT JSB MSS. OUTPUT THE ERROR MESSAGE DEF *+3 DEF .E.R. ERROR NUMBER DEF DM2K -2000 EXIT4 CLA AND EXIT TLOG = 0 STA ECH. SET TRANS LOG JMP EXIT2 SPC 1 * PUTCR PUTS A CHARACTER IN A-REG INTO THE DISPLAY BUFFER SPC 1 PUTCR NOP ENTRY A-REG = CHARACTER LDB DSPLN GET CHARACTER COUNT CLE,ERB FORM WORD OFFSET CPB D36 CHECK IF AT END? JMP PUTCR,I YES, JUST IGNORE ADB DFDSP INDEX INTO DISPLAY BUFFER JSB PTCHR AND PUT THE CHARACTER INTO BUFFER ISZ DSPLN BUMP CHARACTER COUNT JMP PUTCR,I AND EXIT SPC 1 PTCHR NOP ENTRY A-REG = CHAR, B=ADDRESS, E=EVEN/ODD FLAG AND O377 MASK TO JUST CHARACTER SEZ,RSS CHECK IF EVEN OR ODD? ALF,ALF EVEN, POSITION XOR B,I PUT IN OR TAKE OUT SEZ,RSS CHECK IF HI-LO CHAR ALF,ALF HI, POSITION FOR MASKING AND O377 MASK OFF UNTOUCHED CHARACTER SEZ,RSS CHECK IF NEED UNPOSITIONING? ALF,ALF YES, DO IT. XOR B,I NOW MERGE IN UNTOUCHED, & TAKE OUT REPLACED STA B,I CHARACTER AND PUT BACK INTO WORD JMP PTCHR,I AND EXIT SPC 1 DELET JSB NMBLN GET NUMBER OF LINES TO DECREMENT SSA,RSS CHECK IF POSITIVE? CCA YES, FORCE TO ONE LINE STA ACCUM SAVE NUMBER OF LINES TO DELETE DELE1 LDA CURSK GET THE CURRENT BUFFER POINTER CPA NXTSK CHECK IF DELETED LAST LINE? JMP REAC1 YES, RE-ENTER THE READ ROUTINE JSB DELIN AND DELETE FROM BUFFER LIST ISZ ACCUM CHECK IF DONE? JMP DELE1 NO, CONTINUE JMP DECR2 OUTPUT NEXT LINE & RE-ENTER READ SPC 1 TIMER NOP TIMER SPC 1 DECRM JSB NMBLN GET NUMBER OF LINES TO DECREMENT DECR1 JSB DECSK DECREMENT STACK POINTER JMP DECR3 BEYOND BEGINNING, PRINT BEGINNING SZA,RSS CHECK IF DONE BUMPING? JMP DECR2 YES, GO PRINT INA,SZA DONE? JMP DECR1 YES, KEEP ON TRUCKING DECR2 JSB MCBDB WRITE OUT THE DISPLAY BUFFER JMP REAC1 AND RE-ENTER THE READ THIS SUBROUTINE SPC 1 DECR3 SZA CHECK IF MULTI-LINE MOVE? JMP DECR2 YES, PRINT LIMIT LINE JMP REAC1 NO, IGNORE REQUEST IF BEYOND LIMIT AND ZERO LINE REQ. SPC 1 ADVNS JSB NMBLN GET NUMBER OF LINES TO ADVANCE ADVN1 JSB ADVSK MOVE POINTER FORWARD JMP DECR3 BEYOND, END, PRINT END SZA,RSS CHECK IF MULTI-LINE MOVE JMP DECR2 NO, GO PRINT LINE INA,SZA CHECK IF MOVE TO ADVANCE JMP ADVN1 YES, CONTINUE JMP DECR2 MOVE "CURSK" TO THE DISPLAY BUFFER SPC 1 * ROUTINE TO PROCESS THE "P" COMMAND SPC 1 EDIT1 STA MODEF AND SET THE MOVE FLAG STA EDITF SET THE EDIT MODE FLAG EDIT2 JSB GTC.B GET NEXT CHARACTER FROM EDIT BUFFER JMP EDIT3 MOVE C.BUF INTO DISPLAY BUFFER AND PRINT CPA CNTLR CHECK IF REPLACE MODE CHARACTER RSS YES, SET THE REPLACE MODE CPA CNTLC CHECK IF THE DELETE MODE CHARACTER RSS YES, SET THE DELETE CHARACTER MODE CPA CNTLS CHECK IF INSERT CHARACTER MODE? RSS YES, CPA CNTLI CHECK IF INSERT ETC. JMP EDIT1 MODE CHANGE, SET THE MODE AND CONTINUE CPA CNTLT CHECK IF END OF EDIT MODE? JMP EDIT4 DONE, MOVE INTO DISPLAY BUFFER LDB MODEF GET THE MODE FLAG SZB,RSS CHECK IF MODE IS DEFINED YET? JMP CKSHS NO, MUST BE 1ST CHARACTER CPB CNTLR REPLACE MODE? JMP REPMD REPLACE MODE CPB CNTLC DELETE MODE? JMP DELCR DELETE MODE, JUST IGNORE CHAR SPC 1 * MUST BE INSERT MODE, CONTINUE SPC 1 CPA SLASH IF "/" THEN MAKE A SPACE LDA O40 GET ASCII SPACE JSB PTEBF PUT THE CHARACTER INTO THE EDIT BUFFER JMP EDIT2 AND CONTINUE SPC 1 DELCR JSB GTCSC GET THE DELETE POSITION NOP JMP EDIT2 AND GO GET NEXT EDIT CHARACTER SPC 1 REPMA NOP TEMP SAVE OF EDIT BUFFER CHARACTER CKSHS CPA SLASH 1ST CHAR, MUST BE "/" RSS YES, DEFAULT TO THE REPLACE MODE JMP RUCMD MUST BE FMGR IMPLIED RUN COMMAND LDB CNTLR GET REPLACE MODE REPMD STA REPMA REPLACE MODE, SAVE CHAR IF NEEDED LATER STB MODEF SET THE EDIT MODE FLAG TO REPLACE STB EDITF AND SET THE EDIT FLAG JSB GTCSC GET NEXT CHARACTER FROM DISPLAY BUFFER LDA O40 NO MORE, FAKE IT WITH SPACE LDB REPMA GET THE CHARACTER FROM EDIT BUFFER CPB SLASH WHICH CHARACTER SHOULD BE STORED? RSS IF SLASH, THEN USE DISPLAY BUFFER STB A IF NOT USE THE EDIT BUFFER CHARACTER JSB PTEBF AND PUT INTO THE EDITED BUFFER JMP EDIT2 AND GET NEXT CHARACTER SPC 1 * SETUP THE DISPLAY BUFFER IF NECESSARY, AND OUTPUT TO THE TERMINAL SPC 1 EDIT3 JSB GTCSC GET REMAINING STRING FROM DISPLAY JMP EDIT4 NO MORE, MOVE INTO DISPLAY BUFFER JSB PTEBF BUFFER AND PUT INTO C.BUF JMP EDIT3 AND CONTINUE SPC 1 EDIT4 LDA O40 MAKE SURE THERE IS TRAILING SPACE IN BUFFER JSB PTEBF BECAUSE WE ARE GOING TO MAKE IT A WORD BUFFER LDA PCONT GET NUMBER OF CHARS IN BUFFER ARS DIVIDE BY 2 STA DSPLN AND SAVE THE WORD LENGTH SZA,RSS CHECK IF ANY LENGTH? JMP DECR2 NO, GET CURRENT BUFFER LIST POINTER LDA DFC.B GET FROM BUFFER ADDRESS JSB WDSPB AND WRITE OUT THE DISPLAY BUFFER JMP REAC1 AND RE-ENTER THIS SUBROUTINE SPC 1 * ROUTINE TO LIST FROM "CURSK" FOR N LINES SPC 1 LISTC JSB IFBRK CLEAR THE BREAK FLAG DEF *+1 JSB NMBLN GET NUMBER OF LINES TO PRINT LDB TOPSK GET POINTER TO TOP OF BUFFER LIST SZA,RSS CHECK IF ZERO LINES TO LIST? STB CURSK YES, LIST WHOLE BUFFER LIST STA ACCUM SET NEG NUMBER OF LINES TO LIST LIST1 JSB MCBDB AND WRITE IT OUT JSB ADVSK ADVANCE THE CURSK POINTER JMP REAC1 DONE, RE-ENTER THIS ROUTINE JSB IFBRK CHECK IF BREAK REQUESTED? DEF *+1 SSA TRYING TO STOP? JMP LIST2 YES, STOP ISZ ACCUM CHECK IF DONE? JMP LIST1 NO, CONTINUE LIST2 JSB MCBDB AND WRITE IT OUT JMP REAC1 YES, RE-ENTER THIS ROUTINE SPC 1 * WRITE BUFFER IN B-REG OUT THRU A-REG NUMBER OF WORDS TO KEYBOARD SPC 1 WRITA NOP WRITI NOP ENTRY TO WRITE A MESSAGE STA WRITA SAVE TLOG STB BUFAD SAVE MESSAGE ADDRESS JSB WRITF AND USE THE FMP WRITE ROUTINE DEF *+5 DEF CAM.I DEF .E.R. BUFAD DEF * DEF WRITA NUMBER OF WORDS JMP WRITI,I AND RETURN SPC 1 DM2K DEC -2000 DM72 DEC -72 D36 DEC 36 MSFLG ABS 0 POINTER TO ROUTINE TO HANDLE NEXT TIMEOUT DFCOL DEF ASCOL POINTER TO COLON PROMPT WORD ASCOL ASC 1,:_ PROMPT WORD ASCSY ASC 1,SY ASCII "SY" SPC 1 * DONT MOVE THE FOLLOWING 9 WORDS FOR THE EE.. ROUTINE SPC 1 ASCRU ASC 1,RU ASCII "RU" ASCP OCT 120 RIGHT JUSTIFIED ASCII "P" ASCL OCT 114 RIGHT JUSTIFIED ASCII "L" ASCUP OCT 136 RIGHT JUSTIFIED ASCII "^" ASCR OCT 122 RIGHT JUSTIFIED ASCII "R" COMMA OCT 54 RIGHT JUSTIFIED ASCII "," COLON OCT 72 RIGHT JUSTIFIED ASCII ":" SPC 1 SLASH OCT 57 RIGHT JUSTIFIED ASCII "/" CNTLR OCT 22 RIGHT JUSTIFIED ASCII (CNTL) "R" CNTLC OCT 3 RIGHT JUSTIFIED ASCII (CNTL) "C" CNTLI OCT 11 RIGHT JUSTIFIED ASCII (CNTL) "I" CNTLS OCT 23 RIGHT JUSTIFIED ASCII (CNTL) "S" MINUS OCT 55 RIGHT JUSTIFIED ASCII "-" CNTLT OCT 24 RIGHT JUSTIFIED ASCII (CNTL) "T" SPC 1 DFMES DEF *+1 DEF WAIT WAITING FOR INPUT DEF STILL STILL WAITING DEF GOING GOING DEF GOING GOING DEF GONE GONE DFGON DEF * SPC 1 WAIT DEC 11 ASC 11,WAITING FOR INPUT 5 BELLS STILL DEC 9 ASC 9,STILL WAITING 5 BELLS GOING DEC 5 O5 EQU GOING ASC 5,GOING! 4 BELLS GONE DEC 5 ASC 5,GONE! 5 BELLS SPC 1 TOPSK EQU TPSK. ADDRESS OF TOP OF BUFFER LIST BUFFER NXTSK EQU NXTK. NEXT AVAILABLE WORD IN BUFFER LIST BUFFER ENDSK EQU EDSK. END + 0 WORD OF BUFFER LIST BUFFER CURSK EQU CRSK. CURRENT DISPLAY POINTER SPC 1 * IF THE FOLLOWING THREE LINES WERE ADDED TO BUFFER LIST * IT WOULD LOOK LIKE THIS: * (1) MESSAGE * (2) TWO * (3) THREE * * BIT !15!14!13!12!11!10! 9! 8! 7! 6! 5! 4! 3! 2! 1! 0! * TOPSK ! (0) ! (4) ! * ! M ! E ! * ! S ! S ! * ! A ! G ! * ! E ! (SPACE) ! * ! (4) ! (2) ! * ! T ! W ! * ! O ! (SPACE) ! * CURSK ** ! (2) ! (3) ! * ! T ! H ! * ! R ! E ! * ! E ! (SPACE) ! * NXTSK ** ! (3) ! (0) ! * ! THIS IS BEYOND THE END OF THE BUFFER ! * ! LIST AND WILL CONTAIN GARBAGE DATA ! * ENDSK ! THIS IS LAST WORD IN BUFFER LIST BUFFER ! * * ** THESE WORDS ARE DYNAMIC POINTERS INTO LIST BUFFER SPC 1 * TAKE BUFFER POINTED TO BY A-REG OUT OF BUFFER LIST * NOTE: A-REG MUST NOT = NXTSK !!! SPC 1 DELIA NOP "FROM" POINTER DELIB NOP "TO" POINTER DELIN NOP ENTRY TO DELETE A BUFFER FROM BUFFER LIST STA DELIB SAVE POINTER TO BUFFER TO DELETE CPA NXTSK CHECK IF AT END? JMP DELIN,I YES, IGNORE DELETE REQUEST LDA DELIB,I GET THE OFFSET VALUE AND O377 MASK TO OFFSET BITS STA B SAVE IN B-REG THE DELETE BUFFER LENGTH BLF,BLF POSITION TO HIGH BITS ADB A B-REG = DELETE BUFFER LENGTH IN HI & LO-BITS ADA DELIB BUMP TO LENGTH WORD OF NEXT BUFFER-1 INA BUMP TO LENGTH WORD OF NEXT BUFFER STA DELIA SAVE "FROM" ADDRESS FOR MOVE LDA DELIA,I GET LENGTH WORD AT END-CURR/BEG-NEXT BUFFER XOR DELIB,I WITH BEG-CURR/END OF PREVIOUS BUFFER LENGTH XOR B TAKE OUT DELETE BUFFER LENGTHS LDB NXTSK GET END ADDRESS OF LAST BUFFER LENGTH WORD DELI1 STA DELIB,I AND PUT HIGHER IN BUFFER LIST CPB DELIA CHECK IF FINISHED PACKING MOVE? JMP DELI2 YES, EXIT ISZ DELIA BUMP "FROM" BUFFER ADDRESS ISZ DELIB BUMP "TO" BUFFER ADDRESS LDA DELIA,I GET NEXT WORD TO MOVE UP JMP DELI1 CONTINUE TO NEXT WORD SPC 1 DELI2 LDA DELIB MOVE THE NXTSK POINTER STA NXTSK TO ITS NEW VALUE JMP DELIN,I AND EXIT P+1 SPC 1 * ADVANCE CURRENT DISPLAY POINTER * CALLED: JSB ADVSK * * SPC 1 SAVA NOP A-REG SAVE FOR BOTTOM SUBROUTINES ADVSK NOP GET CURRENT DISPLAY BUFFER STA SAVA SAVE A-REG FOR RETURN LDA CURSK,I GET THE LENGTH AND O377 MASK TO LENGTH SZA CHECK IF AT END? INA BUMP ONE FOR GOOD MEASURE ADA CURSK SET NEW DISPLAY BUFFER POINTER CPA NXTSK CHECK IF AT END OF BUFFER LIST? JMP ADVS1 YES, SKIP ADVANCE STA CURSK FOR NEXT TIME ISZ ADVSK P+2 EXIT >> MOVED ADVS1 LDA SAVA RESTORE A-REG JMP ADVSK,I YES, EXIT SPC 1 * DECREMENT THE CURRENT DISPLAY POINTER * CALLED: JSB DECSK * * SPC 1 DECSK NOP ENTRY TO DECREMENT CURRENT POINTER CURSK STA SAVA SAVE A-REG LDB CURSK GET CURRENT DISPLAY POSITION CPB TOPSK CHECK IF ALREADY AT TOP? JMP DECS1 YES, IGNORE REQUEST LDA B,I GET THE LENGTH ALF,ALF POSITION AND O377 MASK TO JUST LENGTH CMA NEGATE - 1 ADA CURSK CALCULATE NEW "CURSK" STA CURSK AND SET NEX CURSK ISZ DECSK BUMP TO P+2 RETURN DECS1 LDA SAVA RESTORE A-REG JMP DECSK,I AND EXIT SPC 1 * MOVE "CURSK" BUFFER TO DISPLAY BUFFER AND PRINT OUT IF ANY LENGTH SPC 1 MCBDB NOP ENTRY LDA CURSK,I GET LENGTH AND O377 OF THE CURSK BUFFER SZA,RSS CHECK IF ANY LENGTH? JMP MCBD1 NO, EXIT NOP STA DSPLN YES, SET THE LENGTH LDA CURSK GET THE MESSAGE ADDRESS INA JSB WDSPB AND MOVE AND DISPLAY MCBD1 JMP MCBDB,I AND EXIT DONE SPC 1 * MOVE BUFFER IN A-REG TO DISPLAY BUFFER AND PRINT OUT SPC 1 WDSPB NOP ENTRY TO WRITE OUT THE DISPLAY BUFFER LDB DFDSP GET DISPLAY BUFFER ADDRESS JSB .MVW MOVE "DSPLN" WORDS INTO DISPLAY BUFFER DEF DSPLN OCT 0 ?? CCB GET THE BUFFER OUTPUT ADDRESS - 1 ADB DFDSP FOR ADDING TWO LEADING SPACES TO LDA DSPLN THE DISPLAY MESSAGE INA BUMP FOR THE TWO ADDITIONAL SPACES JSB WRITI JMP WDSPB,I AND RETURN SPC 1 * ROUTINE TO PUT A CHARACTER INTO THE C.BUF AFTER BEING EDITED SPC 1 PCONT NOP NUMBER OF CHARS STORED IN C.BUF PTEBF NOP ENTRY TO PUT CHARACTER IN C.BUF LDB PCONT INDEX TO CHARACTOR NUMBER CLE,ERB FORM WORD ADDRESS OF CHARACTER CPB D36 CHECK IF END OF C.BUF?? JMP PTEBF,I YES, JUST IGNORE ADB DFC.B INDEX INTO WORD JSB PTCHR AND STORE ISZ PCONT AND BUMP THE NUMB CHARS STORED JMP PTEBF,I AND EXIT SPC 1 * ROUTINE TO GET CHARACTER OUT OF C.BUF (EDIT BUFFER) * NOTE: THIS ROUTINE WILL EXIT P+1 IF OUT OF BUFFER. SPC 1 CRCNT NOP CURRENT NUMBER OF CHARACTERS IN C.BUF GTCCT NOP CHARACTER COUNTER OF EDIT LINE BUFFER (C.BUF) GTC.B NOP GET NEXT CHARACTER FROM C.BUF LDB GTCCT GET CHARACTER NUMBER FROM C.BUF CPB CRCNT CHECK IF AT END OF BUFFER? JMP GTC.3 YES, EXIT P+1 CLE,ERB CALCULATE WORD INDEX ISZ GTCCT BUMP TO NEXT CHAR FOR NEXT PASS ADB DFC.B INDEX TO WORD JSB GTCHR GET THE CHARACTER ISZ GTC.B CONTINUATION EXIT GTC.3 JMP GTC.B,I EXIT P+2 SPC 1 * ROUTINE TO GET A CHARACTER OUT OF DISPLAY BUFFER SPC 1 GTCDE NOP CURRENT CHAR NUMBER IN DISPLAY BUFFER GTCSC NOP GET NEXT CHARACTER IN DISPLAY BUFFER LDB GTCDE GET THE CHARACER NUMBER CLE,ERB CALCULATE WORD NUMBER CPB DSPLN CHECK IF AT END? JMP GTCS1 YES RETURN A ASCII SPACE ADB DFDSP ADD IN THE BUFFER START ADDRESS JSB GTCHR GET THE CHARACTER ISZ GTCDE BUMP THE CHARACTER ADDRESS ISZ GTCSC P+2 RETURN IF GOT CHAR GTCS1 JMP GTCSC,I AND EXIT P+1 SPC 1 * GET A CHARACTER ROUTINE * ENTRY >> B-REG = BUFFER WORD ADDRESS * E-REG = 1>> LEAST CHAR, =0 >> HI-CHAR SPC 1 GTCHR NOP ENTRY B-REG = WORD ADDRESS E-REG = EVEN/ODD LDA B,I GET WORD SEZ,CLE,RSS CHECK IF NEEDS POSITIONING? ALF,ALF YES, POSITION TO LO-BITS AND O377 MASK OFF HI-BITS STA B SAVE CHAR TEMP *790615 ADB OM173 CHECK IF > LOWER CASE Z SEZ,CLE,RSS YES >> EXIT ADB O32 NO, CHECK IF < LOWER CASE A SEZ,CLE UPPER CASE ANY LOWER CASE A..Z XOR O40 WHILE IN INTERACTIVE MODE JMP GTCHR,I AND EXIT A-REG = CHAR SPC 1 * ROUTINE TO GET A POSSIBLE NUMBER AFTER THE 1 CHAR COMMAND SPC 1 ACCUM NOP CONVERTED NUMBER NMBLA NOP TEMP NMBLN NOP ENTRY TO GET NUMBER OF LINES CLA CLEAR THE ACCUMLATOR NMBL1 STA ACCUM BEFORE BEGINNING NMBL2 JSB GTC.B GET THE POSSIBLE NEXT CHARACTER JMP NMBL3 NONE, EXIT P+1 CPA O40 IGNORE ANY SPACES JMP NMBL2 IN THE BUFFER JSB NUMBR CHECK IF IS A NUMBER? STA NMBLA SAVE IT TEMPORARY LDA ACCUM MPY D10 SCALE UP ONE DIGIT ADA NMBLA JMP NMBL1 SPC 1 NMBL3 LDA ACCUM GET THE ACCUMULATED NUMBER CMA,INA NEGATE JMP NMBLN,I EXIT SPC 1 NUMBR NOP ENTRY ASCII CHARACTER IN A-REG CLE CHECK AND CONVERT TO A NUMBER ADA OM72 CHECK IF IN THE 0 TO 9 SEZ,CLE,RSS ASCII RANGE ADA D10 BY THE MAGIC ALGORITHM SEZ,CLE E-REG SET IF = LEGAL NUMBER DIGIT JMP NUMBR,I AND EXIT P+1 IF NUMBER JMP RUCMD NOT NUMBER, EXECUTE IMPLIED RUN SPC 1 OM2 OCT -2 OM6 OCT -6 OM72 OCT -72 O1 OCT 1 O2 OCT 2 O3 EQU CNTLC D10 DEC 10 O32 OCT 32 O377 OCT 377 O400 OCT 400 OM173 OCT -173 SPC 1 * THE FOLLOWING IS A LIST OF COMMANDS THAT ARE POSSIBLY LONGER THAN * 2 CHARACTERS AND STILL WILL QUALIFY AS LEGAL FMGR COMMANDS. * THEREFORE YOU MAY NOT HAVE "IMPLIED" RUN COMMANDS THAT MATCH OR * ARE A SUBSET OF ANY OF THE FOLLOWING STRINGS. SPC 1 EXLST DEF *+1 ASC 3,EXIT ASC 3,LOG ASC 3,TELL ASC 3,ANNOTATE ASC 3,CREATE ASC 3,PURGE ASC 3,STORE ASC 3,DUMP ASC 3,LIST *** ASC 3,SAVE *790808 ASC 3,OFF ASC 3,TRANSFER ASC 3,PAUSE ASC 3,SET ASC 3,CALCULATE ASC 3,JOB ASC 3,EOJ ASC 3,ABORT ASC 3,HELP ASC 3,CLALL ASC 3,COPY OCT 0 END