.TITLE EDROOT .PSECT ROOT,RO ;************************************************************************** ; T E X T E D I T O R ; ROOT MODULE ; ; INPUT ; R1 = PTR TO TEXT TO EDIT IT. ; END OF TEXT - NULL AFTER "LF" AFTER THE LAST TEXT STRING. ; TEXT CONTAINS AT LEAST 2 LINES, EACH LINE ENDS "LF" CHAR. ; R0 = LINE NO. TO LOCATE THE CURSOR (1-...) ; ; OUTPUT ; R1 = SAME AS IN INPUT ; R0 = TEXT LINE NO. ON WHICH WAS CURSOR ; ; ALGORITHM: ; HANDLE A SYMBOLS: ; CURSOR LEFT, RIGHT - MOVE CURSOR LEFT, RIGHT WITHIN THE SCREEN LINE ; BC,GT - SET THE CURSOR AT THE BEGIN, END OF SCREEN LINE ; UP - MOVE CURSOR UP. IF IT WAS ON 1. SCREEN LINE, SCROLL ; THE SCREEN DOWN ; DOWN - MOVE THE CURSOR DOWN. IF IT WAS ON 23. SCREEN LINE, ; SCROLL THE SCREEN UP. ; RIGHT UP - OUTPUT THE PREV. PAGE ; RIGHT DOWN - OUTPUT THE NEXT PAGE ; LEFT UP - LOCATE THE CURSOR AT THE 1. SCREEN LINE ; LEFT DOWN - LOCATE THE CURSOR AT THE 23. SCREEN LINE ; LF - ENTER THE NEW LINE AFTER THE CURRENT ; RESET - GOLD ; OTHER SYMBOL - UPDATES THE CURRENT LINE EDROOT:: .ENABL GBL LF = 12 ;----------------------------------------------------------------------- ; ; M A C R O S ; SET THE GIVEN REGISTER TO POINT THE BEGIN OF NEXT STRING .MACRO .NEXTS REG CMPB (REG)+,#LF BNE .-4 .ENDM .PAGE ;------------------------------------------------------------------------ ; INITIALIZATION TRAP 16 ; SAVE THE REGISTERS ; DON'T CHANGE R0,R1 ! MOV #GV.LLN,R2 MOV #11,R3 ; CLEAR THE WORK AREA 10$: CLR (R2)+ SOB R3,10$ MOV R1,@#GV.TTP ; SET THE TOP OF TEXT PTR MOV SP,@#GV.STL ; SAVE THE STACK LEVEL ; SEARCH FOR END OF TEXT (NULL AFTER THE LF). DON'T CHANGE THE R0 CLR R2 ; LINES COUNTER IL1: .NEXTS R1 TSTB @R1 ; NULL AFTER THE LF - END OF TEXT BEQ IL1EX INC R2 ; INCREMENT THE LINES COUNTER BR IL1 IL1EX: INC R1 ; R1 = @ AFTER THE NULL AFTER THE LAST STR MOV R1,@#GV.BTP ; SAVE IT IN THE WORK AREA MOV R2,@#GV.LLN ; SAVE THE NUMBER OF LINES MOV #GV.WBUFF,R2 CLR (R2)+ ; 1. BUT ONE BUFFER CHAR MUST BE NONBLANK MOV R2,@#GV.BUFP ; SET THE WORK BUFFER PTR DEC R0 ; R0 = STRING NO. BEGINNING FROM ZERO CALL $LOCATE ; LOCATE THE CURSOR AT (R0) TEXT LINE .PAGE ;------------------------------------------------------------------------- ; ; M A I N L O O P MAINLOOP: MOV @#GV.LS,R0 ; R0 = LAST INPUTTED FROM KBD SYMBOL SAVED BNE ANAL ; IF IT DOESN'T EXIST THEN EMT 6 ; GET A SYMBOL FROM THE KEYBOARD ANAL: CLR @#GV.LS ; NO SYMBOL SAVED NOW EMT 26 ; R1,R2 = CURRENT CURSOR LOCATION (X,Y) JSR R3,AN ; R3 -> STACK, R3 <- @TABLE OF BRANCHES .BYTE /2,10 ; MAJOR BYTE - TESTING SYMBOL, MINOR BYTE - .BYTE /2,31 ; OFFSET IN WORDS TO SYMBOL HANDLING SUBR. .BYTE /2,23 ; .BYTE /2,24 ; .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; GOLD .BYTE 0,0 AN: TST (SP)+ ; RESTORE THE STACK LEVEL 10$: CMPB 1(R3),R0 BEQ AFND ; SEARCH FOR R0 CODE IN THE TABLE TST (R3)+ BNE 10$ ; CONTINUE FOR NEXT TABLE ENTRY IF EXISTS CALL SH.UPDT ; OTHER SYMBOL THAN THATS IN TABLE - BR MAINLOOP ; UPDATE THE CURRENT SCREEN LINE & CONTINUE AFND: MOV @R3,R4 ; SYMBOL IS FOUND - R4 - OFFSET TO HANDLER BIC #177400,R4 ASL R4 ; R4 = OFFSET IN BYTES ADD R4,R3 ; R3 = PTR TO SYMBOL HANDLER CALL @R3 ; CALL THE HANDLER BR MAINLOOP ; AND CONTINUE .END