commit fe14e6b035b55ee6c125e1ea7d88893f7260c2e3 from: Sven M. Hallberg date: Sun May 31 18:15:35 2026 UTC LINEUTIL.B.9 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 @@ -13,6 +13,7 @@ 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 - @@ -53,6 +54,12 @@ 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 " @@ -65,8 +72,10 @@ 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 @@ -79,21 +88,21 @@ 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 @@ -253,7 +262,7 @@ 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 @@ -266,6 +275,7 @@ 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 @@ -276,17 +286,62 @@ 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 @@ -547,47 +602,56 @@ 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+ @@ -757,26 +821,46 @@ 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 @@ -836,11 +920,13 @@ 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+ @@ -880,10 +966,34 @@ 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 @@ -900,41 +1010,13 @@ 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+ @@ -1007,6 +1089,23 @@ 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 @@ -1014,5 +1113,6 @@ 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