0010 ; SYM BASIC RESEQUENCING program 0020 0030 ; The user may specify 0 to 4 parameters, using the 0040 ; following structure: 0050 0060 ; .NUM begin,incr,start,stop 0070 ;WHERE: 0080 ; begin = beginning line number in resequenced program 0090 ; incr = increment between line numbers 0100 ; start = old line number to begin renumbering at 0110 ; stop = old line number to halt renumbering 0120 0130 ; The respective default are: 100,10,0,32767 0140 0150 0160 0170 .BA $6D00 0180 .OS 0190 0200 ; ZERO PAGE USAGE 0210 0220 LINNUM .DE $1C !LINE NUMBER IN BINARY 0230 LINPTR .DE $58 !POINTER TO START 0240 BEGIN .DE $5A !BEGINNING LINE NUMBER 0250 INCR .DE $5C !LINE NUMBER INCREMENT 0260 START .DE $5E !LINE NUMBER TO BEGIN RENUMBERING 0270 STOP .DE $60 !LINE NUMBER TO STOP RENUMBERING 0280 XREG .DE $62 !TEMPORARY STORAGE FOR X 0290 INDEXA .DE $77 0300 INDEXB .DE $79 0310 BAS.ST .DE $7B !POINTER TO START OF PROGRAM 0320 BAS.EN .DE $7D !POINTER TO SIMPLE VARIABLES 0330 F.ACC1 .DE $B1 !FLOATING POINT ACCUMULATOR 1 0340 CHRGET .DE $CC !BASIC'S CHARACTER GETTING ROUTINE 0350 CHRGOT .DE $D2 !RE-FETCHS LAST CHARACTER 0360 BAS.PTR .DE $D3 !BASIC'S CHARACTER POINTER 0370 0380 ; BASIC ADDRESSES 0390 0400 ERMESS .DE $C25A !PRINTS ERROR MESSAGE 0410 FIXLNK1 .DE $C46D !ROUTINES CALLED TO 0420 FIXLNK2 .DE $C32C !FIX LINE LINKS 0430 LINGET .DE $C7F5 !CONVERTS ASCII # TO BINARY # 0440 MESSUB .DE $C954 !PRINTS MESSAGE AT Y,A (HI,LO) 0450 FLOATC .DE $D9FF !CONVERT BINARY # TO FLOATING PT 0460 FOUT .DE $DB9A !MAKE ASCII 0470 0480 0490 0500 0510 ; NUM is the entry point. Pick off the parameters, 0520 ; if any, after setting up the default values. 0530 6D00- A2 07 0540 NUM LDX #7 !SET DEFAULT VALUES 6D02- BD 15 6F 0550 DEFALT LDA DEFAULT,X 6D05- 95 5A 0560 STA *BEGIN,X 6D07- CA 0570 DEX 6D08- 10 F8 0580 BPL DEFALT 0590 6D0A- E8 0600 INX !X=0 6D0B- 20 CC 00 0610 GET.PARMS JSR CHRGET !FETCH NEXT CHARACTER 6D0E- F0 1A 0620 BEQ COPY !EXIT ON A SPACE 6D10- B0 18 0630 BCS COPY !OR ON A NON-DECIMAL 6D12- 86 62 0640 STX *XREG 6D14- 20 F5 C7 0650 JSR LINGET !GET PARAMETER VALUE 6D17- A6 62 0660 LDX *XREG 6D19- A5 1C 0670 LDA *LINNUM !AND STORE IT AWAY 6D1B- 95 5A 0680 STA *BEGIN,X 6D1D- A5 1D 0690 LDA *LINNUM+1 6D1F- 95 5B 0700 STA *BEGIN+1,X 6D21- E8 0710 INX 6D22- E8 0720 INX 6D23- 20 D2 00 0730 JSR CHRGOT !RE-FETCH LAST CHARACTER 6D26- C9 2C 0740 CMP #', !WAS IT A COMMA? 6D28- F0 E1 0750 BEQ GET.PARMS 0760 0770 0780 ; COPY moves the old line numbers into the area above 0790 ; the BASIC program and renumbers the lines. 0800 6D2A- A5 7D 0810 COPY LDA *BAS.EN !INITIALIZE POINTERS 6D2C- 85 79 0820 STA *INDEXB 6D2E- 85 58 0830 STA *LINPTR 6D30- A6 7E 0840 LDX *BAS.EN+1 6D32- E8 0850 INX 6D33- 86 7A 0860 STX *INDEXB+1 6D35- 86 59 0870 STX *LINPTR+1 6D37- 20 FC 6E 0880 JSR BUPXB 6D3A- A5 7B 0890 LDA *BAS.ST 6D3C- 85 77 0900 STA *INDEXA 6D3E- A5 7C 0910 LDA *BAS.ST+1 6D40- 85 78 0920 STA *INDEXA+1 6D42- 20 DA 6E 0930 JSR SETFAC 0940 6D45- A0 03 0950 COPYA LDY #$03 6D47- B1 77 0960 LDA (INDEXA),Y !GET OLD LINE NUMBER 6D49- 91 79 0970 STA (INDEXB),Y 6D4B- 88 0980 DEY 6D4C- B1 77 0990 LDA (INDEXA),Y 6D4E- 91 79 1000 STA (INDEXB),Y 1010 6D50- C8 1020 INY !SEE IF BELOW STARTING NUMBER 6D51- B1 77 1030 LDA (INDEXA),Y 6D53- C5 5F 1040 CMP *START+1 6D55- F0 04 1050 BEQ CHKSLO 6D57- 90 42 1060 BCC COPYM !BELOW; KEEP OLD NUMBER 6D59- B0 07 1070 BCS COPYC 6D5B- 88 1080 CHKSLO DEY 6D5C- B1 77 1090 LDA (INDEXA),Y 6D5E- C5 5E 1100 CMP *START 6D60- 90 39 1110 BCC COPYM !BELOW; KEEP OLD NUMBER 1120 6D62- A0 03 1130 COPYC LDY #3 !SEE IF ABOVE STOP NUMBER 6D64- B1 77 1140 LDA (INDEXA),Y 6D66- C5 61 1150 CMP *STOP+1 6D68- F0 04 1160 BEQ CHKHLO 6D6A- B0 1B 1170 BCS COPYN !ABOVE; KEEP OLD NUMBER 6D6C- 90 09 1180 BCC COPYR 6D6E- 88 1190 CHKHLO DEY 6D6F- B1 77 1200 LDA (INDEXA),Y 6D71- C5 60 1210 CMP *STOP 6D73- F0 02 1220 BEQ COPYR 6D75- B0 10 1230 BCS COPYN !ABOVE; KEEP OLD NUMBER 1240 6D77- A0 03 1250 COPYR LDY #3 !REPLACE OLD LINE # WITH NEW 6D79- B9 AF 00 1260 LDA F.ACC1-2,Y 6D7C- 91 77 1270 STA (INDEXA),Y 6D7E- 88 1280 DEY 6D7F- B9 AF 00 1290 LDA F.ACC1-2,Y 6D82- 91 77 1300 STA (INDEXA),Y 6D84- 20 E3 6E 1310 JSR ADD.INC 1320 6D87- A0 01 1330 COPYN LDY #1 !UPDATE POINTERS 6D89- B1 77 1340 LDA (INDEXA),Y 6D8B- F0 19 1350 BEQ COPYE !BRANCH IF LAST LINE IN PROGRAM 6D8D- AA 1360 TAX 6D8E- 20 FC 6E 1370 JSR BUPXB 6D91- 88 1380 DEY 6D92- B1 77 1390 LDA (INDEXA),Y 6D94- 85 77 1400 STA *INDEXA 6D96- 86 78 1410 STX *INDEXA+1 6D98- 4C 45 6D 1420 JMP COPYA 1430 6D9B- A5 79 1440 COPYM LDA *INDEXB !UPDATE POINTER TO START LINE 6D9D- 85 58 1450 STA *LINPTR 6D9F- A5 7A 1460 LDA *INDEXB+1 6DA1- 85 59 1470 STA *LINPTR+1 6DA3- 4C 87 6D 1480 JMP COPYN 1490 1500 1510 ; Look for GOTO, RUN, GOSUB, and THEN tokens 1520 ; and adjust the associated line numbers 1530 6DA6- A9 FF 1540 COPYE LDA #$FF !$FFFF IS LARGEST LINE NUMBER POSSIBLE 6DA8- C8 1550 INY 6DA9- 91 79 1560 STA (INDEXB),Y 6DAB- C8 1570 INY 6DAC- 91 79 1580 STA (INDEXB),Y 6DAE- A5 7B 1590 RENUM LDA *BAS.ST 6DB0- 85 D3 1600 STA *BAS.PTR 6DB2- A5 7C 1610 LDA *BAS.ST+1 6DB4- 85 D4 1620 STA *BAS.PTR+1 6DB6- D0 03 1630 BNE RENB 6DB8- 20 06 6F 1640 RENA JSR GRAB 6DBB- 20 06 6F 1650 RENB JSR GRAB 6DBE- D0 10 1660 BNE RENC !ZERO FLAGS END OF PROGRAM 6DC0- 20 6D C4 1670 JSR FIXLNK1 6DC3- 20 2C C3 1680 JSR FIXLNK2 6DC6- A2 FE 1690 FIX.STK LDX #$FE !RESTRUCTURE STACK 6DC8- 9A 1700 TXS 6DC9- A9 C2 1710 LDA #$C2 6DCB- 48 1720 PHA 6DCC- A9 7D 1730 LDA #$7D 6DCE- 48 1740 PHA 6DCF- 00 1750 BRK 1760 1770 6DD0- 20 06 6F 1780 RENC JSR GRAB !SKIP LINE NUMBER 6DD3- 20 06 6F 1790 JSR GRAB 6DD6- 20 06 6F 1800 REND JSR GRAB 6DD9- AA 1810 RENE TAX 6DDA- F0 DC 1820 BEQ RENA !ZERO FLAGS END OF LINE 1830 6DDC- A2 04 1840 LDX #4 !LOOK FOR TOKENS 6DDE- DD 10 6F 1850 RENG CMP TOKEN-1,X 6DE1- F0 05 1860 BEQ RENH 6DE3- CA 1870 DEX 6DE4- D0 F8 1880 BNE RENG 6DE6- F0 EE 1890 BEQ REND 1900 6DE8- A5 D3 1910 RENH LDA *BAS.PTR !FOUND ONE, SO SAVE 6DEA- 48 1920 PHA !PROGRAM POINTER 6DEB- A5 D4 1930 LDA *BAS.PTR+1 6DED- 48 1940 PHA 6DEE- 20 CC 00 1950 JSR CHRGET 6DF1- B0 E6 1960 BCS RENE !NEXT CHARACTER A NUMBER? 6DF3- 20 F5 C7 1970 JSR LINGET !YES, SO CONVERT IT 6DF6- A5 1D 1980 LDA *LINNUM+1 6DF8- C5 5F 1990 CMP *START+1 !AND SEE IF BELOW RANGE 6DFA- 90 4C 2000 BCC RENF 6DFC- F0 02 2010 BEQ SLOCHK 6DFE- B0 06 2020 BCS RENR 6E00- A5 1C 2030 SLOCHK LDA *LINNUM 6E02- C5 5E 2040 CMP *START 6E04- 90 42 2050 BCC RENF 2060 6E06- A5 1D 2070 RENR LDA *LINNUM+1 6E08- C5 61 2080 CMP *STOP+1 !SEE IF ABOVE RANGE 6E0A- F0 04 2090 BEQ HLOCHK 6E0C- B0 3A 2100 BCS RENF 6E0E- 90 08 2110 BCC RENS 6E10- A5 1C 2120 HLOCHK LDA *LINNUM 6E12- C5 60 2130 CMP *STOP 6E14- F0 02 2140 BEQ RENS 6E16- B0 30 2150 BCS RENF 2160 2170 2180 ; Replace old line number with new 2190 6E18- 20 53 6E 2200 RENS JSR FINUM !FIND OLD NUMBER & MAKE NEW 6E1B- 68 2210 PLA 6E1C- 85 D4 2220 STA *BAS.PTR+1 6E1E- 68 2230 PLA 6E1F- 85 D3 2240 STA *BAS.PTR 6E21- A0 00 2250 LDY #$00 6E23- A2 00 2260 LDX #$00 6E25- BD 01 01 2270 RENI LDA $101,X !GET ASCII DIGIT 6E28- F0 0F 2280 BEQ RENK !ZERO IF DONE 6E2A- 48 2290 PHA 6E2B- 20 CC 00 2300 JSR CHRGET 6E2E- 90 03 2310 BCC RENJ 6E30- 20 8A 6E 2320 JSR MOVUP 6E33- 68 2330 RENJ PLA 6E34- 91 D3 2340 STA (BAS.PTR),Y 6E36- E8 2350 INX 6E37- D0 EC 2360 BNE RENI !BRANCH ALWAYS 2370 6E39- 20 CC 00 2380 RENK JSR CHRGET 6E3C- B0 0F 2390 BCS RENZ !CARRY SET IF NON-DIGIT 6E3E- 20 AC 6E 2400 RENM JSR MOVDWN 6E41- 20 D2 00 2410 JSR CHRGOT 6E44- 90 F8 2420 BCC RENM 6E46- B0 05 2430 BCS RENZ 6E48- 68 2440 RENF PLA 6E49- 68 2450 PLA 6E4A- 20 D2 00 2460 JSR CHRGOT 6E4D- C9 2C 2470 RENZ CMP #', !MIGHT HAVE BEEN AN "ON" 6E4F- F0 97 2480 BEQ RENH !IF SO, MORE TO FIX 6E51- D0 86 2490 BNE RENE 2500 2510 2520 ; Generate a new line number and put its 2530 ; value in ASCII in $101 to be picked up 2540 6E53- 20 DA 6E 2550 FINUM JSR SETFAC 6E56- A5 58 2560 LDA *LINPTR 6E58- 85 79 2570 STA *INDEXB 6E5A- A5 59 2580 LDA *LINPTR+1 6E5C- 85 7A 2590 STA *INDEXB+1 6E5E- A0 05 2600 FNA LDY #$05 6E60- B1 79 2610 LDA (INDEXB),Y 6E62- C5 1D 2620 CMP *LINNUM+1 6E64- F0 15 2630 BEQ FNC 6E66- C9 FF 2640 CMP #$FF !AT END? 6E68- D0 18 2650 BNE FND !IF SO, DIDN'T FIND NUMBER 6E6A- 85 B2 2660 STA *F.ACC1+1 6E6C- 85 B1 2670 STA *F.ACC1 6E6E- A5 B1 2680 FNB LDA *F.ACC1 6E70- 85 B3 2690 STA *F.ACC1+2 6E72- A2 90 2700 LDX #$90 6E74- 38 2710 SEC 6E75- 20 FF D9 2720 JSR FLOATC 6E78- 4C 9A DB 2730 JMP FOUT 2740 6E7B- 88 2750 FNC DEY 6E7C- B1 79 2760 LDA (INDEXB),Y 6E7E- C5 1C 2770 CMP *LINNUM 6E80- F0 EC 2780 BEQ FNB !FOUND IT!!! 6E82- 20 E3 6E 2790 FND JSR ADD.INC 6E85- 20 FC 6E 2800 JSR BUPXB 6E88- D0 D4 2810 BNE FNA !BRANCH ALWAYS 2820 2830 2840 ; Move program up one byte 2850 6E8A- 20 C9 6E 2860 MOVUP JSR SETPTR 6E8D- A0 00 2870 MUA LDY #$00 6E8F- B1 77 2880 LDA (INDEXA),Y 6E91- C8 2890 INY 6E92- 91 77 2900 STA (INDEXA),Y 6E94- 20 F1 6E 2910 JSR CMPX 6E97- D0 08 2920 BNE MUC 6E99- E6 7D 2930 INC *BAS.EN 6E9B- D0 02 2940 BNE MUB 6E9D- E6 7E 2950 INC *BAS.EN+1 6E9F- 88 2960 MUB DEY !Y=0 6EA0- 60 2970 RTS 2980 6EA1- A4 77 2990 MUC LDY *INDEXA !DO A BARROW 6EA3- D0 02 3000 BNE MUD 6EA5- C6 78 3010 DEC *INDEXA+1 6EA7- C6 77 3020 MUD DEC *INDEXA 6EA9- 4C 8D 6E 3030 JMP MUA 3040 3050 3060 ; Move program down one byte 3070 6EAC- 20 C9 6E 3080 MOVDWN JSR SETPTR 6EAF- A0 01 3090 MDA LDY #$01 6EB1- B1 79 3100 LDA (INDEXB),Y 6EB3- 88 3110 DEY 6EB4- 91 79 3120 STA (INDEXB),Y 6EB6- 20 F1 6E 3130 JSR CMPX 6EB9- F0 05 3140 BEQ MDC 6EBB- 20 FF 6E 3150 MDB JSR BUPXA 6EBE- D0 EF 3160 BNE MDA 6EC0- A4 7D 3170 MDC LDY *BAS.EN 6EC2- D0 02 3180 BNE MDD 6EC4- C6 7E 3190 DEC *BAS.EN+1 6EC6- C6 7D 3200 MDD DEC *BAS.EN 6EC8- 60 3210 MDE RTS 3220 6EC9- A5 7D 3230 SETPTR LDA *BAS.EN !SETS POINTERS FOR TEXT MOVES 6ECB- 85 77 3240 STA *INDEXA 6ECD- A5 7E 3250 LDA *BAS.EN+1 6ECF- 85 78 3260 STA *INDEXA+1 6ED1- A5 D3 3270 LDA *BAS.PTR 6ED3- 85 79 3280 STA *INDEXB 6ED5- A5 D4 3290 LDA *BAS.PTR+1 6ED7- 85 7A 3300 STA *INDEXB+1 6ED9- 60 3310 RTS 3320 6EDA- A5 5A 3330 SETFAC LDA *BEGIN !PREPARE LINE # GENERATOR 6EDC- 85 B1 3340 STA *F.ACC1 6EDE- A5 5B 3350 LDA *BEGIN+1 6EE0- 85 B2 3360 STA *F.ACC1+1 6EE2- 60 3370 RTS 3380 6EE3- A5 B1 3390 ADD.INC LDA *F.ACC1 !ADD INCREMENT 6EE5- 18 3400 CLC 6EE6- 65 5C 3410 ADC *INCR 6EE8- 85 B1 3420 STA *F.ACC1 6EEA- A5 B2 3430 LDA *F.ACC1+1 6EEC- 65 5D 3440 ADC *INCR+1 6EEE- 85 B2 3450 STA *F.ACC1+1 6EF0- 60 3460 RTS 3470 6EF1- A5 77 3480 CMPX LDA *INDEXA !SET CARRY IF INDEXES EQUAL 6EF3- C5 79 3490 CMP *INDEXB 6EF5- D0 04 3500 BNE CRTS 6EF7- A5 78 3510 LDA *INDEXA+1 6EF9- C5 7A 3520 CMP *INDEXB+1 6EFB- 60 3530 CRTS RTS 3540 6EFC- 20 FF 6E 3550 BUPXB JSR BUPXA !BUMP INDEXB BY 2 6EFF- E6 79 3560 BUPXA INC *INDEXB !BUMP INDEXB BY 1 6F01- D0 02 3570 BNE BRTS 6F03- E6 7A 3580 INC *INDEXB+1 6F05- 60 3590 BRTS RTS 3600 6F06- A0 00 3610 GRAB LDY #0 !GET NEXT CHARACTER 6F08- E6 D3 3620 INC *BAS.PTR 6F0A- D0 02 3630 BNE GRA 6F0C- E6 D4 3640 INC *BAS.PTR+1 6F0E- B1 D3 3650 GRA LDA (BAS.PTR),Y 6F10- 60 3660 RTS 3670 6F11- 88 89 3680 TOKEN .BY $88 $89 6F13- 8C A1 3690 .BY $8C $A1 3700 6F15- 64 00 0A 3710 DEFAULT .BY $64 $00 $0A $00 6F18- 00 6F19- 00 00 FF 3720 .BY $00 $00 $FF $FF 6F1C- FF 3730 3740 .EN 0000,6F1D,6F1D >