commit - 9de116a0703a197030432b3c7ab467fded3d25e2
commit + fe14e6b035b55ee6c125e1ea7d88893f7260c2e3
blob - 0fac35319e5e8cd1e4bc05113386810cb7a2a5a5
blob + 13ea28888d78ad4503e3aefffbc8db59c0ee2a89
Binary files LINEUTIL.B,PRG and LINEUTIL.B,PRG differ
blob - dc96c2e69c87f0dedeff7a643ff3d45368323d11
blob + 30fb8908cf7b2c988d39da587123dccc65a11799
--- LINEUTIL.B.lst
+++ LINEUTIL.B.lst
1050 REM 5000 LINECUT
1060 REM 6000 LINECAT
1064 REM 6400 LINECLP
+1066 REM 6600 LINECHG
1099 REM 9900 ENTRY POINTS
1100 REM
1101 REM - SYMBOL DEFINITIONS -
1533 DATA 'PSTOP, .DW,0
1540 DATA 'DELTA, .DW,0
1541 DATA 'TMP, .DW,0
+1550 DATA 'NPREV, .DW,0
+1551 DATA 'PPREV, .DW,0
+1552 DATA 'NLAST, .DW,0
+1553 DATA 'PLAST, .DW,0
+1554 DATA 'NNEXT, .DW,0
+1555 DATA 'NDEST, .DW,0
1599 REM
1700 DATA 'S.REM, .DSZ," REM "
1701 DATA 'S.DATA, .DSZ," DATA "
1720 DATA 'S.FILE, .DSZ,"FILE: "
1721 DATA 'S.DRVBRA, .DSZ,"DRIVE ["
1722 DATA 'S.KETCOL, .DSZ,"]: "
+1730 DATA 'S.DEST, .DSZ,"DEST: "
1799 REM
-1800 DATA 'S.ERROR, .DSZ,"ERROR "
+1800 DATA 'S.ERROR, .DB, 13
+1801 DATA .DSZ,"ERROR "
1805 DATA 'S.ABORT, .DB, 13
1806 DATA .DSZ,"ABORTED"
1810 DATA 'S.ECLASH, .DSZ
1998 REM
1999 REM
2000 DATA 'LINECNT
-2001 DATA LDXZ, TXTTAB
-2002 DATA LDYZ, TXTTAB+
-2003 DATA STXZ, P
-2004 DATA STYZ, P+
-2005 DATA LDA#, 0
-2006 DATA STA, CNT
-2007 DATA STA, CNT+
-2008 DATA STA, CNT.REM
-2009 DATA STA, CNT.REM+
-2010 DATA STA, CNT.DATA
-2011 DATA STA, CNT.DATA+
-2012 DATA STA, CNT.JUNK
-2013 DATA STA, CNT.JUNK+
-2014 DATA STA, CNT.SPC
-2015 DATA STA, CNT.SPC+
+2005 DATA LDXZ, TXTTAB
+2006 DATA LDYZ, TXTTAB+
+2007 DATA STXZ, P
+2008 DATA STYZ, P+
+2009 DATA LDA#, 0
+2010 DATA STA, CNT
+2011 DATA STA, CNT+
+2012 DATA STA, CNT.REM
+2013 DATA STA, CNT.REM+
+2014 DATA STA, CNT.DATA
+2015 DATA STA, CNT.DATA+
+2016 DATA STA, CNT.JUNK
+2017 DATA STA, CNT.JUNK+
+2018 DATA STA, CNT.SPC
+2019 DATA STA, CNT.SPC+
2020 DATA 'LOOP
2021 DATA LDA#, 1
2022 DATA TAY
3000 REM
3001 REM - SUBROUTINES -
3002 REM
-3031 REM 3100 PUTSTR
+3031 REM 3100 PUTSTR / PUTISTR / PUT*LN
3032 REM 3200 QUOTREM
3034 REM 3400 PRINTNAT
3036 REM 3600 GETSTR
3045 REM 4500 FINDLAST,PUTNL,PRINTNATLN
3046 REM 4600 DELTAPPLY
3047 REM 4700 RELINK
+3048 REM 4800 GETSTASTOLINE
3099 REM
3100 DATA 'PUTSTR
3101 REM
3106 REM
3110 DATA STXZ, P: REM USER ZP AREA
3111 DATA STYZ, P+
-3112 DATA LDY#, 0
-3120 DATA 'PS1
-3130 DATA LDA(Y, P
-3135 DATA BEQR, PS2
-3140 DATA JSR, CHROUT
-3150 DATA INY
-3160 DATA JMP, PS1
-3170 DATA 'PS2
-3175 DATA TYA
-3176 DATA LDYZ, P+
-3180 DATA RTS
+3115 DATA LDY#, 0
+3120 DATA 'PSLOOP
+3125 DATA LDA(Y, P
+3126 DATA BEQR, PSEND
+3127 DATA JSR, CHROUT
+3128 DATA INY
+3129 DATA JMP, PSLOOP
+3130 DATA 'PSEND
+3135 DATA TYA
+3136 DATA LDYZ, P+
+3137 DATA RTS
+3139 REM
+3140 DATA 'PUTLN
+3141 DATA LDA#, 13
+3142 DATA JMP, CHROUT
+3143 REM
+3145 DATA 'PUTSTRLN
+3146 DATA JSR, PUTSTR
+3147 DATA JMP, PUTLN
+3148 REM
+3150 DATA 'PUTISTR
+3151 REM
+3152 REM PRINT A STRING IMM BEHIND THE
+3153 REM JSR. CONT AFTER THE NUL TERM.
+3154 REM
+3155 REM CLOBBERS: A, Y, P
+3156 REM
+3160 DATA PLA: REM LO BYTE
+3161 DATA STAZ, P
+3162 DATA PLA
+3163 DATA STAZ, P+
+3164 DATA LDY#, 1: REM RET ADDR + 1
+3165 DATA JSR, PSLOOP
+3168 DATA 'PISRET
+3169 REM PUSH ADDR OF NUL AND RETURN
+3170 DATA CLC
+3171 DATA ADCZ, P
+3172 DATA TAX
+3173 DATA TYA: REM = P+
+3174 DATA ADC#, 0
+3175 DATA PHA
+3176 DATA TXA
+3177 DATA PHA
+3178 DATA RTS
+3179 REM
+3180 DATA 'PUTISTRLN
+3181 DATA PLA
+3182 DATA STAZ, P
+3183 DATA PLA
+3184 DATA STAZ, P+
+3185 DATA LDY#, 1
+3186 DATA JSR, PSLOOP
+3190 DATA TAX
+3191 DATA JSR, PUTNL
+3192 DATA TXA
+3195 DATA JMP, PISRET
3199 REM
3200 DATA 'QUOTREM
3201 REM
4302 REM X.Y IN: LINE NUMBER
4303 REM X.Y OUT: LINE POINTER
4304 REM P (251) OUT: -"-
-4305 REM
-4306 REM CLOBBERS: A, X, Y, P, Q
-4307 REM
+4305 REM Q (253) OUT: PREV LINE (PTR)
+4306 REM
+4307 REM CLOBBERS: A, X, Y, P, Q, T, B
+4308 REM
4310 DATA LDAZ, TXTTAB
4311 DATA STAZ, P: REM -> P
4312 DATA LDAZ, TXTTAB+
4313 DATA STAZ, P+
+4315 DATA LDA#, 0: REM PREV PTR
+4316 DATA STAZ, Q
+4317 DATA STAZ, Q+
4319 REM ...
4320 DATA 'FINDNEXT
4321 REM
4322 REM X.Y IN: LINE NUMBER
4323 REM X.Y OUT: LINE POINTER
4324 REM P (251) IN/OUT: -"-
-4325 REM
-4326 REM CLOBBERS: A, X, Y, P, Q
-4327 REM
-4330 DATA STXZ, Q
-4331 DATA STYZ, Q+
+4325 REM Q (253) IN/OUT: PREV LINE PTR
+4326 REM
+4327 REM CLOBBERS: A, X, Y, P, Q, T, B
+4328 REM
+4330 DATA STXZ, T
+4331 DATA STYZ, B
4340 DATA 'FN3
4350 DATA LDY#, 1: REM -> PNEXT HI
4351 DATA LDA(Y, P
4352 DATA BEQR, FN5: REM RETURN
4360 DATA LDY#, 3: REM -> LINENO HI
4361 DATA LDA(Y, P
-4362 DATA CMPZ, Q+: REM HI BYTE
+4362 DATA CMPZ, B: REM HI BYTE
4363 DATA BCCR, FN4: REM A < M
4364 DATA BNER, FN5: REM A > M
4365 DATA DEY
4366 DATA LDA(Y, P
-4367 DATA CMPZ, Q: REM LO BYTE
+4367 DATA CMPZ, T: REM LO BYTE
4368 DATA BCCR, FN4
4369 DATA JMP, FN5: REM RETURN
4370 DATA 'FN4: REM NEXT LINE
-4371 DATA LDY#, 0
-4372 DATA LDA(Y, P
-4373 DATA TAX
-4374 DATA INY
-4375 DATA LDA(Y, P
-4376 DATA STXZ, P
-4377 DATA STAZ, P+
-4380 DATA JMP, FN3
+4375 DATA LDXZ, P
+4376 DATA LDYZ, P+
+4377 DATA STXZ, Q
+4378 DATA STYZ, Q+
+4380 DATA LDY#, 0
+4381 DATA LDA(Y, P
+4382 DATA TAX
+4383 DATA INY
+4384 DATA LDA(Y, P
+4385 DATA STXZ, P
+4386 DATA STAZ, P+
+4389 DATA JMP, FN3
4390 DATA 'FN5
4391 DATA LDXZ, P
4392 DATA LDYZ, P+
4790 DATA 'RL4
4791 DATA RTS
4799 REM
+4800 DATA 'GETSTASTOLINE
+4810 DATA JSR, GETSTASTO
+4811 DATA BCCR, GSL1: REM STOP < START
+4812 DATA BNER, GSL2: REM >
+4820 DATA 'GSL1
+4821 DATA SEC: REM NSTART >= NSTOP
+4822 DATA RTS
+4825 DATA 'GSL2
+4830 REM LOCATE START LINE
+4831 DATA LDX, NSTART
+4832 DATA LDY, NSTART+
+4833 DATA JSR, FINDLINE
+4834 DATA STX, PSTART
+4835 DATA STY, PSTART+
+4840 REM SAVE PTR TO PRECEEDING LINE
+4841 DATA LDXZ, Q
+4842 DATA LDYZ, Q+
+4843 DATA STX, PPREV
+4844 DATA STY, PPREV+
+4860 REM LOCATE STOP LINE
+4861 DATA LDX, NSTOP
+4862 DATA LDY, NSTOP+
+4863 DATA JSR, FINDNEXT
+4864 DATA STX, PSTOP
+4865 DATA STY, PSTOP+
+4879 REM SAVE PTR TO LAST LINE
+4880 DATA LDXZ, Q
+4881 DATA LDYZ, Q+
+4882 DATA STX, PLAST
+4883 DATA STY, PLAST+
+4890 DATA CLC
+4891 DATA RTS
4999 REM
5000 DATA 'LINECUT
-5010 DATA JSR, GETSTASTO
-5011 DATA BCCR, LCU1: REM <
-5012 DATA BNER, LCU2: REM >
-5020 DATA 'LCU1
-5021 DATA RTS: REM NSTOP <= NSTART
-5030 DATA 'LCU2
-5060 REM LOCATE START -> PTR IN P (251)
-5061 DATA LDX, NSTART
-5062 DATA LDY, NSTART+
-5063 DATA JSR, FINDLINE
-5064 DATA STX, PSTART
-5065 DATA STY, PSTART+
-5070 REM LOCATE STOP LINE -> PTR IN Q
-5071 DATA LDX, NSTOP
-5072 DATA LDY, NSTOP+
-5073 DATA JSR, FINDNEXT
-5074 DATA STX, PSTOP
-5075 DATA STY, PSTOP+
+5001 DATA JSR, PUTISTRLN
+5002 DATA .DSZ, "DELETE LINES"
+5010 DATA JSR, GETSTASTOLINE
+5011 DATA BCCR, LCU2: REM START < STOP
+5012 DATA RTS
+5020 DATA 'LCU2
5240 REM CALC. DELTA = PSTART - PSTOP
5250 DATA SEC
5251 DATA LDA, PSTART
5370 DATA RTS
5999 REM
6000 DATA 'LINECAT
-6001 REM SAVE LAST LINE NUMBER IN TMP
-6002 DATA JSR, FINDLAST
-6005 DATA LDY#, 1
-6006 DATA LDA(Y, P
-6007 DATA BNER, LCA0: REM EMPTY PRG?
+6001 DATA JSR, PUTISTRLN
+6002 DATA .DSZ, "APPEND PRG"
+6005 REM SAVE LAST LINE NUMBER IN TMP
+6006 DATA JSR, FINDLAST
+6007 DATA LDY#, 1
+6008 DATA LDA(Y, P
+6009 DATA BNER, LCA0: REM EMPTY PRG?
6010 DATA LDA#, 0: REM DEFAULT 0
6011 DATA STA, TMP
6012 DATA STA, TMP+
6071 DATA STXZ, Q: REM PSTOP
6072 DATA STYZ, Q+
6075 REM CHECK FOR LINE NUMBER CLASH
-6076 DATA JSR, LCACHK
-6077 DATA BCSR, LCARET
-6080 REM SCAN & RELINK LINES
-6081 DATA JSR, RELINK
+6080 REM COMPARE VS LAST LINE NUMBER
+6085 DATA LDX, TMP
+6086 DATA LDA, TMP+
+6090 DATA LDY#, 3
+6091 DATA CMP(Y, P
+6092 DATA BCCR, LCACOK
+6093 DATA BNER, LCACFAIL
+6100 DATA TXA
+6101 DATA DEY
+6102 DATA CMP(Y, P
+6103 DATA BCCR, LCACOK
+6105 DATA 'LCACFAIL
+6110 REM NULL OFF THE NEW LINES, ABORT
+6111 DATA LDA#, 0
+6112 DATA TAY
+6113 DATA STA(Y, P
+6114 DATA INY
+6115 DATA STA(Y, P
+6120 DATA LDX#, S.ECLASH
+6121 DATA LDY#, S.ECLASH^
+6122 DATA JSR, PUTSTR
+6130 DATA LDX#, S.ABORT
+6131 DATA LDY#, S.ABORT^
+6132 DATA JSR, PUTSTR
+6135 DATA RTS
+6140 DATA 'LCACOK
+6170 REM SCAN & RELINK LINES
+6171 DATA JSR, RELINK
6180 REM REWRITE TERMINATOR TO BE SAFE
6181 DATA LDA#, 0
6182 DATA TAY
6196 DATA STXZ, STREND
6197 DATA STYZ, STREND+
6198 DATA RTS
-6200 DATA 'LCACHK
-6210 REM COMPARE VS LAST LINE NUMBER
-6215 DATA LDX, TMP
-6216 DATA LDA, TMP+
-6220 DATA LDY#, 3
-6221 DATA CMP(Y, P
-6222 DATA BCCR, LCACOK
-6223 DATA BNER, LCACFAIL
-6230 DATA TXA
-6231 DATA DEY
-6232 DATA CMP(Y, P
-6233 DATA BCCR, LCACOK
-6235 DATA 'LCACFAIL
-6240 REM NULL OFF THE NEW LINES, ABORT
-6241 DATA LDA#, 0
-6242 DATA TAY
-6243 DATA STA(Y, P
-6244 DATA INY
-6245 DATA STA(Y, P
-6270 DATA LDX#, S.ECLASH
-6271 DATA LDY#, S.ECLASH^
-6272 DATA JSR, PUTSTR
-6280 DATA LDX#, S.ABORT
-6281 DATA LDY#, S.ABORT^
-6282 DATA JSR, PUTSTR
-6285 DATA SEC
-6290 DATA 'LCACOK
-6291 DATA RTS
-6299 REM
+6399 REM
6400 DATA 'LINECLP
-6410 DATA JSR, GETSTASTO
-6411 DATA BCCR, LCLRET
-6412 DATA BNER, LCL1
-6415 DATA 'LCLRET
-6416 DATA RTS
+6401 DATA JSR, PUTISTRLN
+6402 DATA .DSZ, "SAVE LINES"
+6410 DATA JSR, GETSTASTOLINE
+6411 DATA BCCR, LCL1
+6415 DATA RTS
6419 DATA 'LCL1
6420 DATA LDX, NSTART
6421 DATA LDY, NSTART+
6583 DATA STYZ, P+
6584 DATA JMP, RELINK: REM TAIL CALL
6599 REM
+6600 DATA 'LINECHG
+6601 DATA JSR, PUTISTRLN
+6602 DATA .DSZ, "SHIFT LINES"
+6610 DATA JSR, GETSTASTOLINE
+6611 DATA BCCR, LCH1
+6612 DATA RTS
+6620 DATA 'LCH1
+6630 DATA LDX#, S.DEST
+6631 DATA LDY#, S.DEST^
+6632 DATA JSR, PUTSTR
+6633 DATA JSR, READNAT
+6634 DATA STX, NDEST
+6635 DATA STY, NDEST+
+6640 REM MUST VALIDATE:
+6641 REM 1. NDEST > NPREV
+6642 REM 2. NLAST + DELTA < NNEXT
+6643 REM WHERE DELTA = NDEST - NSTART
9900 REM
9901 REM ENTRY POINTS: $C350 - $C3B4
9902 REM
9910 DATA .=, 50010, JMP, LINECUT
9920 DATA .=, 50020, JMP, LINECAT
9930 DATA .=, 50030, JMP, LINECLP
+9940 DATA .=, 50040, JMP, LINECHG
9998 DATA .LIM, 50100
9999 DATA .END