home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / text / examples.arc / CHANGE.A < prev    next >
Encoding:
Text File  |  1989-12-01  |  13.9 KB  |  360 lines

  1. ;change.asm
  2. ;----------------------------------
  3. ; Command:   change/from/to/,range
  4. ;----------------------------------
  5.                                   
  6. poker       = $0016               
  7. index1      = $0024               
  8. index2      = $0026               
  9. z61         = $0061               
  10. runmod      = $007f               
  11. scroll      = $00f8               
  12. txtptr      = $003d               
  13. ierror      = $0300               
  14. chrget      = $0380               
  15. chrgot      = $0386               
  16. txttop      = $1210               
  17. linget      = $50a0               
  18. linprt      = $8e32               
  19. lnkprg      = $4f4f               
  20. fndlin      = $5064               
  21. chrout      = $ffd2               
  22. stop        = $ffe1               
  23.                                   
  24. int04       = $1704               
  25. int05       = $1705               
  26. int0e       = $170e               
  27. stk0        = $1be7               
  28. tx          = $1bfe               
  29.                                   
  30. star        = $0b00               
  31.             .wor star             
  32.             * = star
  33.  
  34.             jmp change
  35.             dw Date
  36.                                   
  37. change      lda ierror            ;save ierror vector
  38.             sta svie              
  39.             lda ierror+1          
  40.             sta svie+1            
  41.             lda #<chng            ;and make a new one for now
  42.             sta ierror            
  43.             lda #>chng            
  44.             sta ierror+1          
  45.             ldx stk0              ;recall stack at "lookup"
  46.             txs                   
  47.             lda #$40              
  48.             sta $ff00             
  49.             rts                   ;and return to main
  50.                                   
  51. svie        .wor 0                
  52.                                   
  53. ;-------------------------------
  54. ; adjust for text or basic mode
  55. ;-------------------------------
  56.                                   
  57. adj         bit tx                ;basic mode?
  58.             bmi adj0              ;no text. un-crunch the line
  59.             rts                   
  60.                                   
  61. adj0        ldx #0                ;copy command line back to input buffer
  62.             jsr int04             
  63. adj1        sta $0200,x           
  64.             inx                   
  65.             jsr int05             
  66.             cmp #0                
  67.             bne adj1              
  68.             sta $0200,x           
  69.             rts                   
  70.                                   
  71. ;-------------------
  72. ; ierror jumps here
  73. ;-------------------
  74.                                   
  75. chng        lda #0                ;bank 15
  76.             sta $ff00             
  77.             sta runmod            
  78.             lda svie              ;restore old error vector
  79.             sta ierror            
  80.             lda svie+1            
  81.             sta ierror+1          
  82.             jsr adj               ;adjust buf if text mode
  83.             lda #<$01ff           ;setup chrget
  84.             sta txtptr            
  85.             lda #>$01ff           
  86.             sta txtptr+1          
  87. fc          jsr chrget            ;1st non-alpha char is the delimiter
  88.             cmp #"a"              
  89.             bcc gotdel            ;got it
  90.             cmp #$5b              ;"z"+1
  91.             bcc fc                
  92. gotdel      sta delim             ;save it
  93.             ldx #0                
  94.             stx strend+2          
  95.             jsr gettxt            ;get search text
  96.             ldx #2                ;flag "change"
  97.             stx flag              
  98.             bne ch0               
  99. find        sta delim             
  100.             ldx #0                ;flag "find"
  101.             stx flag              
  102. ch0         jsr gettxt            ;get replace text
  103.             jsr chrget            ;move past closing delimiter
  104.             beq ch1               ;no range (colon or zero)
  105.             cmp #","              
  106.             beq ch11              
  107.             jmp snerr             
  108.                                   
  109. ch11        jsr chrget            
  110. ch1         jsr range             ;get range
  111.             jsr b15               
  112.             lda #13               
  113.             jsr chrout            
  114.             jmp za32a             
  115.                                   
  116. za31f       iny                   ;bump past eol marker (0)
  117.             tya                   
  118.             clc                   
  119.             adc z61               
  120.             sta z61               
  121.             bcc za32a             
  122.             inc z61+1             
  123. za32a       jsr peek              ;get link high
  124.             beq fini              ;end of text...quit
  125.             jsr stop              ;stop key?
  126.             beq fini              ;yep
  127.             jsr za431             ;test if line lower than max
  128.             bcs za337             ;it is. test it
  129. fini        jsr lnkprg            ;otherwise all done
  130.             jmp int0e             
  131.                                   
  132. za337       sty offset            ;.y=0 (offset into text portion of line)
  133. za339       inc offset            
  134.             ldy offset            ;offset into current line being tested
  135.             ldx strend            ;offset into buf for search string
  136.             lda strend+1          ;length of search string
  137.             sta sofs              
  138. za343       jsr pk                ;get from line
  139.             beq za31f             ;end of line. text not found
  140.             cmp $0200,x           ;same as search string?
  141.             bne za339             ;no. move up through source line
  142.             inx                   
  143.             iny                   
  144.             dec sofs              
  145.             bne za343             ;still more chars to check
  146.             dey                   ;found text. save offset to end+1
  147.             sty delim             
  148.             sty zb5               
  149.             lda flag              ;find?
  150.             beq za3bf             ;yes. just list it
  151.             jsr za445             ;set source=(z61) and dest=(end of text) for move
  152.             lda strend+3          ;calculate length difference for change
  153.             sec                   
  154.             sbc strend+1          
  155.             sta diff              
  156.             beq za398             ;no difference. change it directly
  157. za370       iny                   
  158.             beq fini              ;line too long..abort
  159.             jsr pk                
  160.             bne za370             
  161.             clc                   
  162.             tya                   
  163.             adc diff              
  164.             cmp #2                
  165.             bcc za3bf             
  166.             cmp #$9b              
  167.             bcs za3bf             
  168.             lda diff              
  169.             bpl za389             
  170.             dec sofs              
  171. za389       clc                   
  172.             adc delim             
  173.             sta zb5               
  174.             bcs za395             
  175.             jsr za479             
  176.             beq za398             
  177. za395       jsr za461             
  178. za398       lda zb5               
  179.             sec                   
  180.             sbc strend+3          
  181.             tay                   
  182.             iny                   
  183.             lda strend+3          
  184.             beq za3b2             
  185.             sta zb5+1             
  186.             ldx strend+2          
  187. za3a7       lda $0200,x           
  188.             sta $ff01             
  189.             sta (z61),y           
  190.             jsr b15               
  191.             inx                   
  192.             iny                   
  193.             dec zb5+1             
  194.             bne za3a7             
  195. za3b2       clc                   
  196.             lda txttop            
  197.             adc diff              
  198.             sta txttop            
  199.             lda txttop+1          
  200.             adc sofs              
  201.             sta txttop+1          
  202. za3bf       ldx thslin            
  203.             lda thslin+1          
  204.             ldy #0                
  205.             jsr $5125             
  206.             jsr b15               
  207.             lda #13               
  208.             jsr chrout            
  209.             ldy zb5               
  210.             jmp za337             
  211.                                   
  212. ;-------------------------------------
  213. ; get search or replace text from buf
  214. ;-------------------------------------
  215.                                   
  216. gettxt      ldy txtptr            
  217.             iny                   
  218.             tya                   
  219.             sta strend,x          ;offset to start of text
  220.             lda #0                
  221.             sta strend+1,x        ;initialize length to zero
  222. gt0         lda $0200,y           
  223.             beq mbs               ;end of line. maybe a syntax error
  224.             cmp delim             
  225.             beq gtx               
  226.             inc strend+1,x        ;bump length
  227.             iny                   
  228.             bne gt0               
  229. gtx         sty txtptr            ;done
  230.             cmp #34               ;is the delimiter a quote?
  231.             bne gtxx              ;no then /this/that/
  232.             txa                   
  233.             bne gtxx              
  234.             jsr chrget            ;otherwise  "this"  "that"
  235.             cmp #34               
  236.             beq gtxx              
  237.             jmp snerr             
  238. gtxx        rts                   
  239.                                   
  240. mbs         cpx #2                ;error if eol during 1st string
  241.             bne snerr             
  242.             dey                   
  243.             jmp gtx               
  244.                                   
  245. ;----------------
  246. ; get line range
  247. ;----------------
  248.                                   
  249. range       bcc r0                ;chrget got a number
  250.             beq r0                
  251.             cmp #"-"              
  252.             beq r0                
  253. snerr       ldx #11               
  254.             jmp (ierror)          
  255.                                   
  256. r0          jsr linget            ;get first line number
  257.             jsr fndlin            ;find where it is in text area (z61)
  258.             jsr chrgot            ;is it start-end?
  259.             beq r1                ;no. just start
  260.             cmp #"-"              
  261.             bne snerr             
  262.             jsr chrget            
  263.             jsr linget            
  264.             bne snerr             
  265. r1          lda poker             
  266.             ora poker+1           
  267.             bne r3                
  268.             lda #$ff              
  269.             sta poker             
  270.             sta poker+1           
  271. r3          jmp b15               
  272.                                   
  273. za431       jsr peek              
  274.             sta thslin            
  275.             jsr peek              
  276.             sta thslin+1          
  277.             sec                   
  278.             lda poker             
  279.             sbc thslin            
  280.             lda poker+1           
  281.             sbc thslin+1          
  282.             rts                   
  283.                                   
  284. za445       lda z61               ;setup source for move
  285.             sta index1            
  286.             lda z61+1             
  287.             sta index1+1          
  288.             lda txttop            ;and dest
  289.             sta index2            
  290.             lda txttop+1          
  291.             sta index2+1          
  292.             rts                   
  293.                                   
  294. za456       lda index1            
  295.             cmp index2            
  296.             bne za460             
  297.             lda index1+1          
  298.             cmp index2+1          
  299. za460       rts                   
  300.                                   
  301. za461       ldy delim             
  302.             iny                   
  303.             sty $ff01             
  304.             lda (index1),y        
  305.             ldy zb5               
  306.             iny                   
  307.             sta (index1),y        
  308.             jsr b15               
  309.             jsr za456             
  310.             bne za471             
  311.             rts                   
  312.                                   
  313. za471       inc index1            
  314.             bne za461             
  315.             inc index1+1          
  316.             bne za461             
  317. za479       ldy delim             
  318.             sty $ff01             
  319.             lda (index2),y        
  320.             ldy zb5               
  321.             sta (index2),y        
  322.             lda #0                
  323.             sta $ff00             
  324.             jsr za456             
  325.             bne za487             
  326.             rts                   
  327.                                   
  328. za487       lda index2            
  329.             bne za48d             
  330.             dec index2+1          
  331. za48d       dec index2            
  332.             jmp za479             
  333.                                   
  334. ;----------------
  335. ; peek text area
  336. ;----------------
  337.                                   
  338. peek        inc z61               
  339.             bne pk0               
  340.             inc z61+1             
  341. pk0         ldy #0                
  342. pk          sta $ff01             
  343.             lda (z61),y           
  344. b15         pha                   
  345.             lda #$00              
  346.             sta $ff00             
  347.             pla                   
  348.             rts                   
  349.                                   
  350. flag        *=*+1                 ;flag 2=change 1=find
  351. strend      *=*+4                 ;offset,length for search & replace text
  352. thslin      *=*+2                 ;temp. store current line number
  353. offset      *=*+1                 ;current offset into line
  354. sofs        *=*+1                 ;copy of source string offset into buf
  355. diff        *=*+1                 ;difference in length. source/dest string
  356. delim       *=*+1                 
  357. zb5         *=*+2                 
  358.                                   
  359.             .end                  
  360.