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
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 -
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"
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