.TITLE LINEED .PSECT LINED,RO ;************************************************************************** ; ; L I N E T E X T E D I T O R ; ; INPUT ; TO INPUT A NEW STRING FROM TERMINAL - ; R1 = PTR TO BUFFER ; R0 = LENGTH OF BUFFER (MAX ALLOWED LENGTH OF STRING) ; ; TO UPDATE THE EXISTING STRING ; R1 = PTR TO NULL TERMINATED STRING ; R0 = 0 - THE STRING BEGINS AT CURRENT CURSOR POSITION ; BUFFER IS OUTPUTTED ON TERMINAL AND THEN UPDATED ; R0 = SYMBOL - EDIT THE STRING WHICH IS PRESENT ON TERMINAL AND WHICH ; TEXT IS ALSO CONTAINED IN BUFFER ; STRING BEGINS AT BEGIN OF TERMINAL LINE ; CURRENT CURSOR POSITION IS A CURRENT POSITION IN STRING ; R0 HAS A SYMBOL TO UPDATE THE CURRENT STRING SYMBOL ; ; OUTPUT ; R1 = SAME AS IN INPUT ; R0 = SYMBOL-TERMINATOR - ONE OF FOLLOWS: ; "RESET", ARROW UP, DOWN, LEFT DOWN, RIGHT DOWN, LEFT UP, ; RIGHT UP, LINEFEED ; ; ALGORITHM: ; HANDLE A SYMBOLS: ; CURSOR LEFT, RIGHT - MOVE CURSOR LEFT, RIGHT WITHIN THE SCREEN ; BOUNDARIES ; BC - SET THE CURSOR AT THE BEGIN OF STRING ; GT - HORIZONTAL TABULATION (ON 8 POSITIONS) ; DEL - DELETE THE LAST STRING SYMBOL (REPLACE IT ON BLANK) ; SHIFT LEFT - COMPRESS THE STRING WITH DELETING THE CURRENT SYMBOL ; SHIFT RIGHT - STRETCH THE STRING ; CLR EOL - CLEAR TO END OF LINE ; TERMINATOR - EXIT FROM EDITOR ; OTHER CONTROL SYBOLS ARE IGNORED ; ALFANUMERIC SYMBOLS REPLACES THE CURRENT STRING SYMBOL (AT SCREEN AND ; IN BUFFER TOO) AND CURSOR IS ADVANCED (NO LONGER TO END OF STRING) ; ; REGISTERS' USAGE ; R5 = PTR TO STRING BUFFER ; R4 = PTR TO CURRENT POSITION IN BUFFER ; R0 = CURRENT SYMBOL .DSABL GBL LF = 12 BS = 10 ; BACKSPACE (CURSOR LEFT) SYMBOL DEL = 30 ; DELETE SYMBOL .PAGE ;------------------------------------------------------------------------ ; INITIALIZATION OF INPUT STRING PGM $$.LEI:: TRAP 16 ; SAVE THE REGISTERS ADD R0,R1 CLRB @R1 ; FORMAT THE BUFFER BY BLANKS, APPEND THE 10$: MOVB #' ,-(R1) ; NULL BYTE SOB R0,10$ CLR R0 ; WORK AS $$.ELU WITH R0=0 BR INBEG ;------------------------------------------------------------------------ ; INITIALIZATION OF UPDATE STRING PGM $$.LEU:: TRAP 16 ; SAVE THE REGISTERS INBEG: MOV R1,R4 ; CURRENT BUFFER POS (=INITIAL BUFFER POS) MOV R1,R5 ; INITIAL BUFFER POS EMT 26 ; R1,R2 = CURSOR COORDINATES TSTB R0 ; IF R0=0 THEN OUTPUT THE STRING TO BEQ INOUT ; SCREEN BEFORE UPDATING ADD R1,R4 ; ELSE SET THE CURRENT BUFFER POS BR MLANAL ; AND HANDLE THE SYMBOL IN R0 INOUT: MOV R1,R3 ; OUTPUT THE STRING TO BE UPDATED MOV R5,R1 TRAP 4 MOV R3,R1 EMT 24 ; RESTORE THE OLD CURSOR POSITION .PAGE ;========================================================================== ; ; M A I N L O O P MAINLOOP: EMT 6 ; GET A SYMBOL FROM THE KEYBOARD MLANAL: JSR R3,MLAN ; R3 -> STACK, R3 <- @TABLE OF BRANCHES .BYTE /2,BS ; MAJOR BYTE - TESTING SYMBOL, MINOR BYTE - .BYTE /2,31 ; OFFSET IN WORDS TO SYMBOL HANDLING SUBR. .BYTE /2,23 ; BC .BYTE /2,24 ; GT .BYTE /2,DEL; .BYTE /2,26 ; SHIFT LEFT .BYTE /2,27 ; SHIFT RIGHT .BYTE /2,231; CLEAR TO END OF LINE .BYTE /2,32 ; CURSOR UP .BYTE /2,33 ; CURSOR DOWN .BYTE /2,34 ; CURSOR LEFT UP .BYTE /2,35 ; CURSOR RIGHT UP .BYTE /2,36 ; CURSOR RIGHT DOWN .BYTE /2,37 ; CURSOR LEFT DOWN .BYTE /2,12 ; LINE FEED .BYTE /2,14 ; RESET .BYTE 0,0 MLAN: TST (SP)+ ; RESTORE THE STACK LEVEL 10$: CMPB 1(R3),R0 BEQ MLFND ; SEARCH FOR R0 CODE IN THE TABLE TST (R3)+ ; CONTINUE FOR NEXT TABLE ENTRY IF EXISTS BEQ SH.TEST ; OTHER SYMBOL THAN THATS IN TABLE - TEST IT BR 10$ MLFND: MOV @R3,R2 ; SYMBOL IS FOUND - R2 - OFFSET TO HANDLER BIC #177400,R2 ASL R2 ; R2 = OFFSET IN BYTES ADD R2,R3 ; R3 = PTR TO SYMBOL HANDLER JMP @R3 ; GO TO THE HANDLER .PAGE ;============================================================================== ; SYMBOL HANDLING ROUTINES ; ; INPUT ; R0 = SYMBOL TO BE HANDLED ;------------------------------------------------------------------------------ ; CHECK THE SYMBOL IF IT IS AN ALFANUMERIC SYMBOL SH.TEST: CMPB R0,#' BLO MAINLOOP ; IGNORE THE OTHER CONTROL SYMBOL CMPB R0,#200 BLO 10$ ; PERMIT THE LATEIN AND NUMERIC SYMBOLS CMPB R0,#240 BLO MAINLOOP ; IGNORE THE CONTROL SYMBOLS IN RANGE 200-237 10$: MOVB R0,@R4 ; UPDATE THE CURRENT SYMBOL IN BUFFER ;------------------------------------------------------------------------------ ; CURSOR RIGHT SYMBOL SH.CR: EMT 16 ; OUTPUT THE SYMBOL ONTO SCREEN INC R4 ; ADVANCE THE CURSOR TSTB @R4 BNE MAINLOOP ; CONTINUE IF WE STAYS WITHIN THE BUFFER MOV #BS,R0 ; ELSE RETURN THE CURSOR ;------------------------------------------------------------------------------ ; CURSOR LEFT AND DELETE SYMBOLS SH.CL: SH.DEL: CMP R4,R5 BLOS MAINLOOP ; WE STAYS AT BEGIN OF STRING EMT 16 ; OUTPUT THE SYMBOL DEC R4 ; DECREMENT THE CURSOR POS CMPB R0,#DEL BNE MAINLOOP MOVB #' ,1(R4) ; DELETE (CHANGE TO BLANK) CURRENT SYMBOL BR MAINLOOP .PAGE ;------------------------------------------------------------------------------ ; RETURN TO BEGIN OF STRING SH.CBE: EMT 26 ; R1,R2 = CURRENT CURSOR LOCATION ADD R5,R1 ; SUBSTRACT THE CURRENT SYMBOL OFFSET SUB R4,R1 ; RELATIVE THE BEGIN OF BUFFER EMT 24 ; SET THE NEW CURSOR POSITION MOV R5,R4 ; AND CURRENT SYMBOL PTR BR MAINLOOP ;------------------------------------------------------------------------------ ; HORIZONTAL TABULATION SH.HT: MOV R4,R3 10$: TSTB (R3)+ BNE 10$ DEC R3 DEC R3 ; R3=PTR TO END OF STRING EMT 26 ; R1,R2 = CURRENT CURSOR LOCATION MOV R1,R0 ADD #8.,R1 ; ADVANCE THE CURSOR TO TAB MARK BIC #3,R1 ; CLEAR TWO LOWER BITS SUB R0,R1 ; R1 = EFFECTIVE CURSOR DISPLACING ADD R4,R1 CMP R1,R3 ; TEST IF STRING ISN'T ENDED BLO 20$ ; THEN FIXED CURSOR AT ITS END MOV R3,R1 20$: SUB R4,R1 ; R1 = ACTUAL CURSOR DISPLACING ADD R1,R4 ; SET THE NEW BUFFER POS ADD R0,R1 ; SET THE NEW CURSOR COORDINATES EMT 24 .PAGE ;------------------------------------------------------------------------------ ; CLEAR TO END OF LINE SH.CEL: EMT 26 ; R1,R2 = CURSOR COORDINATES MOV R4,R3 10$: MOVB #' ,(R3)+ ; CLEAR TO END OF BUFFER TSTB @R3 BNE 10$ BR SH.OUT ; OUTPUT THE UPDATED BUFFER ;------------------------------------------------------------------------------ ; SHIFT LEFT SH.SHL: EMT 26 ; R1,R2 = CURSOR COORDINATES MOV R4,R3 10$: MOVB 1(R3),@R3 BEQ 20$ ; COMPRESS THE STRING INC R3 BR 10$ 20$: MOVB #' ,@R3 ; THE LAST STRING SYMBOL WILL BE BLANK BR SH.OUT ; OUTPUT THE UPDATED BUFFER ;------------------------------------------------------------------------------ ; SHIFT RIGHT SH.SHR: EMT 26 ; R1,R2 = CURSOR COORDINATES MOV R4,R3 10$: TSTB (R3)+ BNE 10$ DEC R3 DEC R3 ; R3 = PTR TO LAST STRING SYMBOL 20$: CMP R3,R4 BLOS 30$ DEC R3 MOVB @R3,1(R3) ; STRETCH THE LINE BR 20$ 30$: MOVB #' ,@R4 ; THE CURR STRING SYMBOL WILL BE BLANK ;------------------------------------------------------------------------------ ; OUTPUT THE UPDATED BUFFER AND RESTORE CURSOR SH.OUT: MOV R1,R3 MOV R4,R1 TRAP 4 ; OUTPUT THE BUFFER MOV R3,R1 EMT 24 ; RESTORE THE CURSOR POSITION BR MAINLOOP .PAGE ;============================================================================== ; END OF JOB, TERMINATOR KEY HAS BEEN PRESSED EOJ: MOV R0,12(SP) ; IN ORDER TO RESTORE IT IN R0 TRAP 17 ; RESTORE THE REGISTERS AND RETURN .END