NEW AUTO 3,1 *-------------------------------------- * EDIT ONE LINE * TEXT OF LINE ALREADY IN WBUF * (A1L,A1H) POINT AT LINE IN SOURCE AREA *-------------------------------- EDIT.ONE.LINE LDA BOTTOM.OF.SCREEN STA ED.BEGLIN JSR IO.VTAB JSR E.BEG Start edit 2 columns after line # .1 STX ED.PNTR JSR E.DISPLAY.LINE Put line on screen LDX ED.PNTR Restore PNTR in X JSR E.PROCESS.CHAR BCC .1 Not control-L, -M, or -Q JSR E.DISPLAY.LINE ...One last time JSR CRLF JMP NML Submit line and return *-------------------------------- * DISPLAY LINE FROM WBUF *-------------------------------- E.DISPLAY.LINE LDA ED.BEGLIN JSR IO.VTAB LDA #0 JSR IO.HTAB JSR SPC One space LDX #0 .1 LDA WBUF,X BEQ .4 End of line ORA #$80 CMP #$A0 Control char? BCS .2 No AND #$3F ...YES, MAKE IT INVERSE .2 PHA JSR GET.HORIZ.POSN TAY PLA INY CPY SCREEN.WIDTH BCC .3 No LDY CV Last line on screen? CPY BOTTOM.OF.SCREEN BCC .3 No DEC ED.BEGLIN Yes, it will scroll .3 JSR IO.COUT INX BNE .1 ...Always .4 JMP IO.CLREOP *-------------------------------- * PROCESS EDITING CHARACTER *-------------------------------- E.PROCESS.CHAR EPC.1 JSR E.INPUT Get char from keyboard EPC.2 CMP #$A0 Control char? BCC E.PROCESS.CNTRL *-------------------------------- * PUT CHARACTER INTO LINE *-------------------------------- E.PUT.CHARACTER LDA WBUF,X At end of line? BNE .1 No CPX #WBUF.MAX Line too long? BCS .2 Yes STA WBUF+1,X Put new .1 LDA CURRENT.CHAR STA WBUF,X INX .2 CLC RTS *-------------------------------- * PROCESS CONTROL CHAR *-------------------------------- E.PROCESS.CNTRL LDY #CHARS.FOR.EDIT JMP SEARCH.CHAR.TABLES *-------------------------------- E.ILLCHAR JSR MON.BELL LDX ED.PNTR Restore X-reg JMP EPC.1 *-------------------------------- * CONTROL-R: RESTORE ORIGINAL LINE *-------------------------------- E.RESTORE LDA A1L Set line pointer back STA SRCP LDA A1H STA SRCP+1 JSR GET.LINE.TO.WBUF *-------------------------------- * CONTROL-B: BEGINNING OF LINE *-------------------------------- FIND.START.OF.LINE.IN.WBUF E.BEG LDY #0 Find 1st column after line number .1 JSR GNC2 BCS .2 End of line JSR CHECK.DIGIT BCS .1 Yes INY .2 TYA Get column # into X TAX DEX CLC RTS *-------------------------------- * CONTROL-D: DELETE CHARACTER *-------------------------------- E.DEL LDX ED.PNTR .1 LDA WBUF,X Are we at the end? BEQ .3 Yes .2 INX ADVANCE PNTR LDA WBUF,X SLIDE REST OF LINE LEFT STA WBUF-1,X ...to delete char BNE .2 ...UNTIL END OF LINE .3 LDX ED.PNTR CLC RTS Return with Carry clear *-------------------------------- * CONTROL-N: END OF LINE *-------------------------------- E.END LDX ED.PNTR DEX .1 INX LDA WBUF,X End of buffer? BNE .1 ...KEEP LOOKING CLC RTS Carry clear *-------------------------------- * CONTROL-F: FIND NEXT OCCURRENCE *-------------------------------- E.FIND LDX ED.PNTR LDA WBUF,X End of buffer? BEQ .3 Yes JSR E.INPUT Get 1 char STX ED.FCOL Save beg col STA ED.FKEY Save key to locate .1 INX LDA WBUF,X Text buffer BEQ .2 End of buffer ORA #$80 CMP ED.FKEY No, see if key BNE .1 No, go forward STX ED.FCOL Save this col JSR E.INPUT Try another key CMP ED.FKEY Same char BEQ .1 Yes, search again STX ED.PNTR No, exit pointing here JMP EPC.2 .2 LDX ED.FCOL Restore col .3 JSR MON.BELL Beep CLC RTS *-------------------------------- * CONTROL-H: BACKSPACE *-------------------------------- E.BKSP LDX ED.PNTR TXA At beginning already? BEQ .1 Yes, stay there DEX Backup .1 CLC RTS *-------------------------------- * CONTROL-O: ALLOW INSERTION OF CONTROL CHAR *-------------------------------- E.OVR LDX ED.PNTR JSR E.INPUT Read char JMP E.INS1 Skip control check *-------------------------------- * CONTROL-I: INSERT CHARACTERS *-------------------------------- E.INS LDX ED.PNTR JSR E.INPUT Read char CMP #$A0 Control char pops user out BCS E.INS1 JMP E.PROCESS.CNTRL E.INS1 CPX #WBUF.MAX End of block BEQ .1 Yes, stay there INC ED.PNTR .1 PHA Char to insert LDA WBUF,X Save char to move TAY PLA STA WBUF,X Put over saved char INX TYA Insert saved char BNE .1 If not buffer end CPX #WBUF.MAX At end? BCC .2 Not yet LDX #WBUF.MAX Yes .2 STA WBUF,X Store end char JSR E.DISPLAY.LINE LDX ED.PNTR BNE E.INS ...Always *-------------------------------- * CONTROL-Q: QUIT, DROPPING REST OF LINE *-------------------------------- E.RETQ JSR E.ZAP Clear rest of line *-------------------------------- * CONTROL-M: QUIT, SUBMITTING WHOLE LINE *-------------------------------- E.RET SEC RTS *-------------------------------- * CONTROL-L: SUBMIT THIS LINE, EDIT NEXT LINE *-------------------------------- E.DOWN LDA ENDP See if at HI.MEM already CMP HI.MEM LDA ENDP+1 SBC HI.MEM+1 BCS .1 Yes, no need to move ENDP JSR CMP.SRCP.ENDP End of range yet? BCC .1 ...NO CLC Move ENDP one line LDY #0 LDA (SRCP),Y Line length of next line ADC ENDP STA ENDP BCC .1 INC ENDP+1 .1 SEC Signal submit line RTS *-------------------------------- * CONTROL-T: SKIP TO NEXT TAB STOP *-------------------------------- E.TAB LDX ED.PNTR .1 JSR E.CHECK.TAB BCS E.RIT1 MOVE ONE MORE COLUMN JSR E.RIT1 Move one column right BCC .1 ...ALWAYS *-------------------------------- * CONTROL-U: RIGHT ARROW *-------------------------------- E.RIT LDX ED.PNTR E.RIT1 LDA WBUF,X End of buffer? BNE .1 No CPX #WBUF.MAX BCS .2 STA WBUF+1,X LDA #$A0 Put a blank STA WBUF,X To extend line .1 INX Move ahead .2 CLC Return RTS *-------------------------------- * CONTROL-X: ABORT EDIT COMMAND *-------------------------------- E.ABORT JSR E.DISPLAY.LINE LDA #$DC Backslash JSR MY.COUT JMP GNL Get next command *-------------------------------- * CONTROL-@: CLEAR TO EOL *-------------------------------- E.ZAP LDA #0 EOL mark LDX ED.PNTR STA WBUF,X CLC RTS Carry clear *-------------------------------- * INPUT CHAR WHERE CURSOR SHOULD BE *-------------------------------- E.INPUT LDY ED.BEGLIN INX TXA DEX DEY SEC .1 INY SBC SCREEN.WIDTH BCS .1 ADC SCREEN.WIDTH JSR IO.HTAB HTAB (A) TYA JSR IO.VTAB JSR READ.KEY.WITH.CASE STA CURRENT.CHAR RTS *-------------------------------- * DETERMINE IF AT TAB STOP YET * RETURN .EQ. IF AT A TAB STOP * .CS. IF PAST LAST TAB STOP * .CC. IF BEFORE A TAB STOP *-------------------------------- E.CHECK.TAB TXA Column position CLC ADC #3 LDY #0 .1 CMP TAB.SETTINGS,Y BCC .2 BEQ .2 INY CPY #5 BCC .1 .2 RTS *-------------------------------- * CONTROL-I -- CLEAR TO TAB STOP *-------------------------------- E.TABI LDX ED.PNTR LDA #" " STA CURRENT.CHAR .1 JSR E.CHECK.TAB BCS .2 ...REACHED TAB STOP JSR E.PUT.CHARACTER BCC .1 ...ALWAYS .2 JMP E.PUT.CHARACTER One more space *-------------------------------- E.TOGGLE JSR IO.CASE.TOGGLE CLC RTS *-------------------------------------- MAN SAVE usr/src/scmasm.30/scmasm.s.elines LOAD usr/src/scmasm.30/scmasm.s ASM