/ ** EDIT52 ** /FULL SCREEN EDITOR FOR THE VT52. /BY JOHN WILSON, 11-JUN-84. *0 JMP I .+1 /START AT LOC 200 200 / ROW, 1 /CURRENT ROW ON VT52 [1,24] COLUMN, 0 /CURRENT COL -1 [0,79] POINT, BUFFER /TEXT BUFFER POINTER ENDPTR, BUFFER /POINTER TO END OF TEXT ESCAPE /PTR TO ROUTINE WHICH PRINTS ESCAPE, ESC=4400+.-1 /JMS I .-1 CRTLNF /PTR TO ROUTINE WHICH PRINTS CR/LF CRLF=4400+.-1 /JMS I .-1 CR=215 LF=212 RO=377 BSW=7002 /PAL-D DOESN'T KNOW THAT ONE *10 INDEX1, 0 /SCRATCH AUTOINDEXING PTRS INDEX2, 0 INDEX3, 0 PROMPT, "Y /"YES, MY CHILD? " "E /'YES, MY SON? ' SOUNDS A LITTLE BETTER, "S /BUT THAT, MY SON, WOULD BE SEXIST. ", 240 "M "Y 240 "C "H "I "L "D "? 240 0 CHAR, 0 /BUFFER TO HOLD CHARACTER TEMP1, 0 /TEMP BUFFERS TEMP2, 0 TEMP3, 0 TEMP4, 0 TEMP5, 0 PRINT= 4400+. /PRINT .ASCIZ STRING AT ADDR FOLLOWING 'PRINT' PRINTZ INC= 4400+. /INC AC, AS A TEXT PTR INC0 DEC= 4400+. /DEC AC, AS A TEXT PTR DEC0 PEEK= 4400+. /GET VALUE PT'D TO BY AC (TEXT) TO AC PEEK0 POKE= 4400+. /PUT VALUE IN CHAR TO ADDR PT'D TO BY AC (TEXT) POKE0 PRCOL, 0 /CURRENT ACTIVE COLUMN ON VT52 INVEXT, "I /"INVALID EXTENSION" "N "V "A "L "I "D 240 "E "X "T "E "N "S "I "O "N 0 FIERTX, "F /"FILE ERROR" "I "L "E 240 "E "R "R "O "R 0 BLOCK, 0 /CTRL BLOCK FOR REDRAW IF LF ON KSR 0 KBBUF, 0 /CTRL BLOCK FOR KB INPUT BUFFER 0 /KB INPUT BUFFER STARTS HERE *.+25 /ALLOW FOR LONG READS MCBFIL, 1 /CHANNEL NUMBER 0 /USE THIS ACCOUNT 0 /FILENAME (3 WORDS) 0 0 MCBTMP, 0 /CHANNEL 0 0 /THIS ACCOUNT 4544 /'ED' 5164 /'IT' 0 /'##' ICOUNT, 0 /2'S COMP OF NUMBER OF WORDS LEFT IN INPUT 0 /LOW WORD OF ABOVE IADDR, 0 /CURRENT INPUT FILE ADDRESS 0 /LSW OF ABOVE INPMCB, 0 /MCB FOR INPUT FILE 1 /INITIALIZED AT RUNTIME (SUPPOSEDLY) 0 0 0 0 CHKBGN /CHECK TO SEE IF AT BEGN OF BUFFER CHECKB=4400+.-1 /JMS I .-1 CHKEND /CHECK TO SEE IF AT END OF BUFFER CHECKE=4400+.-1 /JMS I .-1 TMPFLG, 0 /NON-ZERO IF EDITING EXISTING FILE (USING .TMP FILE) PRTEXT, 0 /FILE PROTECTION AND EXTENSION FILNAM, "F /BUFFER FOR FILENAME "I "L "N "A "M EXTNSN, ". "E "X "T 240 240 0 PAGE 1 CLA TAD (204 /SET KB BREAK TO CR,LF,VT,FF,RO KSB DUP  /ENABLE ECHO GETFIL, PRINT  /PRINT PROMPT PROMPT  /POINTER TO PROMPT TAD (KBBUF+1 /SET PTR DCA KBBUF+1 LOOP1, CLA TAD (-13 /READ 11. CHAR'S DCA KBBUF TAD (KBBUF /POINT AT PTR BLOCK KSR  /READ KB STRING TAD I KBBUF+1 /GET DELIMITER DCA CHAR /SAVE IT TAD CHAR /GET IT BACK TAD (-CR /CAR RET? CLA SNA  /SKIP IF NOT JMP INP3 /YES, END OF STRING TAD CHAR /GET BACK, AGAIN TAD (-RO /RUBOUT? CLA SNA  /SKIP IF NOT JMP INP1 /YES, HANDLE IT TAD CHAR /GET CHAR TAD (-LF /WAS IT AN LF? CLA SNA  /NO, PRINT AN LF JMP NOLF /YES, JUST PRINT CR TAD (LF  /PRINT LF TLS NOLF, CLA TAD (CR  /PRINT CR TLS PRINT  /PRINT PROMPT AGAIN PROMPT STA  /DEC PTR TAD KBBUF+1 DCA KBBUF+1 TAD KBBUF+1 /FIND - CIA TAD (KBBUF+1 DCA BLOCK /PUT IN BLOCK TAD (KBBUF+1 /GET PTR TO KB BUFFER DCA BLOCK+1 /PUT IN BLOCK+1 TAD (BLOCK /POINT AT BLOCK SAS  /PRINT STRING JMP .-2  /LOOP UNTIL DONE JMP LOOP1 /LOOP INP1, /HANDLE RUBOUT STA  /DEC PTR TAD KBBUF+1 DCA KBBUF+1 TAD KBBUF+1 /SEE IF AT BEGN OF BUFF TAD (-KBBUF-1 CLA SNA  /NO, DELETE CHAR AND ECHO JMP INP2 /YES, CR/LF AND RE-PROMPT TAD I KBBUF+1 /GET DELETED CHAR TLS  /ECHO IT STA  /DEC PTR, AGAIN TAD KBBUF+1 DCA KBBUF+1 JMP LOOP1 /AND LOOP INP2, CRLF  /PRINT CR/LF JMP GETFIL /START OVER INP3, /CR TYPED CRLF  /PRINT CR/LF DCA I KBBUF+1 /REPLACE CR WITH NUL CON  /GET TTY NUMBER DCA TEMP1 /SAVE TAD TEMP1 /GET BACK RTL  /ROTATE HIGH NIBBLE TO AC3-AC5 RAL AND (700 /CLEAR UNWANTED BITS DCA MCBTMP+4 /SET HIGH DIGIT OF TTY NUMBER TAD TEMP1 /GET BACK, AGAIN AND (7  /CLEAR HIGH BITS TAD MCBTMP+4 /ADD IN HIGH BYTE TAD (2020 /CONVERT TO FILENAME FORMAT DCA MCBTMP+4 /SET LOW 2 DIGITS OF TTY NUMBER JMP I .+1 /SKIP TO NEXT PAGE 400 / PRINTZ, 0 /PRINT .ASCIZ STRING POINT AT BY (PC) STA  /CORRECT FOR AUTO-INDEXING TAD I PRINTZ /GET PTR ISZ PRINTZ /INC PTR FOR RETURN DCA INDEX1 /SAVE PTR LOOP2, TAD I INDEX1 /GET CHAR SNA  /SKIP IF NOT 0 JMP I PRINTZ /OTHERWISE RETURN (AC CLEAR) TLS  /PRINT CHAR CLA JMP LOOP2 /LOOP / CRTLNF, 0 /PRINT CR/LF, CLEAR AC CLA TAD (CR  /PRINT CR TLS CLA TAD (LF  /PRINT LF TLS CLA DCA PRCOL /SET COLUMN TO 0 JMP I CRTLNF /RETURN / ESCAPE, 0 /PRINT "$<@PC>" CLA TAD (233 /PRINT ESCAPE TLS CLA TAD I ESCAPE /GET CHAR TLS  /PRINT IT CLA ISZ ESCAPE /POINT PAST CHAR JMP I ESCAPE / PAGE 2 /LINE NOW READ INTO KBBUF, AND FILENAME FOR EDITNN.TMP SET UP. /INIT FILNAM TO SPACES: TAD (-12 /10. SPACES DCA TEMP1 /CTR TAD (FILNAM-1 /POINT AT FILENAME DCA INDEX1 LOOP3, TAD (240 /LOAD SPACE DCA I INDEX1 /DEPOSIT IT ISZ TEMP1 /INC COUNT JMP LOOP3 /LOOP IF NOT ZERO TAD (".  /RESET '.' IN FILNAM DCA EXTNSN /COPY AND FORMAT FILENAME INTO FILNAM... TAD (KBBUF+1 /POINT AT FILE NAME DCA INDEX1 TAD (FILNAM-1 /POINT AT DEST. BUFFER DCA INDEX2 TAD (-7  /6 CHAR'S MAX DCA TEMP1 LOOP5, TAD I INDEX1 /GET A CHAR SNA  /SKIP IF NOT END OF STRING JMP LOOKUP /END, GO LOOK UP EXTENSION DCA CHAR /SAVE CHAR TAD CHAR /GET IT BACK TAD (-". /BEGN OF EXTENSION? CLA SNA  /SKIP IF NOT JMP DOEXT /YES, DO IT CLL TAD CHAR /GET BACK CHAR TAD (-241 /BLANK OR CTRL CHAR? CLA SNL  /NO, CONT JMP LOOP5 /YES, IGNORE ISZ TEMP1 /INC CHAR COUNT SKP  /SKIP IF NOT FULL JMP FILERR /FILENAME TOO LONG TAD CHAR /COPY DCA I INDEX2 JMP LOOP5 /LOOP DOEXT, TAD (EXTNSN /POINT AT EXTENSION DCA INDEX2 TAD (-4  /3 CHAR'S MAX DCA TEMP1 LOOP6, TAD I INDEX1 /GET CHAR SNA  /SKIP IF NOT END OF FILE NAME JMP LOOKUP /LOOK UP EXTENSION DCA CHAR /SAVE CHAR CLL TAD CHAR /GET IT BACK TAD (-241 /CTRL CHAR OR BLANK? CLA SNL  /NO, SKIP JMP LOOP6 /YES, IGNORE ISZ TEMP1 /INC CHAR COUNT SKP  /SKIP IF NOT FULL JMP FILERR /FILENAME TOO LONG TAD CHAR /COPY DCA I INDEX2 JMP LOOP6 /LOOP /LOOK UP EXTENSION AND FIND CORRESPONDING PROTECTION CODE LOOKUP, TAD (EXTENS-1 /POINT AT EXTENSION TABLE DCA INDEX1 TAD (-14 /NUMBER OF EXTENSIONS DCA TEMP1 DCA PRTEXT /INIT ENTRY CTR LOOP7, TAD (EXTNSN /PT AT EXTENSION DCA INDEX2 TAD (-3  /COMPARE 3 CHAR'S DCA TEMP2 TAD (-4  /'HIT' COUNT DCA TEMP3 LOOP8, TAD I INDEX1 /GET A WORD FROM TABLE TAD I INDEX2 /ADD TO WORD FROM FILENAME CLA SNA  /EQUAL? ISZ TEMP3 /YES, HIT ISZ TEMP2 /INC LOOP CTR JMP LOOP8 /LOOP ISZ TEMP3 /3 HITS? SKP  /NO, CONT JMP EXMTCH /YES, DEAL WITH IT ISZ PRTEXT /INC EXTENSION CTR ISZ TEMP1 /INC OUTER LOOP COUNTER JMP LOOP7 /LOOP PRINT  /PRINT ERROR MESSAGE INVEXT  /"INVALID EXTENSION" CRLF  /CR,LF JMP I .+1 /READ ANOTHER LINE GETFIL EXMTCH, TAD PRTEXT /GET EXTENSION CLL RTR  /ROTATE TO AC0-AC4 RTR RTR TAD (12  /DEFAULT PROTECTION IS <12> DCA PRTEXT /SAVE /NOW PACK FILENAME INTO SIXBIT AND TRY TO OPEN THE FILE... TAD (MCBFIL+1 /GET PTR TO MONITOR COMM. BLOCK DCA INDEX1 TAD (FILNAM-1 /PTR TO FILE NAME DCA INDEX2 /SAVE IT, TOO JMS I (PACK /PACK 6 ASCII CHAR'S INTO 3 WORDS JMS I (PACK JMS I (PACK JMP I .+1 /GO TRY TO OPEN THE FILE OPENIT PAGE 3 PACK, 0 TAD I INDEX2 /GET CHAR TAD (-240 /CVT TO SIXBIT BSW  /ROTATE TO AC0-AC5 DCA TEMP1 /SAVE TAD TEMP1 /MAKE SURE LEGAL AND (77  /BOTTOM BYTE SHOULD BE CLEAR SZA JMP FILERR /ERROR IF NOT TAD I INDEX2 /GET ANOTHER CHAR TAD (-240 /CVT TO SIXBIT DCA TEMP2 /SAVE TAD TEMP2 /MAKE SURE THIS IS LEGAL AND (7700 /TOP BYTE SHOULD BE CLEAR SZA JMP FILERR /ERROR IF NOT TAD TEMP1 /ADD WORDS TOGETHER TAD TEMP2 DCA I INDEX1 /PUT IN MCB JMP I PACK /AND RETURN / OPENIT, /NOW TRY AND OPEN THE @*$% FILE!! IAC  /CHANNEL 1 DCA MCBFIL TAD (MCBFIL /POINT AT MCB OPEN  /GO FOR IT SNA  /ERROR! ERROR! JMP EXISTS /AAAHH. IT EXISTS. TAD (-7000 /ERROR 7000? (FILE NOT FOUND) SNA  /SKIP IF NOT JMP MAKEIT /FILE DOESN'T EXIST, MAKE IT FILERR, PRINT  /PRINT "FILE ERROR" FIERTX CRLF TAD (6000 /CLOSE ALL FILES CLOS JMP I .+1 /START OVER GETFIL EXISTS, /FILE EXISTS, AND IS OPEN ON CHANNEL 1 TAD (MCBTMP+2 /PT AT EDITNN.TMP FILE NAME CRF  /CREATE .TMP FILE SZA  /SKIP IF NO ERROR JMP FILERR TAD (MCBTMP /PT AT MCB OPEN  /OPEN THE .TMP FILE SZA  /SKIP IF NO ERROR JMP FILERR TAD (1612 /CHANGE EXTENSION TO .TMP PROT SZA  /SKIP IF NO ERROR JMP FILERR STA  /SET .TMP FLAG DCA TMPFLG JMP I STADDR /GO START EDITOR MAKEIT, /CREATE OUTPUT FILE, AND OPEN IT ON CHANNEL 0 TAD (MCBFIL+2 /POINT AT NAME CRF  /CREATE FILE SZA  /SKIP IF NO ERROR JMP FILERR DCA MCBFIL /RESET TO CHANNEL 0 TAD (MCBFIL /OPEN FILE OPEN SZA  /SKIP IF NO ERROR JMP FILERR TAD PRTEXT /GET FILE EXTENSION PROT  /MAKE THAT THE EXTENSION SZA  /SKIP IF NO ERROR JMP FILERR DCA TMPFLG /NOT USING .TMP FILE PRINT  /PRINT "NEW FILE" NEWFIL IAC  /AC=1 STM  /SLEEP FOR 1 SECOND JMP I .+1 /START EDITOR STADDR, START NEWFIL, "N /"NEW FILE" "E "W 240 "F "I "L "E 0 / /TABLE OF VALID FILE EXTENSIONS EXTENS, -240 /. (NULL EXTENSION) -240 -240 -"A /.ASC -"S -"C -"S /.SAV -"A -"V -"B /.BIN -"I -"N -"B /.BAS -"A -"S -"B /.BAC -"A -"C -"F /.FCL -"C -"L -"T /.TMP -"M -"P -240 /. (NULL EXTENSION) -240 -240 -"D /.DAT -"A -"T -"L /.LST -"S -"T -"P /.PAL -"A -"L PAGE 4 START, /OUTPUT FILE NOW OPEN ON CHANNEL 0. IF THE INPUT FILE EXISTS, /IT IS OPEN ON CHANNEL 1 AND TMPFLG=-1. ELSE TMPFLG=0. DCA OUTMCB /CLEAR OUTPUT FILE ADDRESS DCA OUTMCB+4 DCA OFFSET /AND OFFSET INTO CURRENT BLOCK TAD TMPFLG /IS THERE AN INPUT FILE? CLA SNA  /YES, SET IT UP JMP START1 /NO, SKIP DCA IADDR /CLEAR INPUT ADDRESS DCA IADDR+1 DCA ICOUNT /AND WORD COUNT DCA ICOUNT+1 IAC  /AC=1 DCA KBBUF+2 /USE KB BUFFER FOR SCRATCH CORE TAD (KBBUF+2 /POINT AT IT FINF  /GET CHANNEL 1 INFORMATION TAD KBBUF+10 /GET FILE SIZE (IN SEG'S) CIA  /NEGATE DCA TEMP1 /AND SAVE IT SIZE  /GET SEGMENT SIZE DCA TEMP2 /SAVE IT LOOP9, CLL TAD TEMP2 /GET BLOCK SIZE TAD ICOUNT+1 /GET LOW WORD OF FILE SIZE DCA ICOUNT+1 /ADD ANOTHER BLOCK SZL  /SKIP IF NO CARRY ISZ ICOUNT /INC HIGH WORD ISZ TEMP1 /INC LOOP CTR JMP LOOP9 /LOOP /FILE SIZE IN WORDS IS NOW IN ICOUNT:ICOUNT+1. NOW NEGATE IT: TAD ICOUNT /GET HIGH WORD CMA CLL  /COMPLEMENT DCA ICOUNT TAD ICOUNT+1 /GET LOW CIA  /NEGATE, SETTING LINK DCA ICOUNT+1 SZL  /SKIP IF NO CARRY ISZ ICOUNT /OTHERWISE INC HIGH WORD START1, JMS I (YANK /FILL BUFFER STA  /SET KB BREAK KSB  /TO ANYTHING UND  /DISABLE ECHO DCA BGNBUF /BUFFER STARTS AT LOGICAL 0 TAD (207 /RING TERMINAL BELL TLS  /(OR WHATEVER IT IS ON A VT52) JMP I .+1 /FILL SCREEN AND EDIT TOP / CHKBGN, 0 /CHECK AC AGAINST BEGINNING OF BUFFER. /ON RETURN, AC=-1 IF AT BEGN, ELSE 0. CIA  /NEGATE TAD BGNBUF /AC=BEGN OF ACTIVE PART OF BUFFER? CLA SNA  /SKIP IF NOT CMA  /COMP AC IF SO JMP I CHKBGN /RETURN BGNBUF, 0 /TEXT PTR TO BGN OF CURRENT PAGE IN BUFFER / PRLINE, 0 /PRINT LINE FROM (AC) TO OR /ON RETURN, AC POINTS TO WORD AFTER LAST ONE PRINTED. /IF WAS PRINTED, AC=0. DCA TEMP3 /SAVE PTR LOOP12, CLA TAD TEMP3 /GET PTR CHECKE  /AT END OF BUFFER? CLA SNA  /SKIP IF SO JMP PRLIN1 /OTHERWISE CONTINUE PRINT  /PRINT "$J" ENDTXT JMP I PRLINE /RETURN (AC=0 AFTER PRINT) ENDTXT, "< /"" "E "N "D "> 233 /$J - CLEAR REST OF SCREEN "J 0 / PRLIN1, TAD TEMP3 /GET A CHAR PEEK INC  /INC PTR DCA TEMP3 /(CHAR IS IN CHAR) ISZ TEMP3 /INC PTR CLL TAD CHAR /CTRL CHAR? TAD (-240 CLA SNL  /SKIP IF NOT JMP PRLIN2 /DEAL WITH IT IF SO TAD CHAR /GET THE CHAR TLS  /PRINT IT ISZ PRCOL /MOVE OVER A COL NOP  /IGNORE CARRY JMP LOOP12 /LOOP PRLIN2, TAD CHAR /GET CHAR TAD (-211 /TAB? CLA SNA  /SKIP IF NOT JMP I (TAB /GO PRINT IT IF SO TAD CHAR /GET CHAR BACK TAD (-CR /CR? CLA SNA  /SKIP IF NOT JMP LOOP12 /IGNORE IF SO TAD CHAR /GET CHAR TAD (-LF /LF? CLA SZA  /SKIP IF SO JMP PRLIN3 /DEAL WITH IT IF NOT TAD TEMP3 /GET PTR JMP I PRLINE /RETURN PRLIN3, TAD ("^  /PRINT '^' TLS 7203  /LOAD 64. (CLA IAC BSW - PALD BUG) TAD CHAR /ADD CHAR TLS  /PRINT CHR$(CHAR+64.) CLA CLL CML RTL /LOAD 2. TAD PRCOL /ADD 2 TO PRCOL DCA PRCOL JMP LOOP12 /LOOP / PAGE 5 OUTMCB, 0 /OUTPUT FILE MCB 0 /CHANNEL 0 0 /WORD COUNT 0 /CORE ADDR 0 /LSW OF DISK ADDR 0 /CONTAINS ERROR CODE ON RETURN OFFSET, -400 /OFFSET INTO CURRENT SEGMENT OF OUTPUT FILE / YANK, 0 /IF THE BUFFER ISN'T EMPTY, DUMP IT TO THE /OUTPUT FILE. THEN READ ANOTHER PAGE FROM THE INPUT FILE, IF AVAILABLE. /IF THE PAGE DOESN'T END WITH A FORM FEED, OR IF IT DOESN'T FIT IN /MEMORY, THE BUFFER IS FILLED AND THE FORM FEED IS ADDED WHEN THE /PAGE IS WRITTEN. CLA TAD ENTPTR /ENDPTR=0? SNA  /SKIP IF NOT JMP YANK2 /NO, DON'T WRITE CMA  /ADD ONE (FORM FEED) AND NEGATE DCA TEMP1 /SAVE WORD COUNT TAD TEMP1 /GET BACK DCA TEMP2 /SAVE (LOOP CTR) SIZE  /GET SEGMENT SIZE CIA  /NEGATE DCA TEMP3 /SAVE DCA OUTMCB+2 /# OF NEW BLOCKS NEEDED LOOP10, ISZ OFFSET /ADD A WORD JMP YANK1 /LOOP IF NO OVERFLOW ISZ OUTMCB+2 /MOVING INTO A NEW BLOCK TAD TEMP3 /REINIT OFFSET TO - DCA OFFSET YANK1, ISZ TEMP2 /INC - JMP LOOP10 /LOOP IF NO SKIP TAD (214 /LOAD FORM FEED DCA I ENDPTR /POKE AT TAD OUTMCB+2 /GET SEG COUNT CLA SNA  /SKIP IF NOT ZERO JMP .+3  /FILE DOESN'T NEED EXTENDING TAD (OUTMCB+1 /POINT AT CHANNEL NUMBER EXT  /EXTEND FILE TAD TEMP1 /GET -WC DCA OUTMCB+2 /PUT IN MCB TAD (BUFFER-1 /POINT AT BUFFER DCA OUTMCB+3 /PUT PTR IN MCB TAD (OUTMCB /PT AT MONITOR CONTROL BLOCK WFILE  /WRITE BUFFER TO OUTPUT FILE YANK2, /BUFFER CONTENTS (IF ANY) HAVE BEEN WRITTEN TO OUTPUT FILE TAD (BUFFER /SET END POINTER DCA ENDPTR TAD TMPFLG /IS THERE AN INPUT FILE? CLA SNA  /YES, READ A PAGE JMP I YANK /RETURN, AC CLEAR (NO MORE INPUT) TAD (BUFFER+1 /GET BUFFER LENGTH (ALLOW FOR FORM FEED) DCA INPMCB+2 /PUT WORD COUNT (TENTATIVE) TAD ICOUNT /GET HIGH WORD OF WORD COUNT IAC  /WAS IT 7777? CLA SZA  /SKIP IF SO JMP YANK3 /NO, FILE IS DEFINITELY BIG ENOUGH CLL TAD ICOUNT+1 /GET NEGATIVE OF LOW WORD OF WORD COUNT TAD (-BUFFER-1 /ADD IN BUFFER LENGTH /THIS WOULD CAUSE CARRY IF BUFFER LENGTH>FILE LENGTH CLA SNL  /SKIP ON CARRY JMP YANK3 /FILE IS BIG ENOUGH, GO READ TAD ICOUNT+1 /GET WORD COUNT SNA  /SKIP IF NOT ZERO JMP I YANK /ELSE RETURN (ALREADY READ WHOLE FILE) DCA INPMCB+2 /PUT IN MCB YANK3, TAD INPMCB+2 /GET WORD COUNT DCA TEMP1 /SAVE TAD (BUFFER-1 /GET STARTING ADDRESS DCA INPMCB+3 /PUT IN MCB TAD IADDR /GET DISK ADDRESS - HIGH DCA INPMCB TAD IADDR+1 /GET DISK ADDRESS - LOW DCA INPMCB+4 TAD (INPMCB /POINT AT MCB RFILE  /READ A BUFFERFULL TAD (BUFFER-1 /GET PTR TO TOP OF BUFFER DCA INDEX1 /PUT IN AI PTR LOOP11, ISZ IADDR+1 /INC LOW WORD OF ADDR SKP  /SKIP IF NO CARRY ISZ IADDR /INC HIGH WORD OF ADDR ISZ ICOUNT+1 /INC LOW WORD OF WC SKP  /SKIP IF NO CARRY ISZ ICOUNT /INC HIGH WORD OF WC NOP  /DON'T WORRY ABOUT CARRY NOW TAD I INDEX1 /READ A WORD TAD (-214 /FORM FEED? CLA SNA  /SKIP IF NOT JMP YANK4 /YES, END OF PAGE ISZ TEMP1 /INC WORD COUNT JMP LOOP11 /LOOP IF NO CARRY /PAGE TOO LARGE TO FIT IN BUFFER. THIS IS AN ERROR, BUT NOTHING /IS LOST. THE BUFFER IS COMPLETELY FULL, THOUGH, AND INSERTING NEW /TEXT IS NOT POSSIBLE. YANK4, TAD INDEX1 /GET PTR DCA ENDPTR /REPLACE END PTR STA  /BUFFER WAS INDEED READ JMP I YANK /RETURN / TAB, /PRINT TAB TAD (240 /PRINT A SPACE TLS ISZ PRCOL /INC PRCOL NOP  /CARRY OK CLA TAD PRCOL /GET PRCOL AND (7  /CHECK BOTTOM 3 BITS CLA SZA  /SKIP IF 0 JMP TAB  /ELSE LOOP JMP I (LOOP12 /RETURN TO PRLINE / PAGE 6 PRSCR, /ROUTINE TO REDRAW SCREEN ESC  /HOME CURSOR "H DCA PRCOL /COLUMN 0 TAD (-27 /PRINT 23. LINES DCA TEMP4 DCA BOTSCR /INIT BOTSCR TAD TOPSCR /GET PTR TO TOP OF SCREEN LOOP13, JMS I (PRNLIN /PRINT A LINE, CLEAR REST OF LINE SNA  /SKIP IF NOT REACHED JMP PRSCR1 /OFF END, GO EXIT ROUTINE DCA TEMP5 /SAVE PTR CRLF  /CR/LF TAD TEMP5 /GET PTR ISZ TEMP4 /INC LOOP CTR JMP LOOP13 /LOOP DCA BOTSCR /UPDATE BOTSCR TAD BOTSCR /GET AC BACK JMS I (PRNLIN /PRINT LAST LINE PRSCR1, JMS PLACE /PLACE CURSOR JMP I (GETKEY /GO EDIT / PLACE, 0 /PLACE CURSOR AT ROW, COLUMN CLA TAD ROW  /GET ROW TAD (37  /CONVERT TO VT52 FORMAT DCA YTXT+2 TAD COLUMN /GET COLUMN TAD (40  /CONVERT TO VT52 FORMAT DCA YTXT+3 PRINT  /PLACE CURSOR YTXT TAD COLUMN /UPDATE PRCOL DCA PRCOL JMP I PLACE /RETURN YTXT, 233 /$Y "Y 0 /LINE 0 /COLUMN 0 /END OF STRING / BGNLIN, 0 /ROUTINE TO MOVE AC TO BEGN OF LINE DCA TEMP5 /SAVE AC TAD TEMP5 /GET IT BACK CHECKB  /AT BEGN OF BUFF? CLA SZA  /SKIP IF NOT JMP BOL1 /YES, RETURN CMA  /DEC PTR TAD TEMP5 DCA TEMP5 TAD I TEMP5 /GET CHAR PTD AT TAD (-LF /LF? CLA SZA  /SKIP IF SO JMP BGNLIN+2 /OTHERWISE LOOP IAC  /LOAD 1 BOL1, TAD TEMP5 /GET PTR JMP I BGNLIN /RETURN / BGNLST, 0 /ROUTINE TO MOVE AC TO BEGN OF LAST LINE JMS BGNLIN /MOVE TO BEGN OF THIS LINE DCA TEMP5 /SAVE AC TAD TEMP5 /GET IT BACK CHECKB  /AT BEGN? CLA SZA  /SKIP IF NOT JMP BOLL1 /RETURN IF SO CMA  /DEC PTR TAD TEMP5 JMS BGNLIN /MOVE TO BEGN OF LAST LINE JMP I BGNLST /AND RETURN BOLL1, TAD TEMP5 /GET PTR JMP I BGNLST /RETURN / BGNNXT, 0 /ROUTINE TO MOVE AC TO BEGN OF NEXT LINE DCA TEMP5 /SAVE PTR TAD I TEMP5 /GET CHAR PTD AT TAD (-LF /LF? CLA SNA  /SKIP IF NOT JMP BONL1 /YES, EXIT LOOP TAD TEMP5 /CHECK FOR END OF BUFFER CHECKE CLA SZA  /SKIP IF NOT END JMP BONL2 /END OF BUFFER, RETURN ISZ TEMP5 /INC PTR JMP BGNNXT+2 /LOOP BONL1, TAD TEMP5 /CHECK FOR END OF BUFFER CHECKE CLA SNA  /SKIP IF END ISZ TEMP5 /ELSE INC PTR BONL2, TAD TEMP5 /GET PTR JMP I BGNNXT /RETURN / ENDLIN, 0 /ROUTINE TO MOVE AC TO END OF THIS LINE DCA TEMP5 /SAVE PTR TAD I TEMP5 /GET CHAR PTD AT TAD (-CR /CR? CLA SNA  /SKIP IF NOT JMP EOL1 /YES, EXIT LOOP TAD TEMP5 /CHECK FOR END CHECKE CLA SZA  /SKIP IF NOT END JMP EOL1 /END, RETURN ISZ TEMP5 /INC PTR JMP ENDLIN+2 /LOOP EOL1, TAD TEMP5 /GET PTR JMP I ENDLIN /RETURN / TOPSCR, BUFFER /ADDRESS OF FIRST LINE ON SCREEN BOTSCR, 0 /ADDR OF LAST LINE ON SCREEN (0 IF SCREEN NOT FULL) / TOP, /ROUTINE TO GO TO THE TOP OF THE PAGE CLA IAC  /LOAD 1 DCA ROW  /SET ROW DCA COLUMN /SET COLUMN TAD (BUFFER /PT AT BUFFER DCA POINT /UPDATE TEXT PTR TAD (BUFFER DCA TOPSCR /AND TOPSCR JMP PRSCR /REDRAW SCREEN AND JUMP TO GETKEY / NEXT, /ROUTINE TO GO TO THE NEXT PAGE JMS I (YANK /YANK PAGE SZA  /GO RING BELL IF NO INPUT JMP TOP  /ELSE REDRAW SCREEN TAD (207 /RING BELL TLS JMP TOP  /AND REDRAW SCREEN / PAGE 7 GETKEY, /READ A KEY, AND DEAL WITH IT KRB  /GET A CHARACTER FROM _TI: DCA CHAR /SAVE IT TAD CHAR /GET IT BACK TAD (-CR /WAS IT A CR? CLA SNA  /SKIP IF NOT JMP CARRET /INSERT CARRIAGE RETURN, LINE FEED TAD CHAR /GET BACK TAD (-LF /WAS IT AN LF? CLA SNA  /SKIP IF NOT JMP I (PRSCR /REDRAW SCREEN TAD CHAR /GET BACK TAD (-233 /WAS IT AN ESCAPE? CLA SNA  /SKIP IF NOT JMP I (FUNKEY /FUNCTION KEY TAD CHAR /GET BACK TAD (-210 /BACKSPACE? CLA SNA  /SKIP IF NOT JMP BCKSPC /GO TO BEGN OF LINE INSERT, /THEN INSERT IT JMS I (INSCHR /PUT IN BUFFER STA  /LOAD -1 TAD POINT /GET JMS I (PRLINE /REDRAW REST OF LINE JMS I (FIXCOL /FIX COLUMN JMS I (PLACE /PUT CURSOR TAD I (BOTSCR /INC BOTSCR, IF NON-ZERO SZA  /SKIP IF ZERO ISZ I (BOTSCR /INC JMP GETKEY /DO ANOTHER KEY / CARRET, /INSERT CR/LF, DEAL WITH SCROLLING JMS I (INSCHR /INSERT CR TAD (LF  /INSERT LF DCA CHAR JMS I (INSCHR DCA COLUMN /NOW IN COLUMN 0 TAD I (BOTSCR / ON SCREEN? CLA SNA JMP INCRDN /YES, SCROLL DOWN / IS EITHER NOT ON SCREEN, OR ON LAST LINE. TAD ROW  /GET VT52 LINE NUMBER TAD (-21 /ROW>=17.? CLA SNL  /SKIP IF SO JMP INCRDN /OTHERWISE SCROLL DOWN INCRUP, ESC  /HOME CURSOR "H DCA PRCOL /CLEAR PRCOL TAD ROW  /GET LINE NUMBER CIA  /NEGATE IAC  /SAVE ONE LINE TILL LAST DCA TEMP4 /PRINT THAT MANY LINES TAD I (TOPSCR /GET PTR TO TOP OF SCREEN JMS I (BGNNXT /MOVE TO NEXT LINE DCA I (TOPSCR /SET NEW TOP OF SCREEN TAD I (TOPSCR /GET ADDR BACK LOOP14, JMS PRNLIN /PRINT A LINE DCA TEMP5 /SAVE AC CRLF  /PRINT CR,LF TAD TEMP5 /RESTORE AC ISZ TEMP4 /INC LOOP CTR JMP LOOP14 /LOOP JMS PRNLIN /PRINT LAST LINE W/O CR, LF (IN CASE LINE 24) JMS I (PLACE /REPLACE CURSOR CLA CLL CML RTL /INC BOTSCR BY 2 (CR, LF) TAD I (BOTSCR DCA I (BOTSCR JMP GETKEY /RETURN INCRDN, /SCROLL DOWN ESC  /CLEAR REST OF THIS LINE "K CRLF  /CR,LF ISZ ROW  /FIX ROW (MOVING DOWN ONE) TAD POINT /GET TEXT PTR DCA TEMP5 /SAVE TAD ROW  /GET ROW TAD (-30 /FIND -<24-ROW> SNA  /SKIP IF NOT ZERO JMP ICRDN1 /DON'T BOTHER WITH LOOP DCA TEMP4 /(NUMBER OF LINES TO REDRAW -1) LOOP15, TAD TEMP5 /GET PTR JMS PRNLIN /DO A LINE DCA TEMP5 /SAVE AC TAD TEMP5 /RESTORE CLA SNA  /SKIP IF NOT OFF END OF BUFFER JMP ICRDN1 /SKIP OVER REST OF LOOP CRLF  /CR,LF ISZ TEMP4 /INC LOOP CTR JMP LOOP15 /LOOP ICRDN1, TAD TEMP5 /GET PTR DCA I (BOTSCR /SET NEW BOTTOM LINE OF SCREEN TAD TEMP5 /GET PTR BACK SZA  /SKIP IF ALREADY OFF JMS PRNLIN /PRINT LAST LINE JMS I (PLACE /REPLACE CURSOR JMP GETKEY /AND RETURN / PRNLIN, 0 /CALL PRLINE, THEN CLEAR REST OF LINE JMS I (PRLINE /PRINT LINE DCA CHAR /SAVE AC, IN CASE 0 (NOT ALREADY SAVED) ESC  /CLEAR REST OF LINE "K TAD CHAR /GET ADDR BACK FROM PRLINE JMP I PRNLIN /RETURN / BCKSPC, /GO TO BEGN OF LINE TAD POINT /GET PTR JMS I (BGNLIN /MOVE TO BEGN OF LINE DCA POINT /SAVE DCA PRCOL /MOVE TO COLUMN 0 DCA COLUMN /MAKE SURE EVERYONE KNOWS TAD (CR  /PRINT CR TLS JMP GETKEY /DO ANOTHER KEY / PAGE 10 INSCHR, 0 /INSERT CHARACTER FROM CHAR INTO BUFFER AT POINT ISZ ENDPTR /INC END PTR CLA IAC  /LOAD @#ENDPTR +1 TAD ENDPTR CLA SZA  /SKIP IF ZERO (BUFFER FULL) JMP INSCH1 /BUFFER NOT FULL TAD (207 /RING BELL TLS CLA CLL CMA RAL /LOAD 7776 DCA ENDPTR /REPLACE ENDPTR JMP I INSCHR /RETURN INSCH1, STA  /LOAD ENDPTR -1 TAD ENDPTR CIA  /NEGATE TAD POINT SNA  /CONTINUE IF OLD ENDPTR<>POINT JMP INSCH3 /ENDPTR=POINT, SKIP THE BLOCK MOVE CLA CLL CMA RAL /LOAD @#ENDPTR -2 TAD ENDPTR INSCH2, DCA TEMP1 /SET PTR TAD I TEMP1 /GET CHAR ISZ TEMP1 DCA I TEMP1 /MOVE IT UP ONE WORD CMA  /LOAD <@#TEMP1>-1 TAD TEMP1 CIA  /NEGATE TAD POINT /=POINT? SNA  /NO JMP INSCH3 /YES, EXIT LOOP CLA CLL CMA RAL /LOAD TAD TEMP1 JMP INSCH2 /LOOP INSCH3, TAD CHAR /GET CHAR DCA I POINT /INSERT ISZ POINT /INC PTR JMP I INSCHR /RETURN / FIXCOL, 0 /SET COLUMN TO PROPER COLUMN FOR CHAR AT @POINT CLA DCA COLUMN /START AT 0 TAD POINT /GET CURSOR POSN JMS I (BGNLIN /MOVE TO BEGN OF LINE DCA TEMP1 /SET PTR TAD POINT /SAVE -<@#POINT> CIA DCA TEMP2 /(THIS SHOULDN'T BE DONE WITHIN A LOOP - WASTE) LOOP16, TAD TEMP1 /SEE IF DONE TAD TEMP2 CLA SNA  /SKIP IF NOT JMP I FIXCOL /RETURN IF SO TAD I TEMP1 /OTHERWISE GET A CHAR DCA CHAR /SAVE CLL TAD CHAR /CTRL CHAR? TAD (-240 /THIS WILL CAUSE CARRY IF NOT CLA SNL JMP CTLCHR /CONTROL CHAR - SPECIAL ISZ COLUMN /MOVE OVER A SPACE NOP  /IGNORE CARRY - NOTE THIS IS NOT IMPOSSIBLE JMP FXCOL2 /GO INC PTR AND LOOP CTLCHR, TAD CHAR /IS IT A TAB? TAD (-211 CLA SNA  /SKIP IF NOT JMP FXCOL1 /DEAL WITH IT IF SO ISZ COLUMN /CTRL CHAR'S ARE 2 COL'S (CR & LF IMPOSSIBLE HERE) NOP ISZ COLUMN NOP /CARRY IS POSSIBLE HERE IF THE FILE IS NOTHING BUT TABS (NO CR'S OR LF'S). /THIS IS PRETTY UNLIKELY, BUT STILL IT SHOULDN'T MAKE THE EDITOR CRASH. JMP FXCOL2 /GO INC PTR AND LOOP FXCOL1, /TAB TAD COLUMN /GET COLUMN TAD (10  /MOVE PAST NEXT TAB STOP AND (7770 /BACK UP TO THE STOP DCA COLUMN /REPLACE FXCOL2, ISZ TEMP1 /INC PTR JMP LOOP16 /LOOP / CHGCOL, 0 /CHANGE COLUMN TO NEAREST CHAR IN CURRENT LINE. /ASSUMES POINT AT BEGN OF LINE, COLUMN UNCHANGED FROM LAST LINE. CLA TAD COLUMN /GET COLUMN SNA  /SKIP IF NOT AT BEGN OF LINE JMP I CHGCOL /RETURN OTHERWISE CIA  /NEGATE DCA TEMP1 /SAVE DCA COLUMN /USE COLUMN FOR TABS LOOP17, TAD POINT /SEE IF OFF END OF BUFFER CHECKE CLA SZA  /SKIP IF NOT JMP I CHGCOL /RETURN IF SO TAD I POINT /GET CHAR DCA CHAR /SAVE TAD CHAR /GET CHAR TAD (-CR /END OF LINE? SNA  /SKIP IF NOT JMP I CHGCOL /RETURN IF SO ISZ POINT /INC PTR CLA CLL  /CLEAR LINK TAD CHAR /CTRL CHAR? TAD (-240 CLA SNL  /SKIP IF NOT JMP CHCOL1 /DEAL WITH IT IF SO JMS CHCOL3 /OVER A COLUMN JMP LOOP17 /LOOP / CHCOL1, TAD CHAR /TAB? TAD (-211 CLA SNA  /SKIP IF NOT JMP CHCOL2 /DEAL WITH IT IF SO JMS CHCOL3 /MOVE OVER A COL JMS CHCOL3 /TWICE JMP LOOP17 /LOOP CHCOL2, JMS CHCOL3 /INC TAD COLUMN /AT A TAB STOP? AND (7 CLA SZA  /SKIP IF SO JMP CHCOL2 /ELSE LOOP JMP LOOP17 /DO NEXT CHAR CHCOL3, 0 /SUBR TO MOVE OVER A SPACE ISZ COLUMN /MOVE OVER A COL NOP  /IGNORE CARRY ISZ TEMP1 /DONE? JMP I CHCOL3 /NO JMP I CHGCOL /YES, RETURN / PAGE 11 FUNKEY, /DEAL WITH FUNCTION KEYS KRB  /READ ANOTHER CHAR DCA CHAR /SAVE IT TAD CHAR /GET BACK TAD (-"Q /RED KEY? CLA SNA  /SKIP IF NOT JMP I (NEXT /DO A YANK TAD CHAR /GET BACK TAD (-"R /BLACK KEY? CLA SNA  /SKIP IF NOT JMP I (TOP /GO TO TOP TAD CHAR /GET BACK TAD (-"A /UP ARROW? CLA SNA  /SKIP IF NOT JMP I (UP /MOVE UP A LINE TAD CHAR /GET BACK TAD (-"B /DOWN ARROW? CLA SNA  /SKIP IF NOT JMP I (DOWN /MOVE DOWN A LINE TAD CHAR /GET BACK TAD (-"C /RIGHT ARROW? CLA SNA  /SKIP IF NOT JMP RIGHT /MOVE RIGHT ONE COL TAD CHAR /GET BACK TAD (-"D /LEFT ARROW? CLA SNA  /SKIP IF NOT JMP LEFT /MOVE LEFT ONE COL JMP I (GETKEY /FOR NOW / RIGHT, /MOVE RIGHT ONE COLUMN. DOWN A LINE IF MOVING PAST CR/LF. TAD POINT /AT END? CHECKE SZA  /CONTINUE IF NOT JMP I (GETKEY /ELSE RETURN ISZ POINT /INC POINT TAD I POINT /SEE IF MOVING PAST END OF LINE TAD (-LF SNA  /SKIP IF NOT JMP RIGHT2 /DEAL WITH IT IF SO RIGHT1, JMS I (FIXCOL /FIX COLUMN JMS I (PLACE /PLACE CURSOR JMP I (GETKEY /RETURN RIGHT2, CMA  /DEC POINT PAST CR, IN CASE ON 2ND TO LAST LINE TAD POINT DCA POINT DCA COLUMN /RIG COLUMN SO THAT DOWN GOES TO BEGN OF LINE JMS I (DOWN+2 /MOVE DOWN A LINE JMP I (GETKEY /RETURN / LEFT, /MOVE LEFT ONE COLUMN. UP A LINE IF MOVING PAST CR/LF. TAD POINT /AT BEGN? CHECKB SZA  /CONTINUE IF NOT JMP I (GETKEY /ELSE RETURN CMA  /DEC POINT TAD POINT DCA POINT TAD I POINT /SEE IF MOVING PAST END OF LINE TAD (-LF SZA  /SKIP IF SO JMP RIGHT1 /OTHERWISE FIX CURSOR AND RETURN ISZ POINT /MOVE BACK TO THIS LINE CMA  /RIG COLUMN SO THAT UP GOES DCA COLUMN /TO END OF LINE JMS I (UP+2 /MOVE UP A LINE JMP I (GETKEY /RETURN / PAGE 12 UP, /MOVE CURSOR UP ONE LINE, WHILE KEEPING CURSOR COLUMN /AS CLOSE TO THE SAME AS POSSIBLE. JMS .+2  /MOVE CURSOR UP JMP I (GETKEY /RETURN / 0 STA  /AT FIRST LINE IN BUFFER? TAD ROW CLA SNA  /SKIP IF NOT JMP I UP+2 /RETURN TAD POINT /GET PTR JMS I (BGNLST /MOVE BACK A LINE DCA POINT /REPLACE PTR JMS I (CHGCOL /FIX TO MATCH COLUMN CLA TAD ROW  /IN ROW 8.? TAD (-10 SNA  /SKIP IF NOT JMP UP2  /DEAL WITH SCROLL STA  /DEC ROW TAD ROW DCA ROW UP1, JMS I (FIXCOL /FIX COLUMN JMS I (PLACE /PUT CURSOR JMP I UP+2 /RETURN / UP2, TAD I (TOPSCR /MAKE SURE TOP ISN'T ON SCREEN CHECKB SZA  /SKIP IF NOT JMP UP1-2 /OTHERWISE DON'T SCROLL PRINT  /SCROLL SCREEN DOWN 1 LINE SCRDWN DCA PRCOL /NOW AT COLUMN 0 TAD I (TOPSCR /GET TOP OF SCREEN JMS I (BGNLST /MOVE BACK A LINE DCA I (TOPSCR /REPLACE TAD I (TOPSCR /GET BACK JMS I (PRLINE /PRINT LINE CLA TAD I (BOTSCR /MOVE BACK A LINE JMS I (BGNLST DCA I (BOTSCR JMP UP1  /GO FIX CURSOR AND RETURN SCRDWN, 233 /$H - GO TO TOP OF SCREEN "H 233 /$I - GO UP ONE LINE, SCROLL IF NESSA (IT'S NESSA) "I 0 / DOWN, /MOVE CURSOR DOWN ONE LINE. OPPOSITE OF UP. JMS .+2 /CALL ROUTINE JMP I (GETKEY /RETURN / 0 TAD POINT /MAKE SURE NOT AT JMS I (ENDLIN CHECKE SZA  /SKIP IF NOT JMP I DOWN+2 /OTHERWISE DON'T MOVE TAD POINT /GET PTR JMS I (BGNNXT /MOVE AHEAD A LINE DCA POINT /REPLACE PTR JMS I (CHGCOL /FIX TO MATCH COLUMN CLA TAD ROW  /IN ROW 17.? TAD (-21 SNA  /SKIP IF NOT JMP DOWN2 /DEAL WITH SCROLL ISZ ROW  /MOVE DOWN A ROW DOWN1, JMS I (FIXCOL /FIX COLUMN JMS I (PLACE /PUT CURSOR JMP I DOWN+2 /RETURN DOWN2, TAD I (BOTSCR /MAKE SURE NOT ON SCREEN SNA  /SKIP IF LAST LINE NOT EMPTY JMP DOWN1-1 /NO LAST LINE, MUST BE ON SCREEN JMS I (ENDLIN CHECKE SZA  /SKIP IF NOT JMP DOWN1-1 /DON'T SCROLL IF ON SCREEN PRINT  /SCROLL SCREEN UP 1 LINE SCRUP DCA PRCOL /NOW AT LEFT MARGIN TAD I (BOTSCR /GET BOTTOM OF SCREEN JMS I (BGNNXT /MOVE AHEAD A LINE DCA I (BOTSCR /REPLACE TAD I (BOTSCR /GET BACK JMS I (PRLINE /PRINT NEW LINE CLA TAD I (TOPSCR /GET TOP OF SCREEN JMS I (BGNNXT /MOVE AHEAD A LINE DCA I (TOPSCR /REPLACE JMP DOWN1 /GO FIX CURSOR AND RETURN SCRUP, 233 /$Y7 - GO TO (24,1) "Y "7 240 212 / - SCROLL SCREEN UP 0 / PAGE BUFFER=. /TEXT BUFFER BEGINS HERE $