home *** CD-ROM | disk | FTP | other *** search
- ;change.asm
- ;----------------------------------
- ; Command: change/from/to/,range
- ;----------------------------------
-
- poker = $0016
- index1 = $0024
- index2 = $0026
- z61 = $0061
- runmod = $007f
- scroll = $00f8
- txtptr = $003d
- ierror = $0300
- chrget = $0380
- chrgot = $0386
- txttop = $1210
- linget = $50a0
- linprt = $8e32
- lnkprg = $4f4f
- fndlin = $5064
- chrout = $ffd2
- stop = $ffe1
-
- int04 = $1704
- int05 = $1705
- int0e = $170e
- stk0 = $1be7
- tx = $1bfe
-
- star = $0b00
- .wor star
- * = star
-
- jmp change
- dw Date
-
- change lda ierror ;save ierror vector
- sta svie
- lda ierror+1
- sta svie+1
- lda #<chng ;and make a new one for now
- sta ierror
- lda #>chng
- sta ierror+1
- ldx stk0 ;recall stack at "lookup"
- txs
- lda #$40
- sta $ff00
- rts ;and return to main
-
- svie .wor 0
-
- ;-------------------------------
- ; adjust for text or basic mode
- ;-------------------------------
-
- adj bit tx ;basic mode?
- bmi adj0 ;no text. un-crunch the line
- rts
-
- adj0 ldx #0 ;copy command line back to input buffer
- jsr int04
- adj1 sta $0200,x
- inx
- jsr int05
- cmp #0
- bne adj1
- sta $0200,x
- rts
-
- ;-------------------
- ; ierror jumps here
- ;-------------------
-
- chng lda #0 ;bank 15
- sta $ff00
- sta runmod
- lda svie ;restore old error vector
- sta ierror
- lda svie+1
- sta ierror+1
- jsr adj ;adjust buf if text mode
- lda #<$01ff ;setup chrget
- sta txtptr
- lda #>$01ff
- sta txtptr+1
- fc jsr chrget ;1st non-alpha char is the delimiter
- cmp #"a"
- bcc gotdel ;got it
- cmp #$5b ;"z"+1
- bcc fc
- gotdel sta delim ;save it
- ldx #0
- stx strend+2
- jsr gettxt ;get search text
- ldx #2 ;flag "change"
- stx flag
- bne ch0
- find sta delim
- ldx #0 ;flag "find"
- stx flag
- ch0 jsr gettxt ;get replace text
- jsr chrget ;move past closing delimiter
- beq ch1 ;no range (colon or zero)
- cmp #","
- beq ch11
- jmp snerr
-
- ch11 jsr chrget
- ch1 jsr range ;get range
- jsr b15
- lda #13
- jsr chrout
- jmp za32a
-
- za31f iny ;bump past eol marker (0)
- tya
- clc
- adc z61
- sta z61
- bcc za32a
- inc z61+1
- za32a jsr peek ;get link high
- beq fini ;end of text...quit
- jsr stop ;stop key?
- beq fini ;yep
- jsr za431 ;test if line lower than max
- bcs za337 ;it is. test it
- fini jsr lnkprg ;otherwise all done
- jmp int0e
-
- za337 sty offset ;.y=0 (offset into text portion of line)
- za339 inc offset
- ldy offset ;offset into current line being tested
- ldx strend ;offset into buf for search string
- lda strend+1 ;length of search string
- sta sofs
- za343 jsr pk ;get from line
- beq za31f ;end of line. text not found
- cmp $0200,x ;same as search string?
- bne za339 ;no. move up through source line
- inx
- iny
- dec sofs
- bne za343 ;still more chars to check
- dey ;found text. save offset to end+1
- sty delim
- sty zb5
- lda flag ;find?
- beq za3bf ;yes. just list it
- jsr za445 ;set source=(z61) and dest=(end of text) for move
- lda strend+3 ;calculate length difference for change
- sec
- sbc strend+1
- sta diff
- beq za398 ;no difference. change it directly
- za370 iny
- beq fini ;line too long..abort
- jsr pk
- bne za370
- clc
- tya
- adc diff
- cmp #2
- bcc za3bf
- cmp #$9b
- bcs za3bf
- lda diff
- bpl za389
- dec sofs
- za389 clc
- adc delim
- sta zb5
- bcs za395
- jsr za479
- beq za398
- za395 jsr za461
- za398 lda zb5
- sec
- sbc strend+3
- tay
- iny
- lda strend+3
- beq za3b2
- sta zb5+1
- ldx strend+2
- za3a7 lda $0200,x
- sta $ff01
- sta (z61),y
- jsr b15
- inx
- iny
- dec zb5+1
- bne za3a7
- za3b2 clc
- lda txttop
- adc diff
- sta txttop
- lda txttop+1
- adc sofs
- sta txttop+1
- za3bf ldx thslin
- lda thslin+1
- ldy #0
- jsr $5125
- jsr b15
- lda #13
- jsr chrout
- ldy zb5
- jmp za337
-
- ;-------------------------------------
- ; get search or replace text from buf
- ;-------------------------------------
-
- gettxt ldy txtptr
- iny
- tya
- sta strend,x ;offset to start of text
- lda #0
- sta strend+1,x ;initialize length to zero
- gt0 lda $0200,y
- beq mbs ;end of line. maybe a syntax error
- cmp delim
- beq gtx
- inc strend+1,x ;bump length
- iny
- bne gt0
- gtx sty txtptr ;done
- cmp #34 ;is the delimiter a quote?
- bne gtxx ;no then /this/that/
- txa
- bne gtxx
- jsr chrget ;otherwise "this" "that"
- cmp #34
- beq gtxx
- jmp snerr
- gtxx rts
-
- mbs cpx #2 ;error if eol during 1st string
- bne snerr
- dey
- jmp gtx
-
- ;----------------
- ; get line range
- ;----------------
-
- range bcc r0 ;chrget got a number
- beq r0
- cmp #"-"
- beq r0
- snerr ldx #11
- jmp (ierror)
-
- r0 jsr linget ;get first line number
- jsr fndlin ;find where it is in text area (z61)
- jsr chrgot ;is it start-end?
- beq r1 ;no. just start
- cmp #"-"
- bne snerr
- jsr chrget
- jsr linget
- bne snerr
- r1 lda poker
- ora poker+1
- bne r3
- lda #$ff
- sta poker
- sta poker+1
- r3 jmp b15
-
- za431 jsr peek
- sta thslin
- jsr peek
- sta thslin+1
- sec
- lda poker
- sbc thslin
- lda poker+1
- sbc thslin+1
- rts
-
- za445 lda z61 ;setup source for move
- sta index1
- lda z61+1
- sta index1+1
- lda txttop ;and dest
- sta index2
- lda txttop+1
- sta index2+1
- rts
-
- za456 lda index1
- cmp index2
- bne za460
- lda index1+1
- cmp index2+1
- za460 rts
-
- za461 ldy delim
- iny
- sty $ff01
- lda (index1),y
- ldy zb5
- iny
- sta (index1),y
- jsr b15
- jsr za456
- bne za471
- rts
-
- za471 inc index1
- bne za461
- inc index1+1
- bne za461
- za479 ldy delim
- sty $ff01
- lda (index2),y
- ldy zb5
- sta (index2),y
- lda #0
- sta $ff00
- jsr za456
- bne za487
- rts
-
- za487 lda index2
- bne za48d
- dec index2+1
- za48d dec index2
- jmp za479
-
- ;----------------
- ; peek text area
- ;----------------
-
- peek inc z61
- bne pk0
- inc z61+1
- pk0 ldy #0
- pk sta $ff01
- lda (z61),y
- b15 pha
- lda #$00
- sta $ff00
- pla
- rts
-
- flag *=*+1 ;flag 2=change 1=find
- strend *=*+4 ;offset,length for search & replace text
- thslin *=*+2 ;temp. store current line number
- offset *=*+1 ;current offset into line
- sofs *=*+1 ;copy of source string offset into buf
- diff *=*+1 ;difference in length. source/dest string
- delim *=*+1
- zb5 *=*+2
-
- .end
-