Commit Diff


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