; LINE EDIT WORDS FOR SFS - 9/7/08 ; ; This collection of words allows line-by-line editing of ; text files. All edit commands operate on buffer 0. ; The file being edited remains open even through restart ; until closed, 0 RELEASE to abandon the edit. Existing files ; must be plain text with a CRLF after every line, lines should ; not exceed roughly 76 characters to avoid stack overflow or ; incompatibility with other things. ; ; Editing words... ; "file" FOPEN - open file, create if not found ; FCLOSE - close file (do 0 RELEASE to abandon) ; PCL - print current line ; NL PL - next line, previous line ; BF EF - beginning of file, end of file ; [-]count MLP - move line pointer ; DLINE - delete current line ; CHOP - delete current line and rest of file ; APPEND - append text at end of file ; INSERT - insert lines at current line ; LS - list 10 lines from current line ; LI - list 10 lines and increment current line ; ; When appending and inserting lines, end entry by entering ; an empty line. Enter at least one space to add blank lines. ; ; CHANGES... ; 9/7/08 Used a PC editor to rename raw word names ; Added ?EDIT word with help screen (1st word) ; Renamed MCL to MLP to better describe function ; Modified FOPEN so it prints error/warning messages ; Added code to skip page boundary when creating BMOV ; Added loading messages ; 9/6/08 ADDED BMOV SUB TO MOVE BYTES ; MODIFIED INSERT CODE TO USE BMOV ; MODIFIED DLINE TO USE BMOV ; RENAMED DCL TO DLINE ; ADDED [WORKING] MESSAGE TO INSERT/DLINE ; 7/19/05 Captured words with EXPLAIN, added LIST word ; 7/7/05 Made by typing "simple" words into the console ;--------------------- "Defining ?EDIT" $PRINT CRLF OCTAL DEFINE ?EDIT CRLF ;print stats... CWA GET 1 AND IFZ "No file is open." $PRINT ELSE CWA GET 10 AND IFNZ "Modified" ELSE "Unmodified" ENDIF $PRINT " file " $PRINT FNA GET PNUM "open, size = " $PRINT FSA GET PNUM "pos = " $PRINT FPA GET PNUM ENDIF CRLF CRLF 42 PCHR "File" $PRINT 42 PCHR " FOPEN - open file, create if not found" $PRINT CRLF "FCLOSE - close file (do 0 RELEASE to abandon)" $PRINT CRLF "PCL - print current line" $PRINT CRLF "NL PL - next line, previous line" $PRINT CRLF "BF EF - beginning of file, end of file" $PRINT CRLF "[-]count MLP - move line pointer" $PRINT CRLF "DLINE - delete current line" $PRINT CRLF "CHOP - delete current line and rest of file" $PRINT CRLF "APPEND - append text at end of file" $PRINT CRLF "INSERT - insert lines at current line" $PRINT CRLF "LS - list 10 lines from current line" $PRINT CRLF "LI - list 10 lines and increment current line" $PRINT CRLF END ;--------------------- ; Avoid page error when creating BMOV... 2000 EOD 1777 AND SUB 160 SUB ;not precise, a bit over VARIABLE ~PAD 141 ;variable size = allocated space - 17 octal DEFINE TEMP ;self-deleting temp word IF<0 "Declaring ~PAD" $PRINT CRLF "TEMP" $DEFADR 4 SUB 0 PUT ELSE "~PAD" $DEFADR 4 SUB 0 PUT ENDIF END TEMP ;run/remove temp word and ~PAD if not needed ;--------------------- "Creating BMOV" $PRINT CRLF OCTAL CREATE BMOV * BYTE MOVE... STACK = BYTEADDRESS BYTEOFFSET BYTECOUNT * BYTEADDRESS MUST ALREADY HAVE BUFFER OFFSET ADDED * USPACE MUST ALREADY BE RUN TO POINT ALTMEM TO BUFFER * IF OFFSET POSITIVE THEN LOOPS BACKWARDS AS EACH MOVE GOES FOREWARD * IF OFFSET NEGATIVE THEN LOOPS FORWARD AS EACH MOVE GOES BACKWARDS JMP START BCNT OCT 0 BYTE COUNT CCNT OCT 0 -COUNT FOR LOOP CONTROL SADR OCT 0 SOURCE BYTE ADDRESS DADR OCT 0 DESTINATION BYTE ADDRESS XFER OCT 0 WORD BEING TRANSFERED AXFER DEF XFER ADDRESS OF XFER BOFS OCT 0 PLACE TO PUT OFFSET SPEC MONE OCT -1 MINUS 1 FOR DECREMENTING MERGE OCT 0 PLACE TO MERGE WITH DESTINATION AMERGE DEF MERGE ADDRESS OF MERGE MSKE OCT 177400 MASK FOR EVEN BYTES MSKO OCT 377 MASK FOR ODD BYTES * START JSB ZSPOP,I GET BYTE COUNT STA BCNT SAVE IT CMA,INA 2'S COMPLEMENT IT STA CCNT SAVE IT FOR LOOP CONTROL JSB ZSPOP,I GET BYTE OFFSET STA BOFS SAVE IT JSB ZSPOP,I GET SOURCE ADDRESS STA SADR SAVE IT ADA BOFS ADD/SUBTRACT OFFSET STA DADR SAVE DESTINATION BYTE ADDRESS LDA BOFS GET BYTE OFFSET SZA,RSS SKIP IF A IS NOT 0 JMP ZNXT,I EXIT IF OFFSET=0, NO MOVE NEEDED SSA,RSS SKIP IF OFFSET NEGATIVE JMP DOBACK IF FORWARD, LOOP BACKWARDS * LOOP FORWARDS, COPY EACH BYTE BACKWARDS FLOOP JSB MBYTE MOVE BYTE ISZ SADR INC SOURCE ADDR (BETTER NOT BE 0) ISZ DADR INC DEST ADDR (BETTER NOT BE 0) ISZ CCNT INC -COUNT, SKIP IF 0 JMP FLOOP IF MORE THEN KEEP LOOPING JMP ZNXT,I DONE * LOOP BACKWARDS, COPY EACH BYTE FORWARDS DOBACK LDA SADR GET SOURCE ADDRESS ADA BCNT ADD BYTE COUNT ADA MONE MINUS 1 TO POINT TO LAST BYTE STA SADR SAVE IT ADA BOFS ADD OFFSET STA DADR SAVE NEW LAST DEST BYTE BLOOP JSB MBYTE MOVE BYTE LDA SADR GET SRC ADDR ADA MONE DECREMENT STA SADR SAVE IT LDA DADR GET DEST ADDR ADA MONE DECREMENT STA DADR SAVE IT ISZ CCNT INC -COUNT, SKIP IF 0 JMP BLOOP IF MORE THEN KEEP LOOPING JMP ZNXT,I DONE * SUBROUTINE - MOVE ONE BYTE IN ALT MEM * FROM SADR TO DADR (BYTE ADDRESSES) MBYTE NOP SUBROUTINE RETURN ADDRESS CLA,INA A=1 CAX X=1, NUMBER OF WORDS LDA SADR GET SOURCE ADDRESS CLE,ERA DIVIDE BY 2 TO GET WORD ADDRESS LDB AXFER B=DESTINATION (XFER LOC) MWF MOVE WORD FROM ALT MEM TO XFER LDA SADR GET SRC ADDR SLA SKIP IF BIT 0=0 (EVEN) JMP ODD DO ODD MASK LDA XFER GET XFER WORD AND MSKE SET BITS 0-7 TO ZERO STA XFER WRITE BACK JMP DOMERG JUMP TO MERGE WITH DEST ODD LDA XFER AND MSKO SET BITS 8-15 TO ZERO STA XFER DOMERG CLA,INA CAX X=1 LDA DADR CLE,ERA A=SOURCE (EXISTING DESTINATION) LDB AMERGE B=DEST (MERGE VAR) MWF MOVE WORD FROM ALT MEM LDA DADR GET DEST ADDR SLA,RSS SKIP IF ODD DEST ADDR JMP PEVEN IF EVEN PRESERVE BITS 0-7 LDA MERGE AND MSKE PRESERVE BITS 8-15 STA MERGE JMP DOSWAP PEVEN LDA MERGE AND MSKO PRESERVE BITS 0-7 STA MERGE DOSWAP LDA BOFS GET BYTE OFFSET SLA,RSS SKIP IF ODD JMP DO_OR JUMP TO COMBINE LDA XFER ALF,ALF STA XFER SWAP BYTES FOR ODD TRANSFER DO_OR LDA MERGE GET EXISTING DEST IOR XFER MERGE WITH BYTE FROM SOURCE LOC STA MERGE CLA,INA CAX X=1 LDA AMERGE A=SOURCE - MERGE LOC LDB DADR CLE,ERB B=DESTINATION - ALT MEM LOC MWI MOVE WORD INTO ALT MEM JMP MBYTE,I RETURN FROM SUBROUTINE * END OF BMOV CODE END ;--------------------- "Defining FOPEN" $PRINT CRLF OCTAL DEFINE FOPEN ;mod 9/7/08 CWA GET IFNZ "Already open" $PRINT $DROP ELSE #0 DRV GET $VOL DIRECTORY #0 $DUP OPEN FSS GET DEC DEC IFZ " Creating..." $PRINT #0 $DUP CNF #0 $DUP OPEN ENDIF $DROP FSA GET IFNZ ;if not an empty file #0 FSA GET 2 SUB SEEK MS_SAVE #0 000000 #1 SWAP +DO NL +LOOP < 000000 2CPL #1 SWAP +DO PL +LOOP DEFAULT DROP ENDCASE END ;--------------------- "Defining APPEND" $PRINT CRLF OCTAL DEFINE APPEND CWA GET #1 AND IFNZ EF MS_SAVE #0 >FILE DO $IN $LEN IFZ $DROP #1 ELSE MS$OUT MSCRLF #0 ENDIF UNTIL MS_RESTORE ENDIF END ;--------------------- "Defining INSERT" $PRINT CRLF OCTAL DEFINE INSERT ;MOD 9/6/08 FPA GET FSA GET SUB IFZ APPEND ELSE CWA GET #1 AND IFNZ MS_SAVE #0 >FILE DO $IN $LEN DUP IFZ DROP $DROP #1 ELSE "[WORKING]" $PRINT INC INC FPA GET DUP S>Z ;GET FILE POS, DUP TO Z 4 ADD ;ADD 4 BYTES FOR AM ADDRESS OVER ;OFFSET TO MOVE FSA GET FPA GET SUB ;CALC NUMBER OF BYTES TO MOVE #1 USPACE BMOV #0 USPACE ; RUN MACHINE-CODED BYTE MOVE FSA GET ADD FSA SWAP PUT ;FIX FILE SIZE FPA Z>S PUT MS$OUT MSCRLF #0 ;WRITE LINE, LOOP FOR MORE 15 PCHR 11 40 $CREATE $PRINT 15 PCHR ;ERASE [WORKING] PROMPT ENDIF UNTIL MS_RESTORE ENDIF ENDIF END ;--------------------- "Defining CHOP" $PRINT CRLF OCTAL DEFINE CHOP FSA FPA GET PUT END ;--------------------- "Defining DLINE" $PRINT CRLF OCTAL DEFINE DLINE ;MOD 9/6/08 FPA GET FSA GET SUB IFNZ CWA GET #1 AND IFNZ "[WORKING]" $PRINT MS_SAVE FPA GET S>Z #0 S PUT ;POP Z RESTORE FILE POINTER 15 PCHR 11 40 $CREATE $PRINT 15 PCHR ENDIF ENDIF END ;--------------------- "Defining LIST" $PRINT CRLF OCTAL DEFINE LIST CWA GET #1 AND IFNZ ;if file is open FSA GET IFNZ ;and not empty MS_SAVE ;save current MS vectors FPA GET S>Z ;save ptr on Z #0 S PUT ;restore ptr MS_RESTORE ;restore MS vectors ENDIF ENDIF END ;---------------------- "Loaded. ?EDIT for help, FORGET ?EDIT to remove." $PRINT CRLF CONSOLE ~TERMINATE~