Commit Diff


commit - 7889c72b765d5be3c74b02c0e6eaa2c2b5617b93
commit + 450286e314cf07530b6a8725bc7067b931fe18b0
blob - 143e4e55292eeace153b5dc41d4de2d974c90628
blob + d4e0ed969d1fa8a6067858f92b00864511750f4e
Binary files LINEUTIL.B,PRG and LINEUTIL.B,PRG differ
blob - e18f5e224f32a3f9ad284577c47d3c5a2b3a531c
blob + a03ee2ebab0443b9fb2f5d1f4abb5d02b8327ee0
--- LINEUTIL.B.lst
+++ LINEUTIL.B.lst
@@ -8,12 +8,13 @@
 1010 REM 1000 TOP COMMENT
 1011 REM 1100 SYMBOL DEFINITIONS
 1015 REM 1500 VARIABLES & STATIC DATA
-1020 REM 2000 LINECNT
-1030 REM 3000 SUBROUTINES
+1020 REM 2000 SUBROUTINES
+1030 REM 3000 LINECNT
 1050 REM 5000 LINECUT
 1060 REM 6000 LINECAT
 1064 REM 6400 LINECLP
 1066 REM 6600 LINECHG
+1090 REM 9000 BASIC STUB / LOADER
 1099 REM 9900 ENTRY POINTS
 1100 REM
 1101 REM - SYMBOL DEFINITIONS -
@@ -85,806 +86,808 @@
 1997 DATA .=,   50100: REM $C3B4
 1998 REM
 1999 REM
