A2osX/SCMASM.31/SCMASM.S.TSRCH.txt

292 lines
7.8 KiB
Plaintext
Raw Normal View History

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 <PP> THRU <LINE.START>
* UP <MOVE.DISTANCE> BYTES TO <A4L,A4H>
*--------------------------------
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 <EOL> 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 <PP> THRU <LINE.START>
* DOWN -<MOVE.DISTANCE> BYTES TO <A4L,A4H>
*--------------------------------
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 <PP> TO <LINE.START>
*
* RETURN # WHOLE BLOCKS OF 256 BYTES +1 IN X
* RETURN # BYTES IN PARTIAL BLOCK IN <BLKSIZ>
*--------------------------------
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