
 1000  *---------------------------------
 1010  *      COPY L1,L2,L3
 1020  *          L1 = FIRST LINE OF RANGE TO COPY
 1030  *          L2 = LAST LINE OF RANGE TO COPY
 1040  *          L3 = LINE NUMBER BEFORE WHICH TO INSERT
 1050  *                   THE COPIED LINES
 1060  *---------------------------------
 1070  ZZ.BGN .EQ *
 1080  *---------------------------------
 1090  SS     .EQ $00,01   START OF SOURCE BLOCK
 1100  SE     .EQ $02,03   END OF SOURCE BLOCK
 1110  SL     .EQ $04,05   LENGTH OF SOURCE BLOCK
 1120  NEWPP  .EQ $06,07   NEW PROGRAM POINTER
 1130  A0L    .EQ $3A
 1140  A0H    .EQ $3B
 1150  A1L    .EQ $3C
 1160  A1H    .EQ $3D
 1170  A2L    .EQ $3E
 1180  A2H    .EQ $3F
 1190  A4L    .EQ $42
 1200  A4H    .EQ $43
 1210  LOMEM  .EQ $4A,4B
 1220  PP     .EQ $CA,CB
 1230  *---------------------------------
 1240  SYNX   .EQ $105E
 1250  MFER   .EQ $1128
 1260  SCND   .EQ $112D
 1270  SERTXT .EQ $14F6
 1280  MON.MOVE   .EQ $FE2C
 1290  *---------------------------------
 1300         JMP COPY
 1310  *---------------------------------
 1320  ERR1   JMP SYNX
 1330  ERR2   .EQ ERR1
 1340  ERR3   JMP MFER
 1350  ERR4   .EQ ERR1
 1360  *---------------------------------
 1370  COPY
 1380         JSR SCND     GET THIRD PARAMETER
 1390         CPX #6       BE SURE WE GOT THREE
 1400         BCC ERR1     NOT ENOUGH PARAMETERS
 1410         LDX #A0L     FIND BEGINNING OF SOURCE
 1420         JSR SERTXT
 1430         LDA $E4      SAVE POINTER
 1440         STA SS
 1450         LDA $E5
 1460         STA SS+1
 1470         LDX #A1L     FIND END OF SOURCE BLOCK
 1480         JSR SERTXT
 1490         SEC          SAVE POINTER AND COMPUTE LENGTH
 1500         LDA $E6
 1510         STA SE
 1520         SBC SS
 1530         STA SL       SOURCE LENGTH
 1540         LDA $E7
 1550         STA SE+1
 1560         SBC SS+1
 1570         STA SL+1
 1580         BCC ERR2     RANGE BACKWARD
 1590         BNE .4
 1600         LDA SL
 1610         BEQ ERR2     NOTHING TO MOVE
 1620  *---------------------------------
 1630  .4     LDA PP       COMPUTE NEW PP POINTER
 1640         SBC SL
 1650         STA NEWPP
 1660         LDA PP+1
 1670         SBC SL+1
 1680         STA NEWPP+1
 1690  *---------------------------------
 1700         LDA NEWPP    SEE IF ROOM FOR THIS
 1710         CMP LOMEM
 1720         LDA NEWPP+1
 1730         SBC LOMEM+1
 1740         BCC ERR3     MEM FULL ERR
 1750  *---------------------------------
 1760         LDX #A2L     FIND TARGET LOCATION
 1770         JSR SERTXT
 1780         LDA SS       BE SURE NOT INSIDE SOURCE BLOCK
 1790         CMP $E4
 1800         LDA SS+1
 1810         SBC $E5
 1820         BCS .1       BELOW SOURCE BLOCK
 1830         LDA $E4
 1840         CMP SE
 1850         LDA $E5
 1860         SBC SE+1
 1870         BCC ERR4     INSIDE SOURCE BLOCK
 1880  *   TARGET IS ABOVE SOURCE BLOCK, SO WE HAVE TO
 1890  *   ADJUST SOURCE BLOCK POINTERS.
 1900         SEC
 1910         LDA SS
 1920         SBC SL
 1930         STA SS
 1940         LDA SS+1
 1950         SBC SL+1
 1960         STA SS+1
 1970         SEC
 1980         LDA SE
 1990         SBC SL
 2000         STA SE
 2010         LDA SE+1
 2020         SBC SL+1
 2030         STA SE+1
 2040  *---------------------------------
 2050  .1     LDA PP       SET UP MOVE TO MAKE HOLE
 2060         STA A1L
 2070         LDA PP+1
 2080         STA A1H
 2090         LDA NEWPP
 2100         STA PP
 2110         STA A4L
 2120         LDA NEWPP+1
 2130         STA PP+1
 2140         STA A4H
 2150         LDA $E5
 2160         STA A2H
 2170         LDA $E4
 2180         STA A2L
 2190         BNE .2
 2200         DEC A2H
 2210  .2     DEC A2L
 2220         LDY #0
 2230         JSR MON.MOVE
 2240  *---------------------------------
 2250         LDA SS       MOVE IN SOURCE BLOCK
 2260         STA A1L
 2270         LDA SS+1
 2280         STA A1H
 2290         LDA SE+1
 2300         STA A2H
 2310         LDA SE
 2320         STA A2L
 2330         BNE .3
 2340         DEC A2H
 2350  .3     DEC A2L
 2360         JSR MON.MOVE
 2370         RTS
 2380  *---------------------------------
 2390  ZZ.END .EQ *-1
 2400  ZZ.SIZ .EQ ZZ.END-ZZ.BGN+1