-2000 DATA 'LINECNT
-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
-2023 DATA  LDA(Y, P
-2024 DATA  BNER, NOTDONE
-2025 REM COUNT THE TERMINATING NULL PTR
-2026 DATA  CLC
-2027 DATA  LDA, CNT.JUNK
-2028 DATA  ADC#, 2
-2029 DATA  STA, CNT.JUNK
-2030 DATA  LDA, CNT.JUNK+
-2031 DATA  ADC#, 0
-2032 DATA  STA, CNT.JUNK+
-2034 DATA  JMP, DONE:  REM FAR BRANCH
-2035 DATA 'NOTDONE
-2040 DATA  INC, CNT
-2050 DATA  BNER, LC0
-2060 DATA  INC, CNT+
-2070 DATA 'LC0
-2080 REM COUNT DIFFERENT TYPES OF LINE
-2090 REM 1. SKIP SPACES (UNNECESSARY!?)
-2100 DATA  LDA#, 3:    REM FIRST CHR-1
-2101 DATA  TAY
-2105 DATA 'LC1
-2107 DATA  INY:        REM NEXT CHAR
-2110 DATA  LDA(Y, P:   REM LOAD CHAR
-2120 DATA  BEQR, NEXT: REM END OF LINE
-2130 DATA  CMP#, $20:  REM SPACE
-2140 DATA  BNER, LC1.1:REM EXIT LOOP
-2141 DATA  INC, CNT.SPC
-2142 DATA  BNER, LC1:  REM NO OVERFLOW
-2143 DATA  INC, CNT.SPC+
-2148 DATA  JMP, LC1:   REM REPEAT
-2149 DATA 'LC1.1
-2150 REM 2. CHECK TOKEN
-2160 DATA  CMP#, $8F:  REM REM-TOKEN
-2170 DATA  BNER, LC2
-2180 DATA  INC, CNT.REM
-2181 DATA  BNER, LC3
-2182 DATA  INC, CNT.REM+
-2183 DATA  JMP, LC3
-2190 DATA 'LC2
-2200 DATA  CMP#, $83:  REM DATA-TOKEN
-2210 DATA  BNER, LC3
-2220 DATA  INC, CNT.DATA
-2221 DATA  BNER, LC3
-2222 DATA  INC, CNT.DATA+
-2223 DATA  JMP, LC3
-2229 REM 3. SCAN REST OF LINE
-2230 DATA 'LC3
-2231 DATA  INY:        REM NEXT CHAR
-2232 DATA  LDA(Y, P:   REM LOAD CHAR
-2233 DATA  BEQR, NEXT: REM END OF LINE
-2235 DATA  CMP#, $20:  REM SPACE
-2240 DATA  BNER, LC3.1
-2241 DATA  INC, CNT.SPC
-2242 DATA  BNER, LC3
-2243 DATA  INC, CNT.SPC+
-2248 DATA  JMP, LC3
-2250 DATA 'LC3.1
-2251 DATA  CMP#, $22:  REM QUOTE (")
-2252 DATA  BNER, LC3
-2260 DATA 'LC3.2:      REM SKIP STRING
-2261 DATA  INY
-2262 DATA  LDA(Y, P:   REM LOAD NXT CHR
-2263 DATA  BEQR, NEXT: REM END OF LINE
-2265 DATA  CMP#, $22
-2266 DATA  BEQR, LC3:  REM QUOTE CLOSED
-2267 DATA  JMP, LC3.2
-2400 DATA 'NEXT
-2401 REM ACCUM. LINE LEN IN JUNK CTR
-2410 DATA  INY:  REM COUNT ZERO
-2411 DATA  TYA
-2412 DATA  CLC
-2413 DATA  ADC, CNT.JUNK
-2414 DATA  STA, CNT.JUNK
-2415 DATA  LDA#, 0
-2416 DATA  ADC, CNT.JUNK+
-2417 DATA  STA, CNT.JUNK+
-2420 REM ADVANCE (DEREF) LINE PTR
-2421 DATA  LDA#, 0
-2422 DATA  TAY
-2423 DATA  LDA(Y, P
-2425 DATA  TAX
-2426 DATA  INY
-2427 DATA  LDA(Y, P
-2428 DATA  TAY
-2430 DATA  STXZ, P
-2431 DATA  STYZ, P+
-2490 DATA  JMP, LOOP
-2500 DATA 'DONE
-2501 REM PUSH "P" (251) PAST THE END
-2502 DATA  CLC
-2503 DATA  LDAZ, P
-2504 DATA  ADC#, 2
-2505 DATA  STAZ, P
-2506 DATA  BCCR, DONE.1
-2507 DATA  INCZ, P+
-2508 DATA 'DONE.1
-2509 REM CALCULATE TOTAL BYTES
-2510 DATA  SEC
-2511 DATA  LDAZ, P
-2512 DATA  SBCZ, TXTTAB
-2513 DATA  STA, CNT.BS
-2514 DATA  LDAZ, P+
-2515 DATA  SBCZ, TXTTAB+
-2516 DATA  STA, CNT.BS+
-2520 REM CALCULATE JUNK = BS - "JUNK"
-2525 DATA  SEC
-2527 DATA  LDA, CNT.BS
-2530 DATA  SBC, CNT.JUNK
-2535 DATA  STA, CNT.JUNK
-2540 DATA  LDA, CNT.BS+
-2550 DATA  SBC, CNT.JUNK+
-2560 DATA  STA, CNT.JUNK+
-2600 REM PRINT COUNTERS AND EXIT
-2620 DATA  LDX, CNT
-2630 DATA  LDY, CNT+
-2640 DATA  JSR, PRINTNAT
-2650 DATA  LDX#, S.LINES
-2651 DATA  LDY#, S.LINES↑
-2652 DATA  JSR, PUTSTR
-2660 DATA  LDX, CNT.REM
-2661 DATA  LDY, CNT.REM+
-2662 DATA  JSR, PRINTNAT
-2670 DATA  LDX#, S.REM
-2671 DATA  LDY#, S.REM↑
-2672 DATA  JSR, PUTSTR
-2680 DATA  LDX, CNT.DATA
-2681 DATA  LDY, CNT.DATA+
-2682 DATA  JSR, PRINTNAT
-2690 DATA  LDX#, S.DATA
-2691 DATA  LDY#, S.DATA↑
-2692 DATA  JSR, PUTSTR
-2695 DATA  LDA#, 13: REM CR
-2696 DATA  JSR, CHROUT
-2700 DATA  LDX, CNT.BS
-2701 DATA  LDY, CNT.BS+
-2702 DATA  JSR, PRINTNAT
-2710 DATA  LDX#, S.BYTES
-2711 DATA  LDY#, S.BYTES↑
-2712 DATA  JSR, PUTSTR
-2720 DATA  LDX, CNT.SPC
-2721 DATA  LDY, CNT.SPC+
-2722 DATA  JSR, PRINTNAT
-2725 DATA  LDX#, S.SPC
-2726 DATA  LDY#, S.SPC↑
-2727 DATA  JSR, PUTSTR
-2730 DATA  LDX, CNT.JUNK
-2731 DATA  LDY, CNT.JUNK+
-2732 DATA  JSR, PRINTNAT
-2735 DATA  LDX#, S.JUNK
-2736 DATA  LDY#, S.JUNK↑
-2737 DATA  JSR, PUTSTR
-2990 DATA  LDA#, 13: REM CR
-2991 DATA  JMP, CHROUT
-3000 REM
-3001 REM - SUBROUTINES -
-3002 REM
-3031 REM 3100 PUTSTR, PUTISTR, PUT*LN
-3032 REM 3200 QUOTREM
-3034 REM 3400 PRINTNAT
-3036 REM 3600 GETSTR
-3037 REM 3750 CMPLINENO
-3038 REM 3800 ATOI
-3040 REM 4000 READNAT
-3041 REM 4100 MEMCPY
-3042 REM 4200 GETSTASTO
-3043 REM 4300 FINDLINE, FINDNEXT
-3044 REM 4400 GETFILE
-3045 REM 4500 FINDLAST,PUTNL,PRINTNATLN
-3046 REM 4600 DELTAPPLY
-3047 REM 4700 RELINK
-3048 REM 4800 GETSTASTOLINE
+2000 REM
+2001 REM - SUBROUTINES -
+2002 REM
+2021 REM 2100 MEMCPY
+2022 REM 2200 PUTSTR, PUTISTR, PUT*LN
+2023 REM 2300 QUOTREM
+2025 REM 2500 PRINTNAT
+2027 REM 2700 GETSTR
+2028 REM 2850 CMPLINENO
+2029 REM 2900 ATOI
+2031 REM 3100 READNAT
+2032 REM 3200 GETSTASTO
+2033 REM 3300 FINDLINE, FINDNEXT
+2034 REM 3400 GETFILE
+2035 REM 3500 FINDLAST,PUTNL,PRINTNATLN
+2036 REM 3600 DELTAPPLY
+2037 REM 3700 RELINK
+2038 REM 3800 GETSTASTOLINE
+2097 REM
+2098 REM NB: . = 50100 = 49152 + 848
+2099 REM       = $C3B4 = $C000 + $3B4
+2100 DATA 'MEMCPY
+2101 REM
+2102 REM P (251)  IN: DST POINTER
+2103 REM Q (253)  IN: SRC POINTER
+2104 REM Y.X      IN: LEN !X=MSB!
+2105 REM
+2106 REM CLOBBERS: A, X, Y, T, P, Q
+2107 REM
+2108 REM NB: OVERLAP OKAY IF DST < SRC
+2109 REM
+2110 DATA  STYZ, T:  REM SAVE LO(LEN)
+2111 DATA  LDY#, 0
+2115 DATA  CPX#, 0
+2116 DATA  BEQR, MC3
+2130 DATA 'MC2:      REM BLOCK COPY
+2140 DATA  LDA(Y, Q
+2141 DATA  STA(Y, P
+2142 DATA  INY
+2145 DATA  LDA(Y, Q: REM UNROLL (11%)
+2146 DATA  STA(Y, P
+2147 DATA  INY
+2150 DATA  BNER, MC2
+2160 DATA  INCZ, P+
+2161 DATA  INCZ, Q+
+2165 DATA  DEX
+2166 DATA  BNER, MC2
+2170 DATA 'MC3:      REM PARTIAL BLOCK
+2175 DATA  LDAZ, T:  REM LO(LEN)
+2176 DATA  BEQR, MCRET
+2180 DATA 'MC4
+2181 DATA  LDA(Y, Q
+2182 DATA  STA(Y, P
+2183 DATA  INY
+2184 DATA  CPYZ, T
+2185 DATA  BCCR, MC4
+2190 DATA 'MCRET
+2191 DATA  RTS
+2199 REM
+2200 DATA 'PUTSTR
+2201 REM
+2202 REM X.Y  IN:  PTR TO NULL-TERM STR
+2203 REM A    OUT: LENGTH OF STRING
+2204 REM
+2205 REM CLOBBERS: A, 251-252 (P)
+2206 REM
+2210 DATA  STXZ, P:   REM USER ZP AREA
+2211 DATA  STYZ, P+
+2215 DATA  LDY#, 0
+2220 DATA 'PSLOOP
+2225 DATA  LDA(Y, P
+2226 DATA  BEQR, PSEND
+2227 DATA  JSR, CHROUT
+2228 DATA  INY
+2229 DATA  JMP, PSLOOP
+2230 DATA 'PSEND
+2235 DATA  TYA
+2236 DATA  LDYZ, P+
+2237 DATA  RTS
+2239 REM
+2240 DATA 'PUTLN
+2241 DATA  LDA#, 13
+2242 DATA  JMP, CHROUT
+2243 REM
+2245 DATA 'PUTSTRLN
+2246 DATA  JSR, PUTSTR
+2247 DATA  JMP, PUTLN
+2248 REM
+2250 DATA 'PUTISTR
+2251 REM
+2252 REM PRINT A STRING IMM BEHIND THE
+2253 REM JSR. CONT AFTER THE NUL TERM.
+2254 REM
+2255 REM CLOBBERS: A, Y, P
+2256 REM
+2260 DATA  PLA:       REM LO BYTE
+2261 DATA  STAZ, P
+2262 DATA  PLA
+2263 DATA  STAZ, P+
+2264 DATA  LDY#, 1:   REM RET ADDR + 1
+2265 DATA  JSR, PSLOOP
+2268 DATA 'PISRET
+2269 REM PUSH ADDR OF NUL AND RETURN
+2270 DATA  CLC
+2271 DATA  ADCZ, P
+2272 DATA  TAX
+2273 DATA  TYA:       REM = P+
+2274 DATA  ADC#, 0
+2275 DATA  PHA
+2276 DATA  TXA
+2277 DATA  PHA
+2278 DATA  RTS
+2279 REM
+2280 DATA 'PUTISTRLN
+2281 DATA  PLA
+2282 DATA  STAZ, P
+2283 DATA  PLA
+2284 DATA  STAZ, P+
+2285 DATA  LDY#, 1
+2286 DATA  JSR, PSLOOP
+2290 DATA  TAX
+2291 DATA  JSR, PUTNL
+2292 DATA  TXA
+2295 DATA  JMP, PISRET
+2299 REM
+2300 DATA 'QUOTREM
+2301 REM
+2302 REM X.Y      DIVIDEND (X LO, Y HI)
+2303 REM 251.252  DIVISOR
+2304 REM A        RESULT: QUOTIENT
+2305 REM X.Y      RESULT: REMAINDER
+2306 REM
+2307 REM CLOBBERS: C, T
+2308 REM
+2309 REM
+2310 DATA  LDA#, 0
+2311 DATA  STAZ, T
+2320 DATA 'QR1
+2325 DATA  SEC
+2330 DATA  TXA
+2340 DATA  SBCZ, P
+2345 DATA  TAX
+2350 DATA  TYA
+2360 DATA  SBCZ, P+
+2365 DATA  TAY
+2370 DATA  BCCR, QR2
+2380 DATA  INCZ, T
+2390 DATA  JMP, QR1
+2400 DATA 'QR2
+2410 DATA  TXA
+2412 DATA  ADCZ, P
+2414 DATA  TAX
+2416 DATA  TYA
+2418 DATA  ADCZ, P+
+2420 DATA  TAY
+2422 DATA  LDAZ, T
+2423 DATA  CLC
+2424 DATA  RTS
+2490 REM
+2500 DATA 'PRINTNAT
+2501 REM
+2502 REM X.Y  IN: NUMBER TO PRINT
+2503 REM
+2504 REM CLOBBERS: A, X, Y, T, P
+2505 REM
+2510 DATA  LDA#, 10000
+2511 DATA  STAZ, P
+2512 DATA  LDA#, 10000↑
+2513 DATA  STAZ, P+
+2520 DATA  JSR, QUOTREM
+2530 DATA  ADC#, $30:   REM "0"
+2540 DATA  JSR, CHROUT
+2550 DATA  LDA#, 1000
+2551 DATA  STAZ, P
+2552 DATA  LDA#, 1000↑
+2553 DATA  STAZ, P+
+2560 DATA  JSR, QUOTREM
+2570 DATA  ADC#, $30
+2580 DATA  JSR, CHROUT
+2590 DATA  LDA#, 100
+2591 DATA  STAZ, P
+2592 DATA  LDA#, 0
+2593 DATA  STAZ, P+
+2600 DATA  JSR, QUOTREM
+2610 DATA  ADC#, $30
+2620 DATA  JSR, CHROUT
+2630 DATA  LDA#, 10
+2631 DATA  STAZ, P
+2632 DATA  LDA#, 0
+2633 DATA  STAZ, P+
+2640 DATA  JSR, QUOTREM
+2650 DATA  ADC#, $30
+2651 DATA  JSR, CHROUT
+2660 DATA  TXA
+2670 DATA  ADC#, $30
+2671 DATA  JSR, CHROUT
+2680 DATA  RTS
+2699 REM
+2700 DATA 'GETSTR
+2701 REM
+2702 REM X.Y  IN/OUT: PTR TO STR BUF
+2703 REM A    OUT:    LEN OF STRING
+2704 REM
+2705 REM CLOBBERS: T, P
+2706 REM
+2710 DATA  STXZ, P
+2711 DATA  STYZ, P+
+2720 DATA  LDY#, 0
+2725 DATA  STYZ, BLNSW: REM CURSOR ON
+2730 DATA 'GS1
+2735 DATA  STYZ, T:    REM SAVE Y
+2740 DATA  JSR, GETIN
+2741 DATA  BEQR, GS1
+2745 DATA  LDYZ, T:    REM RESTORE Y
+2750 DATA  CMP#, 13:   REM CR
+2751 DATA  BEQR, GS3
+2760 DATA  CMP#, 20:   REM DEL
+2761 DATA  BNER, GS2
+2770 DATA  TYA
+2771 DATA  BEQR, GS1
+2772 DATA  DEY
+2773 DATA  LDA#, 20
+2774 DATA  JSR, CHROUT
+2775 DATA  JMP, GS1
+2780 DATA 'GS2
+2781 DATA  CMP#, 32:   REM SPC
+2782 DATA  BCCR, GS1
+2783 DATA  CMP#, 127:  REM DEL
+2784 DATA  BCSR, GS1
+2790 DATA  STA(Y, P
+2791 DATA  INY
+2795 DATA  JSR, CHROUT
+2796 DATA  JMP, GS1
+2800 DATA 'GS3
+2810 DATA  LDA#, 0
+2820 DATA  STA(Y, P
+2821 DATA  STYZ, T
+2822 DATA  LDA#, 1
+2823 DATA  STAZ, BLNSW: REM CURSOR OFF
+2824 DATA  LDA#, 32:   REM ERASE CRSR
+2825 DATA  JSR, CHROUT
+2826 DATA  LDA#, 13
+2827 DATA  JSR, CHROUT
+2830 DATA  LDXZ, P
+2831 DATA  LDYZ, P+
+2832 DATA  LDAZ, T
+2833 DATA  RTS
+2849 REM
+2850 DATA 'CMPLINENO
+2851 REM
+2852 REM X.Y    IN: LINE NUMBER
+2853 REM P      IN: LINE POINTER
+2854 REM
+2855 REM CLOBBERS: Y, T
+2856 REM
+2860 DATA  STYZ, T
+2861 DATA  LDY#, 1:     REM HI(PNEXT)
+2862 DATA  LDA(Y, P
+2863 DATA  BNER, CLN1
+2864 DATA  CLC:         REM <
+2865 DATA  RTS
+2870 DATA 'CLN1
+2871 DATA  LDAZ, T
+2872 DATA  LDY#, 3
+2873 DATA  CMP(Y, P
+2874 DATA  BCCR, CLNRET
+2875 DATA  BNER, CLNRET
+2880 DATA  TXA
+2881 DATA  DEY
+2882 DATA  CMP(Y, P
+2890 DATA 'CLNRET
+2891 DATA  RTS
+2899 REM
+2900 DATA 'ATOI
+2901 REM
+2902 REM X.Y  IN:  PTR TO STR
+2903 REM X.Y  OUT: RESULT
+2904 REM A    OUT: LEN CONSUMED
+2905 REM
+2906 REM CLOBBERS: T, P, Q
+2907 REM
+2910 DATA  STXZ, P
+2911 DATA  STYZ, P+
+2920 DATA  LDX#, 0
+2921 DATA  LDY#, 0
+2925 DATA  STXZ, Q
+2926 DATA  STXZ, Q+
+2930 DATA 'AI1
+2940 DATA  LDA(Y, P
+2941 DATA  BEQR, AI2
+2949 REM
+2950 DATA  CMP#, 48:   REM "0"
+2951 DATA  BCCR, AI2
+2960 DATA  CMP#, 58:   REM "9"
+2961 DATA  BCSR, AI2
+2970 DATA  SEC
+2971 DATA  SBC#, 48
+2980 DATA  STAZ, T:    REM SAVE DIGIT
+2985 DATA  LDAZ, Q:    REM SAVE VALUE
+2986 DATA  LDXZ, Q+
+2990 DATA  ASLZ, Q:    REM DBL   2X
+2991 DATA  ROLZ, Q+
+2992 DATA  ASLZ, Q:    REM DBL   4X
+2993 DATA  ROLZ, Q+
+3000 DATA  CLC:        REM ADD   5X
+3001 DATA  ADCZ, Q
+3002 DATA  STAZ, Q
+3003 DATA  TXA
+3004 DATA  ADCZ, Q+
+3005 DATA  STAZ, Q+
+3010 DATA  ASLZ, Q:    REM DBL  10X
+3011 DATA  ROLZ, Q+
+3020 DATA  CLC:        REM ADD DIGIT
+3021 DATA  LDAZ, T
+3022 DATA  ADCZ, Q
+3023 DATA  STAZ, Q
+3024 DATA  BCCR, AI3
+3025 DATA  INCZ, Q+
+3026 DATA 'AI3
+3030 DATA  INY
+3040 DATA  BNER, AI1
+3050 DATA 'AI2
+3055 DATA  TYA
+3056 DATA  LDXZ, Q
+3057 DATA  LDYZ, Q+
+3060 DATA  RTS
 3099 REM
-3100 DATA 'PUTSTR
+3100 DATA 'READNAT
 3101 REM
-3102 REM X.Y  IN:  PTR TO NULL-TERM STR
-3103 REM A    OUT: LENGTH OF STRING
+3102 REM X.Y  OUT: RESULT
+3103 REM A    OUT: LENGTH CONSUMED
 3104 REM
-3105 REM CLOBBERS: A, 251-252 (P)
-3106 REM
-3110 DATA  STXZ, P:   REM USER ZP AREA
-3111 DATA  STYZ, P+
-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
+3110 DATA  LDX#, BUF
+3111 DATA  LDY#, BUF↑
+3120 DATA  JSR, GETSTR
+3125 DATA  JSR, ATOI
+3126 DATA  CMP#, 0:   REM LEN -> FLAGS
+3130 DATA  RTS
 3199 REM
-3200 DATA 'QUOTREM
+3200 DATA 'GETSTASTO
 3201 REM
-3202 REM X.Y      DIVIDEND (X LO, Y HI)
-3203 REM 251.252  DIVISOR
-3204 REM A        RESULT: QUOTIENT
-3205 REM X.Y      RESULT: REMAINDER
+3202 REM X.Y    OUT: NSTOP
+3203 REM C,Z    OUT: CMP NSTOP-NSTART
+3204 REM
+3205 REM CLOBBERS: A, X, Y, 2, P, Q
 3206 REM
-3207 REM CLOBBERS: C, T
-3208 REM
-3209 REM
-3210 DATA  LDA#, 0
-3211 DATA  STAZ, T
-3220 DATA 'QR1
-3225 DATA  SEC
-3230 DATA  TXA
-3240 DATA  SBCZ, P
-3245 DATA  TAX
-3250 DATA  TYA
-3260 DATA  SBCZ, P+
-3265 DATA  TAY
-3270 DATA  BCCR, QR2
-3280 DATA  INCZ, T
-3290 DATA  JMP, QR1
-3300 DATA 'QR2
-3310 DATA  TXA
-3312 DATA  ADCZ, P
-3314 DATA  TAX
-3316 DATA  TYA
-3318 DATA  ADCZ, P+
-3320 DATA  TAY
-3322 DATA  LDAZ, T
-3323 DATA  CLC
-3324 DATA  RTS
-3390 REM
-3400 DATA 'PRINTNAT
+3210 DATA  LDX#, S.START
+3211 DATA  LDY#, S.START↑
+3212 DATA  JSR, PUTSTR
+3220 DATA  JSR, READNAT
+3221 DATA  STX, NSTART
+3222 DATA  STY, NSTART+
+3230 DATA  LDX#, S.STOP
+3231 DATA  LDY#, S.STOP↑
+3232 DATA  JSR, PUTSTR
+3240 DATA  JSR, READNAT
+3241 DATA  STX, NSTOP
+3242 DATA  STY, NSTOP+
+3249 REM CMP NSTOP, NSTART
+3250 DATA  CPY, NSTART+
+3251 DATA  BCCR, GSS1
+3252 DATA  BNER, GSS1
+3253 DATA  CPX, NSTART
+3259 DATA 'GSS1
+3260 DATA  RTS
+3299 REM
+3300 DATA 'FINDLINE
+3301 REM
+3302 REM X.Y      IN: LINE NUMBER
+3303 REM X.Y     OUT: LINE POINTER
+3304 REM P (251) OUT: -"-
+3305 REM Q (253) OUT: PREV LINE (PTR)
+3306 REM
+3307 REM CLOBBERS: A, X, Y, P, Q, T, B
+3308 REM
+3310 DATA  LDAZ, TXTTAB
+3311 DATA  STAZ, P:    REM -> P
+3312 DATA  LDAZ, TXTTAB+
+3313 DATA  STAZ, P+
+3315 DATA  LDA#, 0:    REM PREV PTR
+3316 DATA  STAZ, Q
+3317 DATA  STAZ, Q+
+3319 REM ...
+3320 DATA 'FINDNEXT
+3321 REM
+3322 REM X.Y         IN: LINE NUMBER
+3323 REM X.Y        OUT: LINE POINTER
+3324 REM P (251) IN/OUT: -"-
+3325 REM Q (253) IN/OUT: PREV LINE PTR
+3326 REM
+3327 REM CLOBBERS: A, X, Y, P, Q, T, B
+3328 REM
+3330 DATA  STXZ, T
+3331 DATA  STYZ, B
+3340 DATA 'FN3
+3350 DATA  LDY#, 1:    REM -> PNEXT HI
+3351 DATA  LDA(Y, P
+3352 DATA  BEQR, FN5:  REM RETURN
+3360 DATA  LDY#, 3:    REM -> LINENO HI
+3361 DATA  LDA(Y, P
+3362 DATA  CMPZ, B:    REM HI BYTE
+3363 DATA  BCCR, FN4:  REM A < M
+3364 DATA  BNER, FN5:  REM A > M
+3365 DATA  DEY
+3366 DATA  LDA(Y, P
+3367 DATA  CMPZ, T:    REM LO BYTE
+3368 DATA  BCCR, FN4
+3369 DATA  JMP, FN5:   REM RETURN
+3370 DATA 'FN4:        REM NEXT LINE
+3375 DATA  LDXZ, P
+3376 DATA  LDYZ, P+
+3377 DATA  STXZ, Q
+3378 DATA  STYZ, Q+
+3380 DATA  LDY#, 0
+3381 DATA  LDA(Y, P
+3382 DATA  TAX
+3383 DATA  INY
+3384 DATA  LDA(Y, P
+3385 DATA  STXZ, P
+3386 DATA  STAZ, P+
+3389 DATA  JMP, FN3
+3390 DATA 'FN5
+3391 DATA  LDXZ, P
+3392 DATA  LDYZ, P+
+3393 DATA  RTS
+3399 REM
+3400 DATA 'GETFILE
 3401 REM
-3402 REM X.Y  IN: NUMBER TO PRINT
+3402 REM A   IN: LOGICAL FILE NUMBER
 3403 REM
-3404 REM CLOBBERS: A, X, Y, T, P
+3404 REM CLOBBERS: A,X,Y,T,P,Q
 3405 REM
-3410 DATA  LDA#, 10000
-3411 DATA  STAZ, P
-3412 DATA  LDA#, 10000↑
-3413 DATA  STAZ, P+
-3420 DATA  JSR, QUOTREM
-3430 DATA  ADC#, $30:   REM "0"
-3440 DATA  JSR, CHROUT
-3450 DATA  LDA#, 1000
-3451 DATA  STAZ, P
-3452 DATA  LDA#, 1000↑
-3453 DATA  STAZ, P+
-3460 DATA  JSR, QUOTREM
-3470 DATA  ADC#, $30
-3480 DATA  JSR, CHROUT
-3490 DATA  LDA#, 100
-3491 DATA  STAZ, P
-3492 DATA  LDA#, 0
-3493 DATA  STAZ, P+
-3500 DATA  JSR, QUOTREM
-3510 DATA  ADC#, $30
-3520 DATA  JSR, CHROUT
-3530 DATA  LDA#, 10
-3531 DATA  STAZ, P
-3532 DATA  LDA#, 0
-3533 DATA  STAZ, P+
-3540 DATA  JSR, QUOTREM
-3550 DATA  ADC#, $30
-3551 DATA  JSR, CHROUT
-3560 DATA  TXA
-3570 DATA  ADC#, $30
-3571 DATA  JSR, CHROUT
-3580 DATA  RTS
+3409 DATA  PHA:        REM SAVE FILE NO
+3410 DATA  LDX#, S.DRVBRA
+3411 DATA  LDY#, S.DRVBRA↑
+3412 DATA  JSR, PUTSTR
+3413 DATA  LDAZ, FA:  REM CURRENT DEV
+3414 DATA  CLC
+3415 DATA  ADC#, 48:  REM XXX PRINTBYTE
+3416 DATA  JSR, CHROUT
+3417 DATA  LDX#, S.KETCOL
+3418 DATA  LDY#, S.KETCOL↑
+3419 DATA  JSR, PUTSTR
+3420 DATA  JSR, READNAT
+3421 DATA  BNER, GF1:  REM LEN <> 0
+3422 DATA  LDXZ, FA:   REM DEFAULT
+3423 DATA 'GF1
+3424 DATA  PLA:        REM FILE NO
+3425 DATA  LDY#, 0:    REM SEC ADDR
+3426 DATA  JSR, SETLFS
+3430 DATA  LDX#, S.FILE
+3431 DATA  LDY#, S.FILE↑
+3432 DATA  JSR, PUTSTR
+3433 DATA  LDX#, BUF
+3434 DATA  LDY#, BUF↑
+3435 DATA  JSR, GETSTR
+3437 DATA  JSR, SETNAM
+3441 DATA  RTS
+3499 REM
+3500 DATA 'FINDLAST
+3501 REM
+3502 REM X.Y      OUT: PTR TO LAST LINE
+3503 REM P (251)  OUT: SAME
+3504 REM
+3505 REM CLOBBERS: A, X, Y, P, Q
+3506 REM
+3510 DATA  LDXZ, TXTTAB
+3511 DATA  LDYZ, TXTTAB+
+3512 DATA  STXZ, P
+3513 DATA  STYZ, P+
+3520 DATA  LDY#, 1
+3521 DATA  LDA(Y, P
+3522 DATA  BEQR, FL2:  REM EMPTY PRG
+3530 DATA 'FL1
+3531 DATA  LDY#, 0
+3532 DATA  LDA(Y, P
+3533 DATA  STAZ, Q
+3534 DATA  INY
+3535 DATA  LDA(Y, P
+3536 DATA  STAZ, Q+
+3540 DATA  LDA(Y, Q
+3541 DATA  BEQR, FL2
+3550 DATA  LDXZ, Q
+3551 DATA  LDYZ, Q+
+3552 DATA  STXZ, P
+3553 DATA  STYZ, P+
+3555 DATA  JMP, FL1
+3560 DATA 'FL2
+3570 DATA  LDXZ, P
+3571 DATA  LDYZ, P+
+3572 DATA  RTS
+3579 REM
+3580 DATA 'PUTNL
+3581 DATA  LDA#, 13
+3582 DATA  JMP, CHROUT
+3589 REM
+3590 DATA 'PRINTNATLN
+3591 DATA  JSR, PRINTNAT
+3592 DATA  JMP, PUTNL
 3599 REM
-3600 DATA 'GETSTR
+3600 DATA 'DELTAPPLY
 3601 REM
-3602 REM X.Y  IN/OUT: PTR TO STR BUF
-3603 REM A    OUT:    LEN OF STRING
-3604 REM
-3605 REM CLOBBERS: T, P
-3606 REM
-3610 DATA  STXZ, P
-3611 DATA  STYZ, P+
-3620 DATA  LDY#, 0
-3625 DATA  STYZ, BLNSW: REM CURSOR ON
-3630 DATA 'GS1
-3635 DATA  STYZ, T:    REM SAVE Y
-3640 DATA  JSR, GETIN
-3641 DATA  BEQR, GS1
-3645 DATA  LDYZ, T:    REM RESTORE Y
-3650 DATA  CMP#, 13:   REM CR
-3651 DATA  BEQR, GS3
-3660 DATA  CMP#, 20:   REM DEL
-3661 DATA  BNER, GS2
-3670 DATA  TYA
-3671 DATA  BEQR, GS1
-3672 DATA  DEY
-3673 DATA  LDA#, 20
-3674 DATA  JSR, CHROUT
-3675 DATA  JMP, GS1
-3680 DATA 'GS2
-3681 DATA  CMP#, 32:   REM SPC
-3682 DATA  BCCR, GS1
-3683 DATA  CMP#, 127:  REM DEL
-3684 DATA  BCSR, GS1
-3690 DATA  STA(Y, P
-3691 DATA  INY
-3695 DATA  JSR, CHROUT
-3696 DATA  JMP, GS1
-3700 DATA 'GS3
-3710 DATA  LDA#, 0
-3720 DATA  STA(Y, P
-3721 DATA  STYZ, T
-3722 DATA  LDA#, 1
-3723 DATA  STAZ, BLNSW: REM CURSOR OFF
-3724 DATA  LDA#, 32:   REM ERASE CRSR
-3725 DATA  JSR, CHROUT
-3726 DATA  LDA#, 13
-3727 DATA  JSR, CHROUT
-3730 DATA  LDXZ, P
-3731 DATA  LDYZ, P+
-3732 DATA  LDAZ, T
-3733 DATA  RTS
-3749 REM
-3750 DATA 'CMPLINENO
-3751 REM
-3752 REM X.Y    IN: LINE NUMBER
-3753 REM P      IN: LINE POINTER
-3754 REM
-3755 REM CLOBBERS: Y, T
-3756 REM
-3760 DATA  STYZ, T
-3761 DATA  LDY#, 1:     REM HI(PNEXT)
-3762 DATA  LDA(Y, P
-3763 DATA  BNER, CLN1
-3764 DATA  CLC:         REM <
-3765 DATA  RTS
-3770 DATA 'CLN1
-3771 DATA  LDAZ, T
-3772 DATA  LDY#, 3
-3773 DATA  CMP(Y, P
-3774 DATA  BCCR, CLNRET
-3775 DATA  BNER, CLNRET
-3780 DATA  TXA
-3781 DATA  DEY
-3782 DATA  CMP(Y, P
-3790 DATA 'CLNRET
+3602 REM P (251)  IN: PTR TO START LINE
+3603 REM X.Y      IN: PTR TO STOP  LINE
+3604 REM A        IN: OFFSET TO MODIFY
+3605 REM DELTA    IN: VALUE TO ADD
+3606 REM Q (253) OUT: COPY OF X.Y INPUT
+3607 REM
+3608 REM CLOBBERS: A,X,Y,P,Q,T,B
+3609 REM
+3610 DATA  STXZ, Q
+3611 DATA  STYZ, Q+
+3612 DATA  STAZ, B
+3620 DATA 'DEA1
+3630 DATA  LDAZ, P+
+3631 DATA  CMPZ, Q+
+3632 DATA  BCCR, DEA2: REM P < Q
+3633 DATA  BNER, DEA3: REM P > Q
+3634 DATA  LDAZ, P
+3635 DATA  CMPZ, Q
+3636 DATA  BCSR, DEA3
+3637 DATA 'DEA2
+3640 DATA  LDY#, 1
+3641 DATA  LDA(Y, P
+3642 DATA  BEQR, DEA3: REM DONE
+3645 DATA  STAZ, T: REM SAVE PNEXT (HI)
+3646 DATA  DEY
+3647 DATA  LDA(Y, P
+3648 DATA  TAX:     REM SAVE PNEXT (LO)
+3650 DATA  LDYZ, B
+3651 DATA  LDA(Y, P
+3660 DATA  CLC
+3661 DATA  ADC, DELTA
+3662 DATA  STA(Y, P
+3663 DATA  INY
+3664 DATA  LDA(Y, P
+3665 DATA  ADC, DELTA+
+3666 DATA  STA(Y, P
+3680 DATA  LDYZ, T
+3681 DATA  STXZ, P:   REM NEXT LINE
+3682 DATA  STYZ, P+
+3690 DATA  JMP, DEA1
+3691 DATA 'DEA3
+3692 DATA  RTS
+3699 REM
+3700 DATA 'RELINK
+3701 REM
+3702 REM P    IN: PTR TO START LINE
+3703 REM Q    IN: PTR TO STOP LINE
+3704 REM P   OUT: PTR BEYOND LAST LINE
+3705 REM
+3706 REM CLOBBERS: A, X, Y, T
+3709 REM
+3710 DATA 'RL1
+3711 DATA  LDAZ, P+
+3712 DATA  CMPZ, Q+
+3713 DATA  BCCR, RL2
+3714 DATA  BNER, RL4
+3715 DATA  LDAZ, P
+3716 DATA  CMPZ, Q
+3717 DATA  BCSR, RL4:  REM PSTOP REACHD
+3720 DATA 'RL2
+3721 DATA  LDY#, 1
+3722 DATA  LDA(Y, P
+3723 DATA  BEQR, RL4:  REM PAST LAST LN
+3725 DATA  LDY#, 3
+3730 DATA 'RL3:        REM SCAN FOR NUL
+3735 DATA  INY
+3740 DATA  LDA(Y, P
+3741 DATA  BNER, RL3:  REM NEXT CHAR
+3742 DATA  INY:        REM GO PAST NUL
+3750 DATA  CLC:        REM ADV POINTER
+3751 DATA  TYA
+3752 DATA  ADCZ, P
+3753 DATA  TAX
+3754 DATA  LDA#, 0
+3755 DATA  ADCZ, P+
+3760 DATA  LDY#, 1
+3761 DATA  STA(Y, P
+3762 DATA  STAZ, T:    REM SAVE HI BYTE
+3763 DATA  TXA
+3764 DATA  DEY
+3765 DATA  STA(Y, P
+3766 DATA  LDYZ, T
+3770 DATA  STXZ, P
+3771 DATA  STYZ, P+
+3780 DATA  JMP, RL1:   REM NEXT LINE
+3790 DATA 'RL4
 3791 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: T, P, Q
-3807 REM
-3810 DATA  STXZ, P
-3811 DATA  STYZ, P+
-3820 DATA  LDX#, 0
-3821 DATA  LDY#, 0
-3825 DATA  STXZ, Q
-3826 DATA  STXZ, Q+
-3830 DATA 'AI1
-3840 DATA  LDA(Y, P
-3841 DATA  BEQR, AI2
-3849 REM
-3850 DATA  CMP#, 48:   REM "0"
-3851 DATA  BCCR, AI2
-3860 DATA  CMP#, 58:   REM "9"
-3861 DATA  BCSR, AI2
-3870 DATA  SEC
-3871 DATA  SBC#, 48
-3880 DATA  STAZ, T:    REM SAVE DIGIT
-3885 DATA  LDAZ, Q:    REM SAVE VALUE
-3886 DATA  LDXZ, Q+
-3890 DATA  ASLZ, Q:    REM DBL   2X
-3891 DATA  ROLZ, Q+
-3892 DATA  ASLZ, Q:    REM DBL   4X
-3893 DATA  ROLZ, Q+
-3900 DATA  CLC:        REM ADD   5X
-3901 DATA  ADCZ, Q
-3902 DATA  STAZ, Q
-3903 DATA  TXA
-3904 DATA  ADCZ, Q+
-3905 DATA  STAZ, Q+
-3910 DATA  ASLZ, Q:    REM DBL  10X
-3911 DATA  ROLZ, Q+
-3920 DATA  CLC:        REM ADD DIGIT
-3921 DATA  LDAZ, T
-3922 DATA  ADCZ, Q
-3923 DATA  STAZ, Q
-3924 DATA  BCCR, AI3
-3925 DATA  INCZ, Q+
-3926 DATA 'AI3
-3930 DATA  INY
-3940 DATA  BNER, AI1
-3950 DATA 'AI2
-3955 DATA  TYA
-3956 DATA  LDXZ, Q
-3957 DATA  LDYZ, Q+
-3960 DATA  RTS
+3800 DATA 'GETSTASTOLINE
+3810 DATA  JSR, GETSTASTO
+3811 DATA  BCCR, GSL1: REM STOP < START
+3812 DATA  BNER, GSL2: REM      >
+3820 DATA 'GSL1
+3821 DATA  SEC:  REM NSTART >= NSTOP
+3822 DATA  RTS
+3825 DATA 'GSL2
+3830 REM LOCATE START LINE
+3831 DATA  LDX, NSTART
+3832 DATA  LDY, NSTART+
+3833 DATA  JSR, FINDLINE
+3834 DATA  STX, PSTART
+3835 DATA  STY, PSTART+
+3840 REM SAVE PTR TO PRECEEDING LINE
+3841 DATA  LDXZ, Q
+3842 DATA  LDYZ, Q+
+3843 DATA  STX, PPREV
+3844 DATA  STY, PPREV+
+3850 REM LOCATE STOP LINE
+3851 DATA  LDX, NSTOP
+3852 DATA  LDY, NSTOP+
+3853 DATA  JSR, FINDNEXT
+3854 DATA  STX, PSTOP
+3855 DATA  STY, PSTOP+
+3860 REM SAVE PTR TO LAST LINE
+3861 DATA  LDXZ, Q
+3862 DATA  LDYZ, Q+
+3863 DATA  STX, PLAST
+3864 DATA  STY, PLAST+
+3870 REM CALC. DELTA = PSTART - PSTOP
+3871 DATA  SEC
+3872 DATA  LDA, PSTART
+3873 DATA  SBC, PSTOP
+3874 DATA  STA, DELTA
+3875 DATA  LDA, PSTART+
+3876 DATA  SBC, PSTOP+
+3877 DATA  STA, DELTA+
+3880 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#, BUF↑
-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 P (251)  IN: DST POINTER
-4103 REM Q (253)  IN: SRC POINTER
-4104 REM Y.X      IN: LEN !X=MSB!
-4105 REM
-4106 REM CLOBBERS: A, X, Y, T, P, Q
-4107 REM
-4108 REM NB: OVERLAP OKAY IF DST < SRC
-4109 REM
-4110 DATA  STYZ, T:  REM SAVE LO(LEN)
-4111 DATA  LDY#, 0
-4115 DATA  CPX#, 0
-4116 DATA  BEQR, MC3
-4130 DATA 'MC2:      REM BLOCK COPY
-4140 DATA  LDA(Y, Q
-4141 DATA  STA(Y, P
-4142 DATA  INY
-4145 DATA  LDA(Y, Q: REM UNROLL (11%)
-4146 DATA  STA(Y, P
-4147 DATA  INY
-4150 DATA  BNER, MC2
-4160 DATA  INCZ, P+
-4161 DATA  INCZ, Q+
-4165 DATA  DEX
-4166 DATA  BNER, MC2
-4170 DATA 'MC3:      REM PARTIAL BLOCK
-4175 DATA  LDAZ, T:  REM LO(LEN)
-4176 DATA  BEQR, MCRET
-4180 DATA 'MC4
-4181 DATA  LDA(Y, Q
-4182 DATA  STA(Y, P
-4183 DATA  INY
-4184 DATA  CPYZ, T
-4185 DATA  BCCR, MC4
-4190 DATA 'MCRET
-4191 DATA  RTS
-4199 REM
-4200 DATA 'GETSTASTO
-4201 REM
-4202 REM X.Y    OUT: NSTOP
-4203 REM C,Z    OUT: CMP NSTOP-NSTART
-4204 REM
-4205 REM CLOBBERS: A, X, Y, 2, P, Q
-4206 REM
-4210 DATA  LDX#, S.START
-4211 DATA  LDY#, S.START↑
-4212 DATA  JSR, PUTSTR
-4220 DATA  JSR, READNAT
-4221 DATA  STX, NSTART
-4222 DATA  STY, NSTART+
-4230 DATA  LDX#, S.STOP
-4231 DATA  LDY#, S.STOP↑
-4232 DATA  JSR, PUTSTR
-4240 DATA  JSR, READNAT
-4241 DATA  STX, NSTOP
-4242 DATA  STY, NSTOP+
-4249 REM CMP NSTOP, NSTART
-4250 DATA  CPY, NSTART+
-4251 DATA  BCCR, GSS1
-4252 DATA  BNER, GSS1
-4253 DATA  CPX, NSTART
-4259 DATA 'GSS1
-4260 DATA  RTS
-4299 REM
-4300 DATA 'FINDLINE
-4301 REM
-4302 REM X.Y      IN: LINE NUMBER
-4303 REM X.Y     OUT: LINE POINTER
-4304 REM P (251) OUT: -"-
-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 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, 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, T:    REM LO BYTE
-4368 DATA  BCCR, FN4
-4369 DATA  JMP, FN5:   REM RETURN
-4370 DATA 'FN4:        REM NEXT LINE
-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+
-4393 DATA  RTS
-4399 REM
-4400 DATA 'GETFILE
-4401 REM
-4402 REM A   IN: LOGICAL FILE NUMBER
-4403 REM
-4404 REM CLOBBERS: A,X,Y,T,P,Q
-4405 REM
-4409 DATA  PHA:        REM SAVE FILE NO
-4410 DATA  LDX#, S.DRVBRA
-4411 DATA  LDY#, S.DRVBRA↑
-4412 DATA  JSR, PUTSTR
-4413 DATA  LDAZ, FA:  REM CURRENT DEV
-4414 DATA  CLC
-4415 DATA  ADC#, 48:  REM XXX PRINTBYTE
-4416 DATA  JSR, CHROUT
-4417 DATA  LDX#, S.KETCOL
-4418 DATA  LDY#, S.KETCOL↑
-4419 DATA  JSR, PUTSTR
-4420 DATA  JSR, READNAT
-4421 DATA  BNER, GF1:  REM LEN <> 0
-4422 DATA  LDXZ, FA:   REM DEFAULT
-4423 DATA 'GF1
-4424 DATA  PLA:        REM FILE NO
-4425 DATA  LDY#, 0:    REM SEC ADDR
-4426 DATA  JSR, SETLFS
-4430 DATA  LDX#, S.FILE
-4431 DATA  LDY#, S.FILE↑
-4432 DATA  JSR, PUTSTR
-4433 DATA  LDX#, BUF
-4434 DATA  LDY#, BUF↑
-4435 DATA  JSR, GETSTR
-4437 DATA  JSR, SETNAM
-4441 DATA  RTS
-4499 REM
-4500 DATA 'FINDLAST
-4501 REM
-4502 REM X.Y      OUT: PTR TO LAST LINE
-4503 REM P (251)  OUT: SAME
-4504 REM
-4505 REM CLOBBERS: A, X, Y, P, Q
-4506 REM
-4510 DATA  LDXZ, TXTTAB
-4511 DATA  LDYZ, TXTTAB+
-4512 DATA  STXZ, P
-4513 DATA  STYZ, P+
-4520 DATA  LDY#, 1
-4521 DATA  LDA(Y, P
-4522 DATA  BEQR, FL2:  REM EMPTY PRG
-4530 DATA 'FL1
-4531 DATA  LDY#, 0
-4532 DATA  LDA(Y, P
-4533 DATA  STAZ, Q
-4534 DATA  INY
-4535 DATA  LDA(Y, P
-4536 DATA  STAZ, Q+
-4540 DATA  LDA(Y, Q
-4541 DATA  BEQR, FL2
-4550 DATA  LDXZ, Q
-4551 DATA  LDYZ, Q+
-4552 DATA  STXZ, P
-4553 DATA  STYZ, P+
-4555 DATA  JMP, FL1
-4560 DATA 'FL2
-4570 DATA  LDXZ, P
-4571 DATA  LDYZ, P+
-4572 DATA  RTS
-4579 REM
-4580 DATA 'PUTNL
-4581 DATA  LDA#, 13
-4582 DATA  JMP, CHROUT
-4589 REM
-4590 DATA 'PRINTNATLN
-4591 DATA  JSR, PRINTNAT
-4592 DATA  JMP, PUTNL
-4599 REM
-4600 DATA 'DELTAPPLY
-4601 REM
-4602 REM P (251)  IN: PTR TO START LINE
-4603 REM X.Y      IN: PTR TO STOP  LINE
-4604 REM A        IN: OFFSET TO MODIFY
-4605 REM DELTA    IN: VALUE TO ADD
-4606 REM Q (253) OUT: COPY OF X.Y INPUT
-4607 REM
-4608 REM CLOBBERS: A,X,Y,P,Q,T,B
-4609 REM
-4610 DATA  STXZ, Q
-4611 DATA  STYZ, Q+
-4612 DATA  STAZ, B
-4620 DATA 'DEA1
-4630 DATA  LDAZ, P+
-4631 DATA  CMPZ, Q+
-4632 DATA  BCCR, DEA2: REM P < Q
-4633 DATA  BNER, DEA3: REM P > Q
-4634 DATA  LDAZ, P
-4635 DATA  CMPZ, Q
-4636 DATA  BCSR, DEA3
-4637 DATA 'DEA2
-4640 DATA  LDY#, 1
-4641 DATA  LDA(Y, P
-4642 DATA  BEQR, DEA3: REM DONE
-4645 DATA  STAZ, T: REM SAVE PNEXT (HI)
-4646 DATA  DEY
-4647 DATA  LDA(Y, P
-4648 DATA  TAX:     REM SAVE PNEXT (LO)
-4650 DATA  LDYZ, B
-4651 DATA  LDA(Y, P
-4660 DATA  CLC
-4661 DATA  ADC, DELTA
-4662 DATA  STA(Y, P
-4663 DATA  INY
-4664 DATA  LDA(Y, P
-4665 DATA  ADC, DELTA+
-4666 DATA  STA(Y, P
-4680 DATA  LDYZ, T
-4681 DATA  STXZ, P:   REM NEXT LINE
-4682 DATA  STYZ, P+
-4690 DATA  JMP, DEA1
-4691 DATA 'DEA3
-4692 DATA  RTS
-4699 REM
-4700 DATA 'RELINK
-4701 REM
-4702 REM P    IN: PTR TO START LINE
-4703 REM Q    IN: PTR TO STOP LINE
-4704 REM P   OUT: PTR BEYOND LAST LINE
-4705 REM
-4706 REM CLOBBERS: A, X, Y, T
-4709 REM
-4710 DATA 'RL1
-4711 DATA  LDAZ, P+
-4712 DATA  CMPZ, Q+
-4713 DATA  BCCR, RL2
-4714 DATA  BNER, RL4
-4715 DATA  LDAZ, P
-4716 DATA  CMPZ, Q
-4717 DATA  BCSR, RL4:  REM PSTOP REACHD
-4720 DATA 'RL2
-4721 DATA  LDY#, 1
-4722 DATA  LDA(Y, P
-4723 DATA  BEQR, RL4:  REM PAST LAST LN
-4725 DATA  LDY#, 3
-4730 DATA 'RL3:        REM SCAN FOR NUL
-4735 DATA  INY
-4740 DATA  LDA(Y, P
-4741 DATA  BNER, RL3:  REM NEXT CHAR
-4742 DATA  INY:        REM GO PAST NUL
-4750 DATA  CLC:        REM ADV POINTER
-4751 DATA  TYA
-4752 DATA  ADCZ, P
-4753 DATA  TAX
-4754 DATA  LDA#, 0
-4755 DATA  ADCZ, P+
-4760 DATA  LDY#, 1
-4761 DATA  STA(Y, P
-4762 DATA  STAZ, T:    REM SAVE HI BYTE
-4763 DATA  TXA
-4764 DATA  DEY
-4765 DATA  STA(Y, P
-4766 DATA  LDYZ, T
-4770 DATA  STXZ, P
-4771 DATA  STYZ, P+
-4780 DATA  JMP, RL1:   REM NEXT LINE
-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+
-4850 REM LOCATE STOP LINE
-4851 DATA  LDX, NSTOP
-4852 DATA  LDY, NSTOP+
-4853 DATA  JSR, FINDNEXT
-4854 DATA  STX, PSTOP
-4855 DATA  STY, PSTOP+
-4860 REM SAVE PTR TO LAST LINE
-4861 DATA  LDXZ, Q
-4862 DATA  LDYZ, Q+
-4863 DATA  STX, PLAST
-4864 DATA  STY, PLAST+
-4870 REM CALC. DELTA = PSTART - PSTOP
-4871 DATA  SEC
-4872 DATA  LDA, PSTART
-4873 DATA  SBC, PSTOP
-4874 DATA  STA, DELTA
-4875 DATA  LDA, PSTART+
-4876 DATA  SBC, PSTOP+
-4877 DATA  STA, DELTA+
-4880 DATA  RTS
-4999 REM
+4000 DATA 'LINECNT
+4005 DATA  LDXZ, TXTTAB
+4006 DATA  LDYZ, TXTTAB+
+4007 DATA  STXZ, P
+4008 DATA  STYZ, P+
+4009 DATA  LDA#, 0
+4010 DATA  STA, CNT
+4011 DATA  STA, CNT+
+4012 DATA  STA, CNT.REM
+4013 DATA  STA, CNT.REM+
+4014 DATA  STA, CNT.DATA
+4015 DATA  STA, CNT.DATA+
+4016 DATA  STA, CNT.JUNK
+4017 DATA  STA, CNT.JUNK+
+4018 DATA  STA, CNT.SPC
+4019 DATA  STA, CNT.SPC+
+4020 DATA 'LOOP
+4021 DATA  LDA#, 1
+4022 DATA  TAY
+4023 DATA  LDA(Y, P
+4024 DATA  BNER, NOTDONE
+4025 REM COUNT THE TERMINATING NULL PTR
+4026 DATA  CLC
+4027 DATA  LDA, CNT.JUNK
+4028 DATA  ADC#, 2
+4029 DATA  STA, CNT.JUNK
+4030 DATA  LDA, CNT.JUNK+
+4031 DATA  ADC#, 0
+4032 DATA  STA, CNT.JUNK+
+4034 DATA  JMP, DONE:  REM FAR BRANCH
+4035 DATA 'NOTDONE
+4040 DATA  INC, CNT
+4050 DATA  BNER, LC0
+4060 DATA  INC, CNT+
+4070 DATA 'LC0
+4080 REM COUNT DIFFERENT TYPES OF LINE
+4090 REM 1. SKIP SPACES (UNNECESSARY!?)
+4100 DATA  LDA#, 3:    REM FIRST CHR-1
+4101 DATA  TAY
+4105 DATA 'LC1
+4107 DATA  INY:        REM NEXT CHAR
+4110 DATA  LDA(Y, P:   REM LOAD CHAR
+4120 DATA  BEQR, NEXT: REM END OF LINE
+4130 DATA  CMP#, $20:  REM SPACE
+4140 DATA  BNER, LC1.1:REM EXIT LOOP
+4141 DATA  INC, CNT.SPC
+4142 DATA  BNER, LC1:  REM NO OVERFLOW
+4143 DATA  INC, CNT.SPC+
+4148 DATA  JMP, LC1:   REM REPEAT
+4149 DATA 'LC1.1
+4150 REM 2. CHECK TOKEN
+4160 DATA  CMP#, $8F:  REM REM-TOKEN
+4170 DATA  BNER, LC2
+4180 DATA  INC, CNT.REM
+4181 DATA  BNER, LC3
+4182 DATA  INC, CNT.REM+
+4183 DATA  JMP, LC3
+4190 DATA 'LC2
+4200 DATA  CMP#, $83:  REM DATA-TOKEN
+4210 DATA  BNER, LC3
+4220 DATA  INC, CNT.DATA
+4221 DATA  BNER, LC3
+4222 DATA  INC, CNT.DATA+
+4223 DATA  JMP, LC3
+4229 REM 3. SCAN REST OF LINE
+4230 DATA 'LC3
+4231 DATA  INY:        REM NEXT CHAR
+4232 DATA  LDA(Y, P:   REM LOAD CHAR
+4233 DATA  BEQR, NEXT: REM END OF LINE
+4235 DATA  CMP#, $20:  REM SPACE
+4240 DATA  BNER, LC3.1
+4241 DATA  INC, CNT.SPC
+4242 DATA  BNER, LC3
+4243 DATA  INC, CNT.SPC+
+4248 DATA  JMP, LC3
+4250 DATA 'LC3.1
+4251 DATA  CMP#, $22:  REM QUOTE (")
+4252 DATA  BNER, LC3
+4260 DATA 'LC3.2:      REM SKIP STRING
+4261 DATA  INY
+4262 DATA  LDA(Y, P:   REM LOAD NXT CHR
+4263 DATA  BEQR, NEXT: REM END OF LINE
+4265 DATA  CMP#, $22
+4266 DATA  BEQR, LC3:  REM QUOTE CLOSED
+4267 DATA  JMP, LC3.2
+4400 DATA 'NEXT
+4401 REM ACCUM. LINE LEN IN JUNK CTR
+4410 DATA  INY:  REM COUNT ZERO
+4411 DATA  TYA
+4412 DATA  CLC
+4413 DATA  ADC, CNT.JUNK
+4414 DATA  STA, CNT.JUNK
+4415 DATA  LDA#, 0
+4416 DATA  ADC, CNT.JUNK+
+4417 DATA  STA, CNT.JUNK+
+4420 REM ADVANCE (DEREF) LINE PTR
+4421 DATA  LDA#, 0
+4422 DATA  TAY
+4423 DATA  LDA(Y, P
+4425 DATA  TAX
+4426 DATA  INY
+4427 DATA  LDA(Y, P
+4428 DATA  TAY
+4430 DATA  STXZ, P
+4431 DATA  STYZ, P+
+4490 DATA  JMP, LOOP
+4500 DATA 'DONE
+4501 REM PUSH "P" (251) PAST THE END
+4502 DATA  CLC
+4503 DATA  LDAZ, P
+4504 DATA  ADC#, 2
+4505 DATA  STAZ, P
+4506 DATA  BCCR, DONE.1
+4507 DATA  INCZ, P+
+4508 DATA 'DONE.1
+4509 REM CALCULATE TOTAL BYTES
+4510 DATA  SEC
+4511 DATA  LDAZ, P
+4512 DATA  SBCZ, TXTTAB
+4513 DATA  STA, CNT.BS
+4514 DATA  LDAZ, P+
+4515 DATA  SBCZ, TXTTAB+
+4516 DATA  STA, CNT.BS+
+4520 REM CALCULATE JUNK = BS - "JUNK"
+4525 DATA  SEC
+4527 DATA  LDA, CNT.BS
+4530 DATA  SBC, CNT.JUNK
+4535 DATA  STA, CNT.JUNK
+4540 DATA  LDA, CNT.BS+
+4550 DATA  SBC, CNT.JUNK+
+4560 DATA  STA, CNT.JUNK+
+4600 REM PRINT COUNTERS AND EXIT
+4620 DATA  LDX, CNT
+4630 DATA  LDY, CNT+
+4640 DATA  JSR, PRINTNAT
+4650 DATA  LDX#, S.LINES
+4651 DATA  LDY#, S.LINES↑
+4652 DATA  JSR, PUTSTR
+4660 DATA  LDX, CNT.REM
+4661 DATA  LDY, CNT.REM+
+4662 DATA  JSR, PRINTNAT
+4670 DATA  LDX#, S.REM
+4671 DATA  LDY#, S.REM↑
+4672 DATA  JSR, PUTSTR
+4680 DATA  LDX, CNT.DATA
+4681 DATA  LDY, CNT.DATA+
+4682 DATA  JSR, PRINTNAT
+4690 DATA  LDX#, S.DATA
+4691 DATA  LDY#, S.DATA↑
+4692 DATA  JSR, PUTSTR
+4695 DATA  LDA#, 13: REM CR
+4696 DATA  JSR, CHROUT
+4700 DATA  LDX, CNT.BS
+4701 DATA  LDY, CNT.BS+
+4702 DATA  JSR, PRINTNAT
+4710 DATA  LDX#, S.BYTES
+4711 DATA  LDY#, S.BYTES↑
+4712 DATA  JSR, PUTSTR
+4720 DATA  LDX, CNT.SPC
+4721 DATA  LDY, CNT.SPC+
+4722 DATA  JSR, PRINTNAT
+4725 DATA  LDX#, S.SPC
+4726 DATA  LDY#, S.SPC↑
+4727 DATA  JSR, PUTSTR
+4730 DATA  LDX, CNT.JUNK
+4731 DATA  LDY, CNT.JUNK+
+4732 DATA  JSR, PRINTNAT
+4735 DATA  LDX#, S.JUNK
+4736 DATA  LDY#, S.JUNK↑
+4737 DATA  JSR, PUTSTR
+4990 DATA  LDA#, 13: REM CR
+4991 DATA  JMP, CHROUT
 5000 DATA 'LINECUT
 5001 DATA  JSR, PUTISTRLN
 5002 DATA .DSZ, "=DELETE LINES"
@@ -1196,6 +1199,48 @@
 6765 DATA  LDY#, S.ABORT↑
 6766 DATA  JSR, PUTSTRLN
 6767 DATA  RTS
+9000 REM
+9001 REM BASIC STUB / LOADER
+9002 REM
+9008 DATA .=, $C000: REM 256 BYTE BUF
+9009 REM
+9011 DATA .DW, $F00, .DW, 1
+9012 DATA .DB, $9E:       REM SYS
+9013 DATA .DSZ, " 2100":  REM 2049 + 51 9019 REM
+9021 DATA .DW, $F00, .DW, 2
+9022 DATA .DB, $99:       REM PRINT
+9023 DATA .DB, $20 $22:   REM ' "'
+9024 DATA .DSZ, "LINEUTILS AT 500XX"
+9029 REM
+9031 DATA .DW, $F00, .DW, 3
+9032 DATA .DB, $A2:       REM NEW
+9033 DATA .DSZ, ""
+9039 REM
+9041 DATA .DW, 0
+9049 REM
+9095 DATA .LIM, $C033:   REM $C000 + 51
+9096 DATA .=,   $C033:
+9100 REM DST = $C000
+9110 DATA  LDX#, 0
+9111 DATA  LDY#, $C0
+9112 DATA  STXZ, P
+9113 DATA  STYZ, P+
+9120 REM SRC = $801
+9121 DATA  LDX#, 1
+9122 DATA  LDY#, 8
+9123 DATA  STXZ, Q
+9124 DATA  STYZ, Q+
+9130 REM LEN = VARTAB - $801
+9131 DATA  SEC
+9132 DATA  LDAZ, VARTAB
+9133 DATA  SBC#, 1
+9134 DATA  TAY
+9135 DATA  LDAZ, VARTAB+
+9136 DATA  SBC#, 8
+9137 DATA  TAX
+9190 REM MEMCPY (TAIL CALL)
+9191 DATA  JMP, $BB5:  REM $801 + $3B4
+9199 DATA .LIM, $C100
 9900 REM
 9901 REM ENTRY POINTS: $C350 - $C3B4
 9902 REM