mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-28 10:52:33 +00:00
292 lines
7.8 KiB
Plaintext
292 lines
7.8 KiB
Plaintext
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
|