NEW AUTO 3,1 *-------------------------------------- * SEARCH TEXT BUFFER FOR LINE * * LINE NUMBER TO BE FOUND IS AT 0,X AND 1,X * * IF FOUND, RETURN CARRY SET * (LINE.START) = ADDRESS OF LINE * (LINE.END ) = ADDRESS OF NEXT LINE * * IF NOT FOUND, RETURN CARRY CLEAR * (LINE.START) = ADDRESS OF NEXT LINE * (LINE.END ) = ADDRESS OF NEXT LINE * *-------------------------------- SERTXT LDA PP START AT BEGINNING OF TEXT BUFFER STA LINE.END LDA PP+1 STA LINE.END+1 SERNXT LDA LINE.END+1 CONTINUE SEARCH WITH NEXT LINE STA LINE.START+1 LDA LINE.END STA LINE.START CMP HI.MEM LDA LINE.START+1 SEE IF AT END YET SBC HI.MEM+1 BCS .3 YES, DID NOT FIND LDY #0 POINT AT LINE LENGTH LDA (LINE.START),Y GET LINE LENGTH ADC LINE.END POINT TO NEXT LINE STA LINE.END BCC .1 INC LINE.END+1 .1 INY POINT AT LINE NUMBER LDA (LINE.START),Y COMPARE TO DESRIRED LINE NUMBER CMP 0,X INY LDA (LINE.START),Y SBC 1,X BCC SERNXT NOT THERE YET BNE .2 PASSED IT UP DEY CHECK LOW BYTE AGAIN LDA (LINE.START),Y CMP 0,X BEQ .4 FOUND IT! .2 LDA LINE.START PASSED IT UP STA LINE.END MAKE BOTH POINT AT SAME LINE LDA LINE.START+1 STA LINE.END+1 .3 CLC RETURN CARRY CLEAR .4 RTS *-------------------------------- * DELETE LINES *-------------------------------- DELETE JSR GNNB GET NEXT NON-BLANK CHAR CMP #'/' BEQ .1 ...PATHNAME JSR CHECK.LETTER BCC .2 ...NOT LETTER, PROBABLY LINES .1 JMP PASS.CMD.TO.PRODOS .2 JSR BACKUP.CHAR.PNTR JSR PARSE.LINE.RANGE BCS SYNX.3 ...NO NUMBERS, SYNTAX ERROR DELETE.LINES LDX #-1 SEC .2 LDA SRCP+1,X SEE IF RANGE EMPTY OR CROSSED STA LINE.START+1,X LDA ENDP+1,X STA A4L+1,X SBC LINE.START+1,X STA MOVE.DISTANCE+1,X INX BEQ .2 TAX TEST HI-BYTE OF MOVE.DISTANCE BPL MOVE.TEXT.UP ...POSITIVE, RANGE GOOD SYNX.3 JMP SYNX *-------------------------------- * MOVE TEXT FROM THRU * UP BYTES TO *-------------------------------- MOVE.TEXT.UP JSR COMPUTE.BLOCK.SIZE CLC LDA PP ADC MOVE.DISTANCE STA PP LDA PP+1 ADC MOVE.DISTANCE+1 STA PP+1 LDY #0 BEQ .3 ...ALWAYS *---MOVE A WHOLE BLOCK----------- .1 LDA (LINE.START),Y MOVE BYTES 255 THRU 1 IN BLOCK STA (A4L),Y .2 DEY BNE .1 LDA (LINE.START),Y MOVE LOWEST BYTE IN BLOCK STA (A4L),Y .3 DEC LINE.START+1 PRIOR BLOCK DEC A4H DEX ANY MORE BLOCKS? BNE .2 YES *---MOVE SHORT BLOCK IF ANY------ LDX BLKSIZ PARTIAL BLOCK SIZE BEQ .5 NONE LEFT .4 DEY LDA (LINE.START),Y STA (A4L),Y DEX BNE .4 .5 RTS *-------------------------------- * COPY L1,L2,L3 * L1 = FIRST LINE OF RANGE TO COPY * L2 = LAST LINE OF RANGE TO COPY * L3 = LINE NUMBER BEFORE WHICH TO INSERT * THE COPIED LINES *-------------------------------- ERR1 JMP SYNX ERR2 .EQ ERR1 ERR3 JMP MFER ERR4 .EQ ERR1 *-------------------------------- COPY JSR PARSE.LINE.RANGE JSR GNNB look for a comma CMP #',' BNE ERR1 ...no comma SEC SAVE POINTER AND COMPUTE LENGTH LDA SRCP REALLY -(LENGTH) SBC ENDP STA MOVE.DISTANCE LDA SRCP+1 SBC ENDP+1 STA MOVE.DISTANCE+1 BPL ERR2 RANGE BACKWARD OR EMPTY *-------------------------------- CLC LDA PP COMPUTE NEW PP POINTER ADC MOVE.DISTANCE STA A4L LDA PP+1 ADC MOVE.DISTANCE+1 STA A4H *-------------------------------- LDA A4L SEE IF ROOM FOR THIS CMP LO.MEM LDA A4L+1 SBC LO.MEM+1 BCC ERR3 MEM FULL ERR *---Get Target Line Number------- JSR GNNB pick up first digit of target line number JSR SCAN.LINE.NUMBER (or it might be ".") BCS ERR1 ...not a line number of "." LDA 0,X copy line number to A0L,H STA A0L LDA 1,X STA A0H *---Verify valid target line----- LDA SRCP BE SURE NOT INSIDE SOURCE BLOCK CMP LINE.START LDA SRCP+1 SBC LINE.START+1 BCS .1 BELOW SOURCE BLOCK LDA LINE.START CMP ENDP LDA LINE.START+1 SBC ENDP+1 BCC ERR4 INSIDE SOURCE BLOCK *-------------------------------- * TARGET IS ABOVE SOURCE BLOCK, SO WE HAVE TO * ADJUST SOURCE BLOCK POINTERS. *-------------------------------- CLC LDA SRCP ADC MOVE.DISTANCE STA SRCP LDA SRCP+1 ADC MOVE.DISTANCE+1 STA SRCP+1 CLC LDA ENDP ADC MOVE.DISTANCE STA ENDP LDA ENDP+1 ADC MOVE.DISTANCE+1 STA ENDP+1 *-------------------------------- .1 JSR MOVE.TEXT.DOWN MAKE THE HOLE *-------------------------------- LDA SRCP SAVE SRCP AT A1 STA A1L (POINTS TO BLOCK TO BE COPIED) LDA SRCP+1 STA A1H .2 CLC ADD (Y) TO A4 TYA ADC A4L POINTS TO BEGINNING OF NEXT STA A4L LINE IN HOLE BCC .3 INC A4H .3 LDY #0 LDA (A1L),Y COPY LINE LENGTH STA (A4L),Y INY INSERT LINE # LDA A0L OF TARGET LINE STA (A4L),Y INY INSERT LINE # LDA A0H OF TARGET LINE STA (A4L),Y .4 INY COPY REST OF LINE LDA (A1L),Y STA (A4L),Y BNE .4 UNTIL TOKEN INY CLC TYA ADC A1L POINT TO NEXT SOURCE LINE STA A1L BCC .5 INC A1H .5 CMP ENDP LDA A1H SBC ENDP+1 BCC .2 LDY #QDELOR JSR YES.OR.NO BNE .6 JSR DELETE.LINES .6 RTS *-------------------------------- * MOVE TEXT FROM THRU * DOWN - BYTES TO *-------------------------------- MOVE.TEXT.DOWN JSR COMPUTE.BLOCK.SIZE LDA PP STA A2L LDA PP+1 STA A2H LDA A4L STA PP LDA A4H STA PP+1 LDY #0 BEQ .2 ...ALWAYS .1 LDA (A2L),Y YES, MOVE 256 BYTES STA (A4L),Y INY BNE .1 INC A2H POINT AT NEXT BLOCK INC A4H .2 DEX ANY WHOLE BLOCKS LEFT? BNE .1 YES *---MOVE PARTIAL BLOCK----------- LDX BLKSIZ SIZE OF PARTIAL BLOCK BEQ .4 EMPTY .3 LDA (A2L),Y STA (A4L),Y INY DEX BNE .3 .4 RTS *-------------------------------- * COMPUTE SIZE OF TEXT BLOCK * FROM TO * * RETURN # WHOLE BLOCKS OF 256 BYTES +1 IN X * RETURN # BYTES IN PARTIAL BLOCK IN *-------------------------------- COMPUTE.BLOCK.SIZE SEC COMPUTE # OF BYTES TO BE MOVED LDA LINE.START CURRENT TOP POINTER SBC PP CURRENT BOTTOM POINTER STA BLKSIZ SAVE PARTIAL PAGE AMOUNT LDA LINE.START+1 SBC PP+1 TAX # OF WHOLE PAGES IN X INX RTS *-------------------------------------- MAN SAVE usr/src/scmasm.31/scmasm.s.tsrch LOAD usr/src/scmasm.31/scmasm.s ASM