0010 ; HDE ORIGINAL %NUM COMMAND 0020 ; FILE NAME %NUX 0030 0040 ; THIS PROGRAM HAS BEEN RE-SOURCED. 0050 ; IT NOW CONTAINS ALL THE ROUTINES 0060 ; ORIGINALLY FROM HDE. I BELIEVE THIS 0070 ; PROGRAM CAN ONLY BE USED WITH %BAX, 0080 ; THE ORIGINAL BASIC LINK FROM HDE. 0090 0100 ; THE ORIGINAL FILE IS CALLED NUM, WHICH WAS 0110 ; THIS FILE. IT HAS BEEN MODIFIED BYTE FOR BYTE 0120 ; TO MATCH HDE'S VERSION. 0130 0140 ; SYM BASIC RESEQUENCING program 0150 0160 ; The user may specify 0 to 4 parameters, using the 0170 ; following structure: 0180 0190 ; .NUM begin,incr,start,stop 0200 ;WHERE: 0210 ; begin = beginning line number in resequenced program 0220 ; incr = increment between line numbers 0230 ; start = old line number to begin renumbering at 0240 ; stop = old line number to halt renumbering 0250 0260 ; The respective default are: 100,10,0,32767 0270 0280 0290 0300 .BA $6D00 0310 .OS 0320 0330 ; ZERO PAGE USAGE 0340 0350 XREG .DE $15 0360 LINNUM .DE $1C !LINE NUMBER IN BINARY 0370 LINPTR .DE $58 !POINTER TO START 0380 INDEXA .DE $77 0390 INDEXB .DE $79 0400 BAS.ST .DE $7B !POINTER TO START OF PROGRAM 0410 BAS.EN .DE $7D !POINTER TO SIMPLE VARIABLES 0420 F.ACC1 .DE $B1 !FLOATING POINT ACCUMULATOR 1 0430 CHRGET .DE $CC !BASIC'S CHARACTER GETTING ROUTINE 0440 CHRGOT .DE $D2 !RE-FETCHS LAST CHARACTER 0450 BAS.PTR .DE $D3 !BASIC'S CHARACTER POINTER 0460 0470 ; BASIC ADDRESSES 0480 0490 ERMESS .DE $C25A !PRINTS ERROR MESSAGE 0500 BAS.WARM .DE $C27E 0510 FIXLNK1 .DE $C46D !ROUTINES CALLED TO 0520 FIXLNK2 .DE $C32C !FIX LINE LINKS 0530 LINGET .DE $C7F5 !CONVERTS ASCII # TO BINARY # 0540 MESSUB .DE $C954 !PRINTS MESSAGE AT Y,A (HI,LO) 0550 FLOATC .DE $D9FF !CONVERT BINARY # TO FLOATING PT 0560 FOUT .DE $DB9A !MAKE ASCII 0570 0580 0590 ; FODS ADDRESSES 0600 0610 RET_ZERO .DE $6762 ; RESTORE A0 TO AF 0620 SET2 .DE $7634 0630 DSKRW .DE $765D 0640 0650 0660 ; NUM is the entry point. Pick off the parameters, 0670 ; if any, after setting up the default values. 0680 6D00- A9 20 0690 NUM LDA #$20 6D02- 20 5D 76 0700 JSR DSKRW 6D05- 20 34 76 0710 JSR SET2 6D08- 20 D1 6E 0720 JSR DEFLT.SET 0730 6D0B- E8 0740 INX !X=0 6D0C- 20 CC 00 0750 GET.PARMS JSR CHRGET !FETCH NEXT CHARACTER 6D0F- F0 1C 0760 BEQ COPY !EXIT ON A SPACE 6D11- B0 1A 0770 BCS COPY !OR ON A NON-DECIMAL 6D13- 86 15 0780 STX *XREG 6D15- 20 F5 C7 0790 JSR LINGET !GET PARAMETER VALUE 6D18- A6 15 0800 LDX *XREG 6D1A- A5 1C 0810 LDA *LINNUM !AND STORE IT AWAY 6D1C- 9D 29 6F 0820 STA BEGIN,X 6D1F- A5 1D 0830 LDA *LINNUM+1 6D21- 9D 2A 6F 0840 STA BEGIN+1,X 6D24- E8 0850 INX 6D25- E8 0860 INX 6D26- 20 D2 00 0870 JSR CHRGOT !RE-FETCH LAST CHARACTER 6D29- C9 2C 0880 CMP #', !WAS IT A COMMA? 6D2B- F0 DF 0890 BEQ GET.PARMS 0900 0910 0920 ; COPY moves the old line numbers into the area above 0930 ; the BASIC program and renumbers the lines. 0940 6D2D- A5 7D 0950 COPY LDA *BAS.EN !INITIALIZE POINTERS 6D2F- 85 79 0960 STA *INDEXB 6D31- 85 58 0970 STA *LINPTR 6D33- A6 7E 0980 LDX *BAS.EN+1 6D35- E8 0990 INX 6D36- E8 1000 INX 6D37- 86 7A 1010 STX *INDEXB+1 6D39- 86 59 1020 STX *LINPTR+1 6D3B- 20 14 6F 1030 JSR BUPXB 6D3E- A5 7B 1040 LDA *BAS.ST 6D40- 85 77 1050 STA *INDEXA 6D42- A5 7C 1060 LDA *BAS.ST+1 6D44- 85 78 1070 STA *INDEXA+1 6D46- 20 EE 6E 1080 JSR SETFAC 1090 6D49- A0 03 1100 COPYA LDY #$03 6D4B- B1 77 1110 LDA (INDEXA),Y !GET OLD LINE NUMBER 6D4D- 91 79 1120 STA (INDEXB),Y 6D4F- 88 1130 DEY 6D50- B1 77 1140 LDA (INDEXA),Y 6D52- 91 79 1150 STA (INDEXB),Y 1160 6D54- C8 1170 INY !SEE IF BELOW STARTING NUMBER 6D55- B1 77 1180 LDA (INDEXA),Y 6D57- CD 2E 6F 1190 CMP START+1 6D5A- F0 04 1200 BEQ CHKSLO 6D5C- 90 45 1210 BCC COPYM !BELOW; KEEP OLD NUMBER 6D5E- B0 08 1220 BCS COPYC 6D60- 88 1230 CHKSLO DEY 6D61- B1 77 1240 LDA (INDEXA),Y 6D63- CD 2D 6F 1250 CMP START 6D66- 90 3B 1260 BCC COPYM !BELOW; KEEP OLD NUMBER 1270 6D68- A0 03 1280 COPYC LDY #3 !SEE IF ABOVE STOP NUMBER 6D6A- B1 77 1290 LDA (INDEXA),Y 6D6C- CD 30 6F 1300 CMP STOP+1 6D6F- F0 04 1310 BEQ CHKHLO 6D71- B0 1C 1320 BCS COPYN !ABOVE; KEEP OLD NUMBER 6D73- 90 0A 1330 BCC COPYR 6D75- 88 1340 CHKHLO DEY 6D76- B1 77 1350 LDA (INDEXA),Y 6D78- CD 2F 6F 1360 CMP STOP 6D7B- F0 02 1370 BEQ COPYR 6D7D- B0 10 1380 BCS COPYN !ABOVE; KEEP OLD NUMBER 1390 6D7F- A0 03 1400 COPYR LDY #3 !REPLACE OLD LINE # WITH NEW 6D81- B9 AF 00 1410 LDA F.ACC1-2,Y 6D84- 91 77 1420 STA (INDEXA),Y 6D86- 88 1430 DEY 6D87- B9 AF 00 1440 LDA F.ACC1-2,Y 6D8A- 91 77 1450 STA (INDEXA),Y 6D8C- 20 F9 6E 1460 JSR ADD.INC 1470 6D8F- A0 01 1480 COPYN LDY #1 !UPDATE POINTERS 6D91- B1 77 1490 LDA (INDEXA),Y 6D93- F0 19 1500 BEQ COPYE !BRANCH IF LAST LINE IN PROGRAM 6D95- AA 1510 TAX 6D96- 20 14 6F 1520 JSR BUPXB 6D99- 88 1530 DEY 6D9A- B1 77 1540 LDA (INDEXA),Y 6D9C- 85 77 1550 STA *INDEXA 6D9E- 86 78 1560 STX *INDEXA+1 6DA0- 4C 49 6D 1570 JMP COPYA 1580 6DA3- A5 79 1590 COPYM LDA *INDEXB !UPDATE POINTER TO START LINE 6DA5- 85 58 1600 STA *LINPTR 6DA7- A5 7A 1610 LDA *INDEXB+1 6DA9- 85 59 1620 STA *LINPTR+1 6DAB- 4C 8F 6D 1630 JMP COPYN 1640 1650 1660 ; Look for GOTO, RUN, GOSUB, and THEN tokens 1670 ; and adjust the associated line numbers 1680 6DAE- A9 FF 1690 COPYE LDA #$FF !$FFFF IS LARGEST LINE NUMBER POSSIBLE 6DB0- C8 1700 INY 6DB1- 91 79 1710 STA (INDEXB),Y 6DB3- C8 1720 INY 6DB4- 91 79 1730 STA (INDEXB),Y 6DB6- A5 7B 1740 RENUM LDA *BAS.ST 6DB8- A4 7C 1750 LDY *BAS.ST+1 6DBA- 85 D3 1760 STA *BAS.PTR 6DBC- 84 D4 1770 STY *BAS.PTR+1 6DBE- D0 03 1780 BNE RENB 6DC0- 20 1E 6F 1790 RENA JSR GRAB 6DC3- 20 1E 6F 1800 RENB JSR GRAB 6DC6- D0 0C 1810 BNE RENC !ZERO FLAGS END OF PROGRAM 6DC8- 20 62 67 1820 JSR RET_ZERO 6DCB- 20 6D C4 1830 JSR FIXLNK1 6DCE- 20 2C C3 1840 JSR FIXLNK2 6DD1- 4C 7E C2 1850 JMP BAS.WARM 1860 1870 6DD4- 20 1E 6F 1880 RENC JSR GRAB !SKIP LINE NUMBER 6DD7- 20 1E 6F 1890 JSR GRAB 6DDA- 20 1E 6F 1900 REND JSR GRAB 6DDD- AA 1910 RENE TAX 6DDE- F0 E0 1920 BEQ RENA !ZERO FLAGS END OF LINE 1930 6DE0- A2 04 1940 LDX #4 !LOOK FOR TOKENS 6DE2- DD 38 6F 1950 RENG CMP TOKEN-1,X 6DE5- F0 05 1960 BEQ RENH 6DE7- CA 1970 DEX 6DE8- D0 F8 1980 BNE RENG 6DEA- F0 EE 1990 BEQ REND 2000 6DEC- A5 D3 2010 RENH LDA *BAS.PTR !FOUND ONE, SO SAVE 6DEE- 48 2020 PHA !PROGRAM POINTER 6DEF- A5 D4 2030 LDA *BAS.PTR+1 6DF1- 48 2040 PHA 6DF2- 20 CC 00 2050 JSR CHRGET 6DF5- B0 E6 2060 BCS RENE !NEXT CHARACTER A NUMBER? 6DF7- 20 F5 C7 2070 JSR LINGET !YES, SO CONVERT IT 6DFA- A5 1D 2080 LDA *LINNUM+1 6DFC- CD 2E 6F 2090 CMP START+1 6DFF- 90 4F 2100 BCC RENF 6E01- F0 02 2110 BEQ SLOCHK 6E03- B0 07 2120 BCS RENR 6E05- A5 1C 2130 SLOCHK LDA *LINNUM 6E07- CD 2D 6F 2140 CMP START 6E0A- 90 44 2150 BCC RENF 2160 6E0C- A5 1D 2170 RENR LDA *LINNUM+1 6E0E- CD 30 6F 2180 CMP STOP+1 !SEE IF ABOVE RANGE 6E11- F0 04 2190 BEQ HLOCHK 6E13- B0 3B 2200 BCS RENF 6E15- 90 09 2210 BCC RENS 6E17- A5 1C 2220 HLOCHK LDA *LINNUM 6E19- CD 2F 6F 2230 CMP STOP 6E1C- F0 02 2240 BEQ RENS 6E1E- B0 30 2250 BCS RENF 2260 2270 2280 ; Replace old line number with new 2290 6E20- 20 5B 6E 2300 RENS JSR FINUM !FIND OLD NUMBER & MAKE NEW 6E23- 68 2310 PLA 6E24- 85 D4 2320 STA *BAS.PTR+1 6E26- 68 2330 PLA 6E27- 85 D3 2340 STA *BAS.PTR 6E29- A0 00 2350 LDY #$00 6E2B- A2 00 2360 LDX #$00 6E2D- BD 01 01 2370 RENI LDA $101,X !GET ASCII DIGIT 6E30- F0 0F 2380 BEQ RENK !ZERO IF DONE 6E32- 48 2390 PHA 6E33- 20 CC 00 2400 JSR CHRGET 6E36- 90 03 2410 BCC RENJ 6E38- 20 92 6E 2420 JSR MOVUP 6E3B- 68 2430 RENJ PLA 6E3C- 91 D3 2440 STA (BAS.PTR),Y 6E3E- E8 2450 INX 6E3F- D0 EC 2460 BNE RENI !BRANCH ALWAYS 2470 6E41- 20 CC 00 2480 RENK JSR CHRGET 6E44- B0 0F 2490 BCS RENZ !CARRY SET IF NON-DIGIT 6E46- 20 B4 6E 2500 RENM JSR MOVDWN 6E49- 20 D2 00 2510 JSR CHRGOT 6E4C- 90 F8 2520 BCC RENM 6E4E- B0 05 2530 BCS RENZ 6E50- 68 2540 RENF PLA 6E51- 68 2550 PLA 6E52- 20 D2 00 2560 JSR CHRGOT 6E55- C9 2C 2570 RENZ CMP #', !MIGHT HAVE BEEN AN "ON" 6E57- F0 93 2580 BEQ RENH !IF SO, MORE TO FIX 6E59- D0 82 2590 BNE RENE 2600 2610 2620 ; Generate a new line number and put its 2630 ; value in ASCII in $101 to be picked up 2640 6E5B- 20 EE 6E 2650 FINUM JSR SETFAC 6E5E- A5 58 2660 LDA *LINPTR 6E60- 85 79 2670 STA *INDEXB 6E62- A5 59 2680 LDA *LINPTR+1 6E64- 85 7A 2690 STA *INDEXB+1 6E66- A0 05 2700 FNA LDY #$05 6E68- B1 79 2710 LDA (INDEXB),Y 6E6A- C5 1D 2720 CMP *LINNUM+1 6E6C- F0 15 2730 BEQ FNC 6E6E- C9 FF 2740 CMP #$FF !AT END? 6E70- D0 18 2750 BNE FND !IF SO, DIDN'T FIND NUMBER 6E72- 85 B2 2760 STA *F.ACC1+1 6E74- 85 B1 2770 STA *F.ACC1 6E76- A5 B1 2780 FNB LDA *F.ACC1 6E78- 85 B3 2790 STA *F.ACC1+2 6E7A- A2 90 2800 LDX #$90 6E7C- 38 2810 SEC 6E7D- 20 FF D9 2820 JSR FLOATC 6E80- 4C 9A DB 2830 JMP FOUT 2840 6E83- 88 2850 FNC DEY 6E84- B1 79 2860 LDA (INDEXB),Y 6E86- C5 1C 2870 CMP *LINNUM 6E88- F0 EC 2880 BEQ FNB !FOUND IT!!! 6E8A- 20 F9 6E 2890 FND JSR ADD.INC 6E8D- 20 14 6F 2900 JSR BUPXB 6E90- D0 D4 2910 BNE FNA !BRANCH ALWAYS 2920 2930 2940 ; Move program up one byte 2950 6E92- 20 DD 6E 2960 MOVUP JSR SETPTR 6E95- A0 00 2970 MUA LDY #$00 6E97- B1 77 2980 LDA (INDEXA),Y 6E99- C8 2990 INY 6E9A- 91 77 3000 STA (INDEXA),Y 6E9C- 20 09 6F 3010 JSR CMPX 6E9F- D0 08 3020 BNE MUC 6EA1- E6 7D 3030 INC *BAS.EN 6EA3- D0 02 3040 BNE MUB 6EA5- E6 7E 3050 INC *BAS.EN+1 6EA7- 88 3060 MUB DEY !Y=0 6EA8- 60 3070 RTS 3080 6EA9- A4 77 3090 MUC LDY *INDEXA !DO A BARROW 6EAB- D0 02 3100 BNE MUD 6EAD- C6 78 3110 DEC *INDEXA+1 6EAF- C6 77 3120 MUD DEC *INDEXA 6EB1- 4C 95 6E 3130 JMP MUA 3140 3150 3160 ; Move program down one byte 3170 6EB4- 20 DD 6E 3180 MOVDWN JSR SETPTR 6EB7- A0 01 3190 MDA LDY #$01 6EB9- B1 79 3200 LDA (INDEXB),Y 6EBB- 88 3210 DEY 6EBC- 91 79 3220 STA (INDEXB),Y 6EBE- 20 09 6F 3230 JSR CMPX 6EC1- F0 05 3240 BEQ MDC 6EC3- 20 17 6F 3250 MDB JSR BUPXA 6EC6- D0 EF 3260 BNE MDA 6EC8- A4 7D 3270 MDC LDY *BAS.EN 6ECA- D0 02 3280 BNE MDD 6ECC- C6 7E 3290 DEC *BAS.EN+1 6ECE- C6 7D 3300 MDD DEC *BAS.EN 6ED0- 60 3310 MDE RTS 3320 6ED1- A2 07 3330 DEFLT.SET LDX #$07 6ED3- BD 31 6F 3340 DEFALT LDA DEFAULT,X 6ED6- 9D 29 6F 3350 STA BEGIN,X 6ED9- CA 3360 DEX 6EDA- 10 F7 3370 BPL DEFALT 6EDC- 60 3380 RTS 3390 6EDD- A5 7D 3400 SETPTR LDA *BAS.EN !SETS POINTERS FOR TEXT MOVES 6EDF- 85 77 3410 STA *INDEXA 6EE1- A5 7E 3420 LDA *BAS.EN+1 6EE3- 85 78 3430 STA *INDEXA+1 6EE5- A5 D3 3440 LDA *BAS.PTR 6EE7- 85 79 3450 STA *INDEXB 6EE9- A5 D4 3460 LDA *BAS.PTR+1 6EEB- 85 7A 3470 STA *INDEXB+1 6EED- 60 3480 RTS 3490 6EEE- AD 29 6F 3500 SETFAC LDA BEGIN !PREPARE LINE # GENERATOR 6EF1- 85 B1 3510 STA *F.ACC1 6EF3- AD 2A 6F 3520 LDA BEGIN+1 6EF6- 85 B2 3530 STA *F.ACC1+1 6EF8- 60 3540 RTS 3550 6EF9- A5 B1 3560 ADD.INC LDA *F.ACC1 !ADD INCREMENT 6EFB- 18 3570 CLC 6EFC- 6D 2B 6F 3580 ADC INCR 6EFF- 85 B1 3590 STA *F.ACC1 6F01- A5 B2 3600 LDA *F.ACC1+1 6F03- 6D 2C 6F 3610 ADC INCR+1 6F06- 85 B2 3620 STA *F.ACC1+1 6F08- 60 3630 RTS 3640 6F09- A5 77 3650 CMPX LDA *INDEXA !SET CARRY IF INDEXES EQUAL 6F0B- C5 79 3660 CMP *INDEXB 6F0D- D0 04 3670 BNE CRTS 6F0F- A5 78 3680 LDA *INDEXA+1 6F11- C5 7A 3690 CMP *INDEXB+1 6F13- 60 3700 CRTS RTS 3710 6F14- 20 17 6F 3720 BUPXB JSR BUPXA !BUMP INDEXB BY 2 6F17- E6 79 3730 BUPXA INC *INDEXB !BUMP INDEXB BY 1 6F19- D0 02 3740 BNE BRTS 6F1B- E6 7A 3750 INC *INDEXB+1 6F1D- 60 3760 BRTS RTS 3770 6F1E- A0 00 3780 GRAB LDY #0 !GET NEXT CHARACTER 6F20- E6 D3 3790 INC *BAS.PTR 6F22- D0 02 3800 BNE GRA 6F24- E6 D4 3810 INC *BAS.PTR+1 6F26- B1 D3 3820 GRA LDA (BAS.PTR),Y 6F28- 60 3830 RTS 3840 3850 6F29- 3860 BEGIN .DS 2 6F2B- 3870 INCR .DS 2 6F2D- 3880 START .DS 2 6F2F- 3890 STOP .DS 2 3900 3910 6F31- 64 00 0A 3920 DEFAULT .BY $64 $00 $0A $00 6F34- 00 6F35- 00 00 FF 3930 .BY $00 $00 $FF $FF 6F38- FF 3940 6F39- 88 89 3950 TOKEN .BY $88 $89 6F3B- 8C A1 3960 .BY $8C $A1 3970 .EN 0000,6F3D,6F3D >