Commit Diff


commit - 54a0914502c40d3bceee09d939958dda0ba5cf31
commit + d7bdf931da0d9279831a3e2339fbbfaa48e3e09a
blob - 5785d55b4029f25b4f3a92b2a08bf0ead1d83fae
blob + 78c299b343ff32a7f5120f499183b0aa251ade16
Binary files LINEUTIL.B,PRG and LINEUTIL.B,PRG differ
blob - 1bc881c1b8aa419b202e34a272db8041e44fe2c8
blob + 19dfef47214b1c3cfb8df71f3b4dfd0f6963ff90
--- LINEUTIL.B.lst
+++ LINEUTIL.B.lst
@@ -1,13 +1,13 @@
 0 REM BASASM - A SIMPLISTIC ASSEMBLER
 1 REM MADE IN BASIC. PESCO 2026
 2 REM
-3 REM  10 VARIABLES    400 .DIRECTIVES
-4 REM 100 LOAD OPCODES 700 *SAVE TO PRG
-5 REM 130 SUBROUTINES  720 *PRINT SEQ F
-6 REM 200 MAIN LOOP    800 *HEXDUMP MEM
-7 REM 300 FORWARD REFS 900 OPCODE TABLE
-8 REM                 1000 ASSEMBLY PGM
-9 REM
+3 REM  10 VARIABLES    700 *SAVE TO PRG
+4 REM 100 LOAD OPCODES 720 *PRINT SEQ F
+5 REM 130 SUBROUTINES  740 *MEMSTAT
+6 REM 200 MAIN LOOP    750 *READ IO ERR
+7 REM 300 FORWARD REFS 800 *HEXDUMP MEM
+8 REM 400 .DIRECTIVES  900 OPCODE TABLE
+9 REM                 1000 ASSEMBLY PGM
 10 O = 49152    :REM STARTING POSITION
 11 P = O        :REM CURRENT POSITION
 13 UN = 0       :REM UNDEF SYMBOL COUNT
@@ -21,7 +21,7 @@
 27 DIM SY$(SM%) :REM SYMBOL NAMES
 28 DIM SY(SM%)  :REM SYMBOL VALUES
 30 PA% = 0      :REM PATCH COUNT
-31 PM% = 99     :REM PATCH MAX
+31 PM% = 255    :REM PATCH MAX
 32 DIM PA(PM%)  :REM PATCH POSITION
 33 DIM PA%(PM%) :REM PATCH LENGTH
 34 DIM PA$(PM%) :REM PATCH MODE (INST)
@@ -135,7 +135,7 @@
 371 FOR I = 0 TO PA% - 1
 372 P = PA(I): L% = PA%(I)
 373 A = PS(I): M$ = PA$(I)
-374 IF SY(A) = -1 THEN NEXT
+374 IF SY(A) = -1 THEN 378
 375 PRINT P + 1; TAB(13);
 376 PRINT "["; SY$(A); "] ";
 377 A = SY(A): GOSUB 190: PRINT
@@ -226,6 +226,28 @@
 728 OPEN 1,D,2,F$ + ",SEQ,R"
 729 IF ST THEN CLOSE 1: END
 732 GET# 1, A$: PRINT A$;: GOTO 729
+737 REM
+738 REM *RUN 740* PRINT MEM STATS/PTRS
+739 REM
+740 PRINT 43,"TXTTAB",PEEK(43)+PEEK(44)*256
+741 PRINT 45,"VARTAB",PEEK(45)+PEEK(46)*256
+742 PRINT 47,"ARYTAB",PEEK(47)+PEEK(48)*256
+743 PRINT 49,"STREND",PEEK(49)+PEEK(50)*256
+744 PRINT 51,"FRETOP",PEEK(51)+PEEK(52)*256
+745 PRINT 53,"FRESPC",PEEK(53)+PEEK(54)*256
+746 PRINT 55,"MEMSIZ",PEEK(55)+PEEK(56)*256
+747 END
+748 REM
+749 REM *RUN 750* READ IO ERROR CHANNEL
+750 FA = PEEK(186)
+751 PRINT "DRIVE [";FA;"]";: INPUT A$
+752 A=FA: IF A$ <>"" THEN A=VAL(A$)
+753 OPEN 15, A, 15
+754 INPUT# 15, A, B$, C, D
+755 CLOSE 15
+756 PRINT A; B$; C; D
+757 END
+799 REM
 800 REM *RUN 800* HEXDUMP MEMORY
 801 REM
 802 INPUT "START"; A$: GOSUB 130: P=A
@@ -345,6 +367,8 @@
 1030 REM 2000 LINECNT
 1040 REM 3000 SUBROUTINES
 1050 REM 5000 LINECUT
+1060 REM 6000 LINECAT
+1080 REM 8000 ENTRY POINTS
 1090 REM 9000 VARIABLES & STATIC DATA
 1099 REM
 1500 REM
@@ -529,11 +553,20 @@
 3020 REM 3200 QUOTREM
 3030 REM 3400 PRINTNAT
 3040 REM 3600 GETSTR
+3050 REM 3800 ATOI
+3060 REM 4000 READNAT
+3070 REM 4100 MEMCPY
 3099 REM
 3100 DATA 'PUTSTR
-3105 DATA  STXZ, 251: REM USER Z/P AREA
-3106 DATA  STYZ, 252
-3110 DATA  LDY#, 0
+3101 REM
+3102 REM X.Y  IN:  PTR TO NULL-TERM STR
+3103 REM A    OUT: LENGTH OF STRING
+3104 REM
+3105 REM CLOBBERS: A, 251-252
+3106 REM
+3110 DATA  STXZ, 251: REM USER Z/P AREA
+3111 DATA  STYZ, 252
+3112 DATA  LDY#, 0
 3120 DATA 'PS1
 3130 DATA  LDA(Y, 251
 3135 DATA  BEQR, PS2
@@ -541,6 +574,8 @@
 3150 DATA  INY
 3160 DATA  JMP, PS1
 3170 DATA 'PS2
+3175 DATA  TYA
+3176 DATA  LDYZ, 252
 3180 DATA  RTS
 3199 REM
 3200 DATA 'QUOTREM
@@ -550,11 +585,11 @@
 3204 REM A        RESULT: QUOTIENT
 3205 REM X.Y      RESULT: REMAINDER
 3206 REM
-3207 REM CLOBBERS 253 AND C
+3207 REM CLOBBERS 2 AND C
 3208 REM
 3209 REM
 3210 DATA  LDA#, 0
-3211 DATA  STAZ, 253
+3211 DATA  STAZ, 2
 3220 DATA 'QR1
 3225 DATA  SEC
 3230 DATA  TXA
@@ -564,7 +599,7 @@
 3260 DATA  SBCZ, 252
 3265 DATA  TAY
 3270 DATA  BCCR, QR2
-3280 DATA  INCZ, 253
+3280 DATA  INCZ, 2
 3290 DATA  JMP, QR1
 3300 DATA 'QR2
 3310 DATA  TXA
@@ -573,11 +608,16 @@
 3316 DATA  TYA
 3318 DATA  ADCZ, 252
 3320 DATA  TAY
-3322 DATA  LDAZ, 253
+3322 DATA  LDAZ, 2
 3323 DATA  CLC
 3324 DATA  RTS
 3390 REM
 3400 DATA 'PRINTNAT
+3401 REM
+3402 REM X/Y  IN: NUMBER TO PRINT
+3403 REM
+3404 REM CLOBBERS: A, X, Y, 2, 251-252
+3405 REM
 3410 DATA  LDA#, 16:    REM 10000...
 3411 DATA  STAZ, 251
 3412 DATA  LDA#, 39
@@ -612,15 +652,21 @@
 3580 DATA  RTS
 3599 REM
 3600 DATA 'GETSTR
+3601 REM
+3602 REM X/Y  IN/OUT: PTR TO STR BUF
+3603 REM A    OUT:    LEN OF STRING
+3604 REM
+3605 REM CLOBBERS: 2, 251-252
+3606 REM
 3610 DATA  STXZ, 251
 3611 DATA  STYZ, 252
 3620 DATA  LDY#, 0
 3625 DATA  STYZ, 204:  REM CURSOR ON
 3630 DATA 'GS1
-3635 DATA  STYZ, 215:  REM SAVE Y
+3635 DATA  STYZ, 2:    REM SAVE Y
 3640 DATA  JSR, $FFE4: REM GETIN
 3641 DATA  BEQR, GS1
-3645 DATA  LDYZ, 215:  REM RESTORE Y
+3645 DATA  LDYZ, 2:    REM RESTORE Y
 3650 DATA  CMP#, 13:   REM CR
 3651 DATA  BEQR, GS3
 3660 DATA  CMP#, 20:   REM DEL
@@ -634,7 +680,7 @@
 3680 DATA 'GS2
 3681 DATA  CMP#, 32:   REM SPC
 3682 DATA  BMIR, GS1
-3683 DATA  CMP#, 126:  REM "{pi}"
+3683 DATA  CMP#, 127:  REM DEL
 3684 DATA  BPLR, GS1
 3690 DATA  STA(Y, 251
 3691 DATA  INY
@@ -643,29 +689,425 @@
 3700 DATA 'GS3
 3710 DATA  LDA#, 0
 3720 DATA  STA(Y, 251
-3725 DATA  LDA#, 1
-3726 DATA  STAZ, 204:  REM CURSOR OFF
-3727 DATA  LDA#, 13
-3728 DATA  JSR, $FFD2
-3730 DATA  RTS
+3721 DATA  STYZ, 2
+3722 DATA  LDA#, 1
+3723 DATA  STAZ, 204:  REM CURSOR OFF
+3724 DATA  LDA#, 32:   REM ERASE CRSR
+3725 DATA  JSR, $FFD2
+3726 DATA  LDA#, 13
+3727 DATA  JSR, $FFD2
+3730 DATA  LDAZ, 2
+3731 DATA  LDXZ, 251
+3732 DATA  LDYZ, 252
+3733 DATA  RTS
+3799 REM
+3800 DATA 'ATOI
+3801 REM
+3802 REM X/Y  IN:  PTR TO STR
+3803 REM X/Y  OUT: RESULT
+3804 REM A    OUT: LEN CONSUMED
+3805 REM
+3806 REM CLOBBERS: 215, 251-254
+3807 REM
+3810 DATA  STXZ, 251
+3811 DATA  STYZ, 252
+3820 DATA  LDX#, 0
+3821 DATA  LDY#, 0
+3825 DATA  STXZ, 253
+3826 DATA  STXZ, 254
+3830 DATA 'AI1
+3840 DATA  LDA(Y, 251
+3841 DATA  BEQR, AI2
+3849 REM
+3850 DATA  CMP#, 48:   REM "0"
+3851 DATA  BMIR, AI2
+3860 DATA  CMP#, 58:   REM "9"
+3861 DATA  BPLR, AI2
+3870 DATA  SEC
+3871 DATA  SBC#, 48
+3880 DATA  STAZ, 215:  REM SAVE DIGIT
+3885 DATA  LDAZ, 253:  REM SAVE VALUE
+3886 DATA  LDXZ, 254
+3890 DATA  ASLZ, 253:  REM DBL   2X
+3891 DATA  ROLZ, 254
+3892 DATA  ASLZ, 253:  REM DBL   4X
+3893 DATA  ROLZ, 254
+3900 DATA  CLC:        REM ADD   5X
+3901 DATA  ADCZ, 253
+3902 DATA  STAZ, 253
+3903 DATA  TXA
+3904 DATA  ADCZ, 254
+3905 DATA  STAZ, 254
+3910 DATA  ASLZ, 253:  REM DBL  10X
+3911 DATA  ROLZ, 254
+3920 DATA  CLC:        REM ADD DIGIT
+3921 DATA  LDAZ, 215
+3922 DATA  ADCZ, 253
+3923 DATA  STAZ, 253
+3924 DATA  BCCR, AI3
+3925 DATA  INCZ, 254
+3926 DATA 'AI3
+3930 DATA  INY
+3940 DATA  BNER, AI1
+3950 DATA 'AI2
+3955 DATA  TYA
+3956 DATA  LDXZ, 253
+3957 DATA  LDYZ, 254
+3960 DATA  RTS
+3999 REM
+4000 DATA 'READNAT
+4001 REM
+4002 REM X/Y  OUT: RESULT
+4003 REM A    OUT: LENGTH CONSUMED
+4004 REM
+4010 DATA  LDX#, BUF
+4011 DATA  LDY#, $C7: REM XXX HI
+4020 DATA  JSR, GETSTR
+4025 DATA  JSR, ATOI
+4026 DATA  CMP#, 0:   REM LEN -> FLAGS
+4030 DATA  RTS
+4099 REM
+4100 DATA 'MEMCPY
+4101 REM
+4102 REM 251-252  IN: DST POINTER
+4103 REM 253-254  IN: SRC POINTER
+4104 REM X/Y      IN: LEN X=MSB!
+4105 REM
+4106 REM CLOBBERS: A, X, Y, 2, 251-254
+4107 REM
+4110 DATA  CPY#, 0
+4111 DATA  BEQR, MC2
+4115 DATA  STYZ, 2:  REM SAVE LO(LEN)
+4120 DATA 'MC1
+4130 DATA  DEY
+4140 DATA  LDA(Y, 253
+4141 DATA  STA(Y, 251
+4150 DATA  CPY#, 0
+4151 DATA  BNER, MC1
+4155 DATA  CLC
+4156 DATA  LDAZ, 251
+4157 DATA  ADCZ, 2
+4158 DATA  STAZ, 251
+4159 DATA  LDAZ, 252
+4160 DATA  ADC#, 0
+4161 DATA  STAZ, 252
+4162 DATA  CLC
+4163 DATA  LDAZ, 253
+4164 DATA  ADCZ, 2
+4165 DATA  STAZ, 253
+4166 DATA  LDAZ, 254
+4167 DATA  ADC#, 0
+4168 DATA  STAZ, 254
+4170 DATA 'MC2
+4175 DATA  CPX#, 0
+4176 DATA  BEQR, MC3
+4180 DATA  DEX
+4181 DATA  INCZ, 252
+4182 DATA  INCZ, 254
+4185 DATA  JMP, MC1
+4190 DATA 'MC3
+4195 DATA  RTS
 4999 REM
 5000 DATA 'LINECUT
-5001 DATA  LDX#, BUF
-5002 DATA  LDY#, $C7: REM XXX HI
-5010 DATA  JSR, GETSTR
-5020 DATA  LDA#, 13
-5030 DATA  JSR, $FFD2
-5035 DATA  LDX#, BUF
-5036 DATA  LDY#, $C7: REM XXX HI
-5040 DATA  JSR, PUTSTR
-5050 DATA  RTS
+5010 DATA  LDX#, S.START
+5011 DATA  LDY#, $C5: REM XXX HI
+5012 DATA  JSR, PUTSTR
+5020 DATA  JSR, READNAT
+5021 DATA  STX, NSTART
+5022 DATA  STY, $C40D: REM XXX +
+5030 DATA  LDX#, S.STOP
+5031 DATA  LDY#, $C5: REM XXX HI
+5032 DATA  JSR, PUTSTR
+5040 DATA  JSR, READNAT
+5041 DATA  STX, NSTOP
+5042 DATA  STY, $C40F: REM XXX +
+5049 REM ABORT IF NSTOP <= NSTART
+5050 DATA  CPY, $C40D: REM XXX NSTART+
+5051 DATA  BMIR, LCU1
+5052 DATA  BNER, LCU2
+5053 DATA  CPX, NSTART
+5054 DATA  BMIR, LCU1
+5055 DATA  BNER, LCU2
+5056 DATA 'LCU1
+5058 DATA  RTS
+5059 DATA 'LCU2
+5060 REM LOCATE START -> PTR IN 251
+5070 DATA  LDXZ, 43:   REM TXTTAB
+5071 DATA  LDYZ, 44
+5080 DATA  STXZ, 251
+5081 DATA  STYZ, 252
+5089 DATA 'LCU3
+5090 DATA  LDY#, 1: REM OFFS PNEXT + 1
+5091 DATA  LDA(Y, 251
+5092 DATA  BEQR, LCU1: REM NOT FOUND
+5100 DATA  LDY#, 3: REM OFFS LINENO + 1
+5101 DATA  LDA(Y, 251
+5102 DATA  CMP, $C40D: REM XXX NSTART+
+5103 DATA  BMIR, LCU4
+5104 DATA  BNER, LCU5
+5105 DATA  DEY
+5106 DATA  LDA(Y, 251
+5107 DATA  CMP, NSTART
+5108 DATA  BMIR, LCU4
+5109 DATA  JMP, LCU5
+5110 DATA 'LCU4:       REM NEXT LINE
+5111 DATA  LDY#, 0
+5112 DATA  LDA(Y, 251
+5113 DATA  TAX
+5114 DATA  INY
+5115 DATA  LDA(Y, 251
+5116 DATA  STXZ, 251
+5117 DATA  STAZ, 252
+5120 DATA  JMP, LCU3
+5130 DATA 'LCU5:       REM PSTART FOUND
+5160 REM LOCATE STOP LINE -> PTR IN 253
+5170 DATA  LDXZ, 251
+5171 DATA  LDYZ, 252
+5180 DATA  STXZ, 253
+5181 DATA  STYZ, 254
+5189 DATA 'LCU6
+5190 DATA  LDY#, 1: REM OFFS PNEXT + 1
+5191 DATA  LDA(Y, 253
+5192 DATA  BEQR, LCU8: REM END OF PROG
+5200 DATA  LDY#, 3: REM OFFS LINENO + 1
+5201 DATA  LDA(Y, 253
+5202 DATA  CMP, $C40F: REM XXX NSTOP+
+5203 DATA  BMIR, LCU7
+5204 DATA  BNER, LCU8
+5205 DATA  DEY
+5206 DATA  LDA(Y, 253
+5207 DATA  CMP, NSTOP
+5208 DATA  BMIR, LCU7
+5209 DATA  JMP, LCU8
+5210 DATA 'LCU7:       REM NEXT LINE
+5211 DATA  LDY#, 0
+5212 DATA  LDA(Y, 253
+5213 DATA  TAX
+5214 DATA  INY
+5215 DATA  LDA(Y, 253
+5216 DATA  STXZ, 253
+5217 DATA  STAZ, 254
+5220 DATA  JMP, LCU6
+5230 DATA 'LCU8:       REM PSTOP FOUND
+5240 REM CALC DELTA=STOP-START -> 163
+5250 DATA  SEC
+5251 DATA  LDAZ, 253
+5252 DATA  SBCZ, 251
+5253 DATA  STA, DELTA
+5254 DATA  LDAZ, 254
+5255 DATA  SBCZ, 252
+5256 DATA  STA, $C411: REM XXX DELTA+
+5260 REM SCAN AFTER STOP, ADJUST PTRS
+5270 DATA  LDXZ, 253
+5271 DATA  LDYZ, 254
+5280 DATA  STX, TMP:   REM SAVE PSTOP
+5281 DATA  STY, $C413: REM XXX +
+5290 DATA 'LCU9
+5300 DATA  LDY#, 1
+5301 DATA  LDA(Y, 253
+5302 DATA  BEQR, LCU10: REM DONE
+5310 DATA  LDY#, 0
+5320 DATA  LDA(Y, 253
+5321 DATA  TAX:     REM SAVE LO(PNEXT)
+5330 DATA  SEC
+5331 DATA  SBC, DELTA
+5340 DATA  STA(Y, 253
+5341 DATA  INY
+5350 DATA  LDA(Y, 253
+5351 DATA  STAZ, 2: REM SAVE HI(PNEXT)
+5360 DATA  SBC, $C411: REM XXX DELTA+
+5370 DATA  STA(Y, 253
+5380 DATA  LDYZ, 2
+5381 DATA  STXZ, 253: REM NEXT LINE
+5382 DATA  STYZ, 254
+5390 DATA  JMP, LCU9
+5391 DATA 'LCU10
+5392 DATA  LDX, TMP: REM SAVED PSTOP
+5393 DATA  LDY, $C413: REM XXX +
+5394 DATA  STXZ, 253
+5395 DATA  STYZ, 254
+5400 REM COPY THE REMAINING DATA DOWN
+5410 DATA  SEC:    REM LEN=STREND-PSTOP
+5411 DATA  LDAZ, 49
+5412 DATA  SBCZ, 253
+5413 DATA  TAY:       REM Y = LO BYTE!
+5414 DATA  LDAZ, 50
+5415 DATA  SBCZ, 254
+5416 DATA  TAX:       REM X = HI BYTE!
+5420 DATA  JSR, MEMCPY
+5430 REM ADJUST VARTAB, ARYTAB, STREND
+5440 DATA  SEC
+5441 DATA  LDAZ, 45:  REM VARTAB
+5442 DATA  SBC, DELTA
+5443 DATA  STAZ, 45
+5444 DATA  LDAZ, 46
+5445 DATA  SBC, $C411: REM XXX +
+5446 DATA  STAZ, 46
+5450 DATA  SEC
+5451 DATA  LDAZ, 47:  REM ARYTAB
+5452 DATA  SBC, DELTA
+5453 DATA  STAZ, 47
+5454 DATA  LDAZ, 48
+5455 DATA  SBC, $C411: REM XXX +
+5456 DATA  STAZ, 48
+5460 DATA  SEC
+5461 DATA  LDAZ, 49:  REM STREND
+5462 DATA  SBC, DELTA
+5463 DATA  STAZ, 49
+5464 DATA  LDAZ, 50
+5465 DATA  SBC, $C411: REM XXX +
+5466 DATA  STAZ, 50
+5470 DATA  RTS
+5990 REM
+5995 DATA .=, $C880
+5999 REM
+6000 DATA 'LINECAT
+6010 DATA  LDX#, S.DRVBRA
+6011 DATA  LDY#, $C5: REM XXX HI
+6012 DATA  JSR, PUTSTR
+6013 DATA  LDAZ, 186: REM CURRENT DEV
+6014 DATA  CLC
+6015 DATA  ADC#, 48:  REM XXX PRINTBYTE
+6016 DATA  JSR, $FFD2: REM CHROUT
+6017 DATA  LDX#, S.KETCOL
+6018 DATA  LDY#, $C5: REM XXX HI
+6019 DATA  JSR, PUTSTR
+6020 DATA  JSR, READNAT
+6021 DATA  BNER, LCA1: REM LEN <> 0
+6022 DATA  LDXZ, 186:  REM DEFAULT
+6023 DATA 'LCA1
+6024 DATA  LDA#, 1:    REM FILE NO
+6025 DATA  LDY#, 0:    REM SEC ADDR
+6026 DATA  JSR, $FFBA: REM SETLFS
+6030 DATA  LDX#, S.FILE
+6031 DATA  LDY#, $C5: REM XXX HI
+6032 DATA  JSR, PUTSTR
+6033 DATA  LDX#, BUF
+6034 DATA  LDY#, $C7: REM XXX HI
+6035 DATA  JSR, GETSTR
+6037 DATA  JSR, $FFBD: REM SETNAM
+6040 DATA  SEC
+6041 DATA  LDAZ, 45:   REM VARTAB
+6042 DATA  SBC#, 2:    REM CUT NULL OFF
+6043 DATA  STAZ, 251:  REM PSTART
+6044 DATA  TAX
+6045 DATA  LDAZ, 46
+6046 DATA  SBC#, 0
+6047 DATA  STAZ, 252
+6048 DATA  TAY
+6049 DATA  LDA#, 0:    REM L/V
+6050 DATA  JSR, $FFD5: REM LOAD
+6051 DATA  BCCR, LCA1.1
+6052 DATA  LDA#, 1
+6053 DATA  JSR, $FFC3: REM CLOSE
+6054 DATA  RTS
+6060 DATA 'LCA1.1
+6061 DATA  STXZ, 253:  REM PSTOP
+6062 DATA  STYZ, 254
+6070 REM CHECK FOR LINE NUMBER CLASH
+6071 DATA  LDA#, 13
+6072 DATA  JSR, $FFD2: REM CHROUT
+6075 DATA  JMP, LCACHK
+6080 REM SCAN & RELINK LINES
+6081 DATA 'LCA2:      REM FOR EACH LINE
+6090 DATA  LDAZ, 252
+6091 DATA  CMPZ, 254
+6092 DATA  BMIR, LCA3
+6093 DATA  BNER, LCA4
+6094 DATA  LDAZ, 251
+6095 DATA  CMPZ, 253
+6096 DATA  BPLR, LCA4: REM PSTOP REACHD
+6097 DATA  LDY#, 1
+6098 DATA  LDA(Y, 251
+6099 DATA  BEQR, LCA4: REM PAST LAST LN
+6100 DATA  LDY#, 3
+6105 DATA 'LCA3:       REM SCAN FOR NUL
+6110 DATA  INY
+6120 DATA  LDA(Y, 251
+6121 DATA  BNER, LCA3: REM NEXT CHAR
+6122 DATA  INY:        REM GO PAST NUL
+6130 DATA  CLC:        REM ADV POINTER
+6131 DATA  TYA
+6132 DATA  ADCZ, 251
+6133 DATA  TAX
+6134 DATA  LDA#, 0
+6135 DATA  ADCZ, 252
+6140 DATA  LDY#, 1
+6141 DATA  STA(Y, 251
+6142 DATA  STAZ, 2:    REM SAVE HI BYTE
+6143 DATA  TXA
+6144 DATA  DEY
+6145 DATA  STA(Y, 251
+6146 DATA  LDYZ, 2
+6150 DATA  STXZ, 251
+6151 DATA  STYZ, 252
+6160 DATA  JMP, LCA2:  REM NEXT LINE
+6170 DATA 'LCA4
+6180 REM REWRITE TERMINATOR TO BE SAFE
+6181 DATA  LDA#, 0
+6182 DATA  TAY
+6183 DATA  STA(Y, 251
+6184 DATA  INY
+6185 DATA  STA(Y, 251
+6189 REM ADJUST VARTAB &C AND RET PSTOP
+6190 DATA  LDXZ, 253
+6191 DATA  LDYZ, 254
+6192 DATA  STXZ, 45:   REM VARTAB
+6193 DATA  STYZ, 46
+6194 DATA  STXZ, 47:   REM ARYTAB
+6195 DATA  STYZ, 48
+6196 DATA  STXZ, 49:   REM STREND
+6197 DATA  STYZ, 50
+6198 DATA  RTS
+6200 DATA 'LCACHK
+6210 REM FIND LAST LINE NUMBER
+6220 DATA  DECZ, 252
+6221 DATA  LDY#, 255
+6230 DATA 'LCAC1
+6240 DATA  DEY
+6250 DATA  LDA(Y, 251
+6260 DATA  BNER, LCAC1
+6270 DATA  INY
+6271 DATA  INY
+6272 DATA  INY
+6280 DATA  LDA(Y, 251
+6281 DATA  TAX
+6282 DATA  INY
+6283 DATA  LDA(Y, 251
+6290 DATA  INCZ, 252
+6291 DATA  LDY#, 3
+6300 DATA  CMP(Y, 251
+6301 DATA  BMIR, LCACOK
+6302 DATA  BNER, LCACFAIL
+6310 DATA  DEY
+6311 DATA  TXA
+6320 DATA  CMP(Y, 251
+6321 DATA  BMIR, LCACOK
+6330 DATA 'LCACFAIL
+6335 REM NULL OFF THE NEW LINES, ABORT
+6340 DATA  LDA#, 0
+6341 DATA  TAY
+6342 DATA  STA(Y, 251
+6343 DATA  INY
+6344 DATA  STA(Y, 251
+6350 DATA  LDX#, S.ECLASH
+6351 DATA  LDY#, $C5: REM XXX HI
+6352 DATA  JSR, PUTSTR
+6360 DATA  LDX#, S.ABORT
+6361 DATA  LDY#, $C5: REM XXX HI
+6362 DATA  JSR, PUTSTR
+6370 DATA  RTS
+6380 DATA 'LCACOK
+6390 DATA  JMP, LCA2
 8000 REM
 8001 REM - ENTRY POINTS -
 8002 REM
-8010 DATA .=,   50000:   REM $C350
+8010 DATA .=,   51200:   REM $C800
 8011 DATA  JMP, LINECNT
-8020 DATA .=,   50010
+8020 DATA .=,   51210
 8021 DATA  JMP, LINECUT
+8030 DATA .=,   51220
+8031 DATA  JMP, LINECAT
 9000 REM
 9001 REM - STATIC DATA -
 9002 REM
@@ -676,6 +1118,10 @@
 9040 DATA 'CNT.JUNK, .DW,0
 9050 DATA 'CNT.SPC,  .DW,0
 9060 DATA 'CNT.BS,   .DW,0
+9070 DATA 'NSTART,   .DW,0
+9071 DATA 'NSTOP,    .DW,0
+9072 DATA 'DELTA,    .DW,0
+9073 DATA 'TMP,      .DW,0
 9099 DATA .=, $C500
 9100 DATA 'S.REM,    .DSZ," REM  "
 9110 DATA 'S.DATA,   .DSZ," DATA  "
@@ -683,6 +1129,17 @@
 9130 DATA 'S.BYTES,  .DSZ," BYTES  "
 9140 DATA 'S.JUNK,   .DSZ," JUNK  "
 9150 DATA 'S.SPC,    .DSZ," SPC  "
-9200 DATA .=, $C700
-9210 DATA 'BUF,      .DZ,256
+9160 DATA 'S.START,  .DSZ,"START: "
+9170 DATA 'S.STOP,   .DSZ,"STOP: "
+9180 DATA 'S.FILE,   .DSZ,"FILE: "
+9190 DATA 'S.DRVBRA, .DSZ,"DRIVE ["
+9191 DATA 'S.KETCOL, .DSZ,"]: "
+9500 DATA 'S.ABORT
+9501 DATA  .DS, " - ABORT"
+9502 DATA  .DB, 13
+9503 DATA  .DB, 0
+9510 DATA 'S.ECLASH
+9511 DATA  .DSZ, "LINE NUMBER CLASH"
+9700 DATA .=, $C700
+9701 DATA 'BUF,      .DZ,256
 9999 DATA .END