.TITLE EDI00 .IDENT /X01/ ;**-1 .NLIST BEX .ENABL LC ; ; EDITOR (TEMP FILE VERSION) ; ; VERSION X01 ; ; DAVID G. CONROY 16-DEC-77 ; ; ; as modified by Eric Levy ; .GLOBL ERROR .GLOBL WDONE .GLOBL COMMND .GLOBL ADR1 .GLOBL ADR2 .GLOBL ZERO .GLOBL DOT .GLOBL DOL .GLOBL TOP .GLOBL SPS .GLOBL EXECM .GLOBL LBUF1 .GLOBL LBUF2 .GLOBL LBUF3 .GLOBL GUBUF .GLOBL FN .GLOBL OV .GLOBL OS .GLOBL OE .GLOBL ONUM ;JUL06EL .GLOBL SAVEQ ;JUL06EL .GLOBL OLDCMD .GLOBL SFN .GLOBL GUPTR .GLOBL PEEK .MCALL CALL .MCALL CALLR .MCALL RETURN .MCALL dir$ ; ; GLOBAL EQUIVALENCES ; EOF == 0 ;TEXT END OF FILE NL == 12 ;ASCII NEWLINE CR == 15 ;ASCII CARRIAGE RETURN ESC == 33 ;ASCII ESCAPE FF == 14 ;ASCII FORMFEED PSIZE == 20. ;PAGE SIZE (IN LINES) LBS == 140. ;LINE BUFFER SIZE GUBS == 140. ;GLOBAL/UNTIL BUFFER SIZE FNS == 40. ;FILE NAME SIZE ; ; GLOBAL DATA ; WDONE: .WORD 0 ;FOR THOSE WHO FORGET TO "W". OV: .WORD 1 ;OPTION VERBOSE FLAG OS: .WORD 0 ;OPTION SENSITIVE FLAG OE: .WORD 0 ;OPTION USE EDI-LIKE SYNTAX 0=NO, -1=YES ONUM: .WORD 0 ;OPTION FOR LIST WITH LINE NUMBERS ;JUL06EL GUPTR: .WORD 0 ;GLOBAL/UNTIL POINTER PEEK: .WORD -1 ;PEEK CHARACTER OLDCMD: .BLKW 1 ;COMMAND ON THE LINE FLAG pADR1: .word 0 ;ADDRESS 1 previous pADR2: .word 0 ;ADDRESS 2 previous ADR1: .BLKW 1 ;ADDRESS 1 ADR2: .BLKW 1 ;ADDRESS 2 ZERO: .BLKW 1 ;ADDRESS OF LINE 0 DOT: .BLKW 1 ;ADDRESS OF CURRENT LINE DOL: .BLKW 1 ;ADDRESS OF LAST LINE TOP: .BLKW 1 ;POINTER TO TOP OF MEMORY SPS: .BLKW 1 ;SAVE FOR SP EXECM: .BLKW 1 ;NON ZERO DURING COMMAND EXECUTION SAVEQ: .BLKW 1 ;SAVE LAST = LINE NUMBER ;JUL06EL LBUF1: .BLKB LBS ;LINE BUFFER 1 LBUF2: .BLKB LBS ;LINE BUFFER 2 LBUF3: .BLKB LBS ;LINE BUFFER 3 GUBUF: .BLKB GUBS ;GLOBAL/UNTIL BUFFER FN: .BLKB FNS ;FILE NAME SFN: .BYTE 0 ;SAVED FILE NAME .BLKB FNS-1 ; .EVEN plist: .word 1 .word gubuf ;ihang fort call list ; ; ERROR MESSAGES USED IN "VERBOSE" MODE. ; .MACRO MSG TEXT,?LAB .IF NDF,...MSG ...MSG: .BLKW 0 .ENDC LAB: .BLKW 0 MSG1 ,\ .ENDM .MACRO MSG1 TEXT,LAB .WORD .ML'LAB .PSECT .TEXT. .ML'LAB:.ASCIZ "TEXT" .PSECT .ENDM VETAB: MSG MSG MSG MSG MSG MSG
MSG
MSG <**GOK**> MSG MSG MSG MSG MSG MSG MSG ;JUL08EL MSG ;+ ; ** ERROR - ERROR PROCESSOR ; ; ALL ERRORS ARE FUNNELLED THROUGH THIS ROUTINE. TWO TYPES OF ERROR ; MESSAGES ARE GENERATED: TERSE MESSAGES (?N, WHERE N IS THE ERROR ; CODE) AND VERBOSE MESSAGES (AN EPISTLE IN TASTEFUL DUAL CASE). ; ; THE N IN THE ?N MESSAGE IS OF HISTORICAL INTEREST ONLY. ; ; INPUTS: ; R1=ERROR CODE ;- .PSECT EDI00 ;JUL08EL ERROR: TST OV ;IN VERBOSE MODE BNE 10$ ;YES MOV #'?,R0 ;NO, OUTPUT '?' CALL TTYC ; CALL TTYNUM ;THE ERROR CODE BR 20$ ; 10$: ASL R1 ;ERROR CODE TO WORD INDEX MOV VETAB(R1),R0 ;GET MESSAGE CALL TTYSTR ;PUT IT OUT 20$: CALL TTYNL ;NEWLINE AFTER MESSAGE CALL TTYSKP ;SKIP TO NEWLINE ON TTY CLR GUPTR ;GET OUT OF GLOBALS CLR OLDCMD ;RESET OLD COMMAND FLAG MOV SPS,SP ;FIX SP ;+ ; ** COMMND - COMMAND PROCESSOR ; ; USES: ; ALL ;- ;;;COMMND: ;;; clr execm ;;; call getc ;;; cmp r0,#'! ;;; bne 8$ ;not an mcr command ;;; mov #gubuf,r1 ;use for temp buffer ;;; mov #gubs-2,r2 ;max len ;;;6$: call getc ;;; cmp r0,#nl ;end of line ;;; beq 7$ ;yes ;;; movb r0,(r1)+ ;transfer line ;;; sob r2,6$ ;don't clobber anything if line 2 long ;;; clr r1 ;or else this error ;;; jmp error ;;;7$: clrb (r1) ;asciz it ;;; mov r5,-(sp) ;save ;;; mov #plist,r5 ;fort call ;;; dir$ #dtty ;detach terminal ;;; call ihang ;do it ;;; dir$ #atty ;re-attach terminal ;;; mov (sp)+,r5 ;;; jmp commnd ;;;8$: mov r0,peek ;put back the char COMMND: clr execm call getc cmp r0,#'! bne 8$ ;not an mcr command clr r4 ;use as flag mov #3,r3 ;# of bytes to sub off addr for $'s mov #"$$,gubuf ;precede with 0,1, or 2 $'s mov #gubuf+2,r1 ;use for temp buffer mov #gubs-4,r2 ;max len 6$: call getc cmp r0,#nl ;end of line beq 7$ ;yes tst r4 ;still counting (# of chars till space or end) bne 65$ ;no cmp r0,#40 ;space? bne 62$ ;nope inc r4 ;set flag to stop counting br 65$ 62$: dec r3 ;one less $ to insert bge 65$ ;min of zero for r3 clr r3 65$: movb r0,(r1)+ ;transfer line sob r2,6$ ;don't clobber anything if line 2 long clr r1 ;or else this error jmp error 7$: clrb (r1) ;asciz it mov r5,-(sp) ;save mov #gubuf+2,plist+2 ;set addr to user line sub r3,plist+2 ;insert $,s if necessary mov #plist,r5 ;fort call dir$ #dtty ;detach terminal call ihang ;do it dir$ #atty ;re-attach terminal mov (sp)+,r5 jmp commnd 8$: mov r0,peek ;put back the char cmd2: clr execm ;into cmd mode call getc ;get next char and check if nl cmp r0,#nl ;cause if it is, might be from last cmd beq 5$ ;its a nl cmp r0,#40 ;else check for space bar (=use last range) beq 7$ ;its a space mov r0,peek ;nope, putback 1 char, process as usual br 9$ 5$: tst oldcmd ;is the nl remainder of prev cmd? bne 6$ ;yes mov r0,peek ;nope, putback 1 char, process as usual br 9$ ;no, must be cmd (.+1p) 6$: clr oldcmd ;nl + oldcmd=just throw away cr br commnd 7$: call chkadr ;check adr1 and adr2 call getc ;prime it br 40$ ;go reuse adr1+2 9$: CLR ADR1 ;CLEAR OLD CLR ADR2 ;LINE ADDRESSES CLR EXECM ;GET INTO COMMAND MODE 10$: MOV ADR2,ADR1 ;GET AN CALL ADDRES ;ADDRESS TST R2 ;DID I GET ONE BEQ 30$ ;NO MOV R2,ADR2 ;USE IT CMP R0,#'; ;DELIMITER A ';' BNE 20$ ;NO MOV R2,DOT ;YES, RESET '.' BR 10$ ; 20$: CMP R0,#', ;DELIMITER A ',' BEQ 10$ ;YES, GO GET ANOTHER ADDRESS 30$: TST ADR1 ;IF ONLY 1 ADDRESS BNE 40$ ;THEN MOV ADR2,ADR1 ;SET THEM EQUAL 40$: CMP R0,#NL ;NEWLINE COMMAND BNE 50$ ;NO TST ADR2 ;PRINT IF WE HAVE AN ADDRESS BNE 44$ ;OR TST OLDCMD ;IF THERE IS NOTHING ELSE BEQ 42$ ;ON THE LINE CLR OLDCMD ;OTHERWISE CLEAR FLAG JMP COMMND ;AND GO FOR MORE 42$: MOV DOT,R0 ;START AT DOT ADD #2,R0 ;MOVE AHEAD 1 LINE CMP R0,DOL ;BUT DON'T GO PAST THE END BLOS 43$ ; MOV #6,R1 ;OR ?6 JMP ERROR ; 43$: MOV R0,ADR1 ;SET ADDRESSES FOR MOV R0,ADR2 ;PRINT COMMAND 44$: CLR OLDCMD ;CLEAR FLAG call svadrs ;save address range mov #'p,r0 br 80$ ;fake a p command 50$: CMP R0,#EOF ;GLOBAL EOF BNE 60$ ;NO MOV ZERO,R0 ;LOOK FOR NEXT GLOBAL LINE 52$: TST (R0)+ ; CMP R0,DOL ;AT THE END BHI 54$ ;YES, NO MORE LINES BIT #1,(R0) ;MARKED BEQ 52$ ;NO DEC (R0) ;REMOVE THE MARK MOV R0,DOT ;SET DOT MOV #GUBUF,GUPTR ;BACKUP GLOBAL POINTERS JMP COMMND ;GO GET COMMAND 54$: CLR GUPTR ;GET OUT OF GLOBAL JMP COMMND ;GO GET COMMAND 60$: INC OLDCMD ;SET COMMAND ON THE LINE FLAG INC EXECM ;SET COMMAND IN EXECUTION CMP R0,#'= ;EQUAL COMMAND BNE 70$ ;NO CALL DEFDOT ;DEFAULT TO .= MOV ADR2,R1 ;GET ADDRESS MOV R1,SAVEQ ;SAVE THIS (EVENTUALLY MAY BE USED) ;JUL06EL SUB ZERO,R1 ; ASR R1 ;CONVERT TO LINES CALL TTYNUM ;DISPLAY IT CALL TTYNL ; JMP COMMND ; 70$: CMP R0,#'& ;PRINT A PAGE BNE 80$ ;NO CALL DEFDOT ;DEFAULT TO CURRENT LINE MOV ADR2,R0 ;GET WHERE TO START MOV R0,ADR1 ;MAKE A P COMMAND UP ADD #2*PSIZE,R0 ; CMP R0,DOL ;BUT DON'T GO PAST THE END BLOS 72$ ; MOV DOL,R0 ; 72$: MOV R0,ADR2 ; call svadrs ;save adr1+2 CALL PCOM1 ;PRINT THE PAGE JMP COMMND ; 80$: BIC #' ,R0 ;MUST BE ALPHABETIC COMMAND SUB #'A,R0 ; CMP R0,#'Z-'A ;LEGAL BHI ERR2 ;NO call svadrs ;save adr1+2 ASL R0 ;CALL ROUTINE CALL @CMDTAB(R0) ; JMP COMMND ;GO BACK TO COMMAND LOOP ERR2: MOV #2,R1 ;ILLEGAL COMMAND JMP ERROR ; svadrs: cmp adr1,adr2 beq 5$ ;don't save unless its a range mov adr1,padr1 ;save adr1 mov adr2,padr2 ;save adr2 5$: rts pc chkadr: mov padr1,adr1 ;use previous if not mov padr2,adr2 ;" " tst adr1 ;zero beq 10$ ;yep tst adr2 ;test this too beq 10$ ;same place if zero cmp adr1,adr2 ; bhi 10$ ;but something is wrong if hi cmp adr2,dol ;out of range bhi 10$ ;yep 5$: rts pc 10$: mov #15.,r1 ;no prev=error 15 jmp error ; ; COMMAND JUMP TABLE ; INDEXED BY ASCII CHARACTERS IN THE RANGE A-Z ; CMDTAB: .WORD ACOM ;APPEND .WORD ERR2 ;B C100:: .WORD CCOM ;CHANGE .WORD DCOM ;DELETE .WORD ECOM ;EDIT .WORD FCOM ;FACTS .WORD GCOM ;GLOBAL .WORD ERR2 ;H .WORD ICOM ;INSERT .WORD JCOM ;JOIN .WORD KCOM ;KOPY .WORD ERR2 ;L .WORD MCOM ;MOVE .WORD ERR2 ;N .WORD OCOM ;OPTIONS .WORD PCOM ;PRINT .WORD QCOM ;QUIT .WORD RCOM ;READ S100:: .WORD SCOM ;SUBSTITUTE .WORD ERR2 ;T .WORD ucom ;U .WORD VCOM ;EXCLUDE .WORD WCOM ;WRITE .WORD XCOM ;WRITE WITH NEW VERSION .WORD ERR2 ;Y .WORD ZCOM ;Z COMMAND ;JUL08EL .END