Restore to a line number

Hardware Hacking, Programming and Game Solutions/Cheats
Post Reply
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Restore to a line number

Post by zephyr »

This routine will allow you to restore to a line number. The machine code routine is position independent, and DOS compatible.

Code: Select all

10 'RESTORE-LINE-NUMBER V1.0
20 'FOR THE DRAGON 32/64
30 'BY STEPHEN J WOOLHAM
40 '***************************
50 'BASIC EXAMPLE PROGRAM
60 '***************************
70 MC$="DCD1DD2B9E19BD840325037E85167E8605"
80 X=1:FOR I=1004 TO 1020:POKE I,VAL("&H"+MID$(MC$,X,2)):X=X+2:NEXT
90 '
100 'LN = LINE TO RESTORE TO
110 '
120 LN = 200
130 POKE209,VAL("&H"+LEFT$(HEX$(LN),LEN(HEX$(LN))-2))
140 POKE210,VAL("&H"+RIGHT$(HEX$(LN),2)):EXEC1004
200 DATA A,B,C
Here's the same routine for Tandy Color Computer models 1, 2, and 3.

Code: Select all

10 'RESTORE-LINE-NUMBER V1.0
20 'FOR TANDY COLOR COMPUTER
30 'MODELS 1, 2, AND 3
40 'BY STEPHEN J WOOLHAM
50 '***************************
60 'BASIC EXAMPLE PROGRAM
70 '***************************
80 MC$="DCD1DD2B9E19BDAD0525037EADE67EAED2"
90 X=1:FOR I=1004 TO 1020:POKE I,VAL("&H"+MID$(MC$,X,2)):X=X+2:NEXT
100 '
110 'LN = LINE TO RESTORE TO
120 '
130 LN = 200
140 POKE209,VAL("&H"+LEFT$(HEX$(LN),LEN(HEX$(LN))-2))
150 POKE210,VAL("&H"+RIGHT$(HEX$(LN),2)):EXEC1004
200 DATA A,B,C
Last edited by zephyr on Thu Nov 25, 2010 2:50 am, edited 2 times in total.
Alastair
Posts: 669
Joined: Fri Jul 18, 2008 11:33 pm

Re: Restore to a line number

Post by Alastair »

What do you mean when you say "restore to a line number"?
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: Restore to a line number

Post by zephyr »

The Dragon's RESTORE command can only restore the data pointer to the start of a BASIC program. You can't do the following.

Code: Select all

10 RESTORE 200:READ A$
20 RESTORE 300:READ B$
30 RESTORE 100:READ C$
40 PRINT A$;" ";B$;" ";C$
50 END
100 DATA THREE
200 DATA ONE
300 DATA TWO
Here's a quick example of how the routine can be used.

Code: Select all

10 MC$="DCD1DD2B9E19BD840325037E85167E8605"
20 X=1:FOR I=1004 TO 1020:POKE I,VAL("&H"+MID$(MC$,X,2)):X=X+2:NEXT
30 LN=200:GOSUB10000:READ A$
40 LN=300:GOSUB10000:READ B$
50 LN=100:GOSUB10000:READ C$
60 PRINTA$;" ";B$;" ";C$
70 END
100 DATA THREE
200 DATA ONE
300 DATA TWO
10000 POKE209,VAL("&H"+LEFT$(HEX$(LN),LEN(HEX$(LN))-2))
10010 POKE210,VAL("&H"+RIGHT$(HEX$(LN),2)):EXEC1004
10020 RETURN
Alastair
Posts: 669
Joined: Fri Jul 18, 2008 11:33 pm

Re: Restore to a line number

Post by Alastair »

Right, I get it now, thanks.
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: Restore to a line number

Post by zephyr »

Here's an alternative routine which utilises the CLS command to greatly improve execution speed of the BASIC program. The machine code routine is position independent, and DOS compatible.

Code: Select all

10 'RESTORE-LINE-NUMBER V2.0
20 'FOR THE DRAGON 32/64
30 'BY STEPHEN J WOOLHAM
40 '***************************
50 'BASIC EXAMPLE PROGRAM
60 '***************************
70 DATA 30,8D,0,1C,BC,1,A1,27,16,B6,1,A0,A7,8D,0,35,FC,1,A1,ED,8D,0,2F,86,7E,B7,1,A0,BF,1,A1,39,34,1,8C,81,94,26,1C,81,BC,26,18,9D,9F,9D,A5,BD,86,9A,35,11,DC,2B,9E,19,BD,84,3,25,3,7E,85,16,7E,86,5,35,1,39,39,39
80 CLEAR200,32695
90 FOR I=32696 TO 32767:READ MC$:X=VAL("&H"+MC$):CSUM=CSUM+X:POKEI,X:NEXT
100 IF CSUM<>6866 THEN CLS:PRINT"ERROR IN DATA LINE":END
110 EXEC32696
120 '
130 ' TEST ROUTINE
140 '
150 CLSTO2000:READ A$
160 CLSTO3000:READ B$
170 CLSTO1000:READ C$
180 CLS:PRINTA$;" ";B$;" ";C$
190 END
1000 DATA THREE
2000 DATA ONE
3000 DATA TWO
Here's the same routine for Tandy Color Computer models 1, 2, and 3.

Code: Select all

10 'RESTORE-LINE-NUMBER V2.0
20 'FOR TANDY COLOR COMPUTER
30 'MODELS 1, 2, AND 3
40 'BY STEPHEN J WOOLHAM
50 '***************************
60 'BASIC EXAMPLE PROGRAM
70 '***************************
80 DATA 30,8D,0,1C,BC,1,A1,27,16,B6,1,A0,A7,8D,0,35,FC,1,A1,ED,8D,0,2F,86,7E,B7,1,A0,BF,1,A1,39,34,1,8C,AB,A3,26,1C,81,A5,26,18,9D,9F,9D,A5,BD,AF,67,35,11,DC,2B,9E,19,BD,AD,5,25,3,7E,AD,E6,7E,AE,D2,35,1,39,39,39
90 CLEAR200,32695
100 FOR I=32696 TO 32767:READ MC$:X=VAL("&H"+MC$):CSUM=CSUM+X:POKEI,X:NEXT
110 IF CSUM<>7426 THEN CLS:PRINT"ERROR IN DATA LINE":END
120 EXEC32696
130 '
140 ' TEST ROUTINE
150 '
160 CLSTO2000:READ A$
170 CLSTO3000:READ B$
180 CLSTO1000:READ C$
190 CLS:PRINTA$;" ";B$;" ";C$
200 END
1000 DATA THREE
2000 DATA ONE
3000 DATA TWO
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: Restore to a line number

Post by zephyr »

This routine modifies the Dragon's original RESTORE command to optionally accept line numbers. The machine code routine is position independent, and DOS compatible.

Code: Select all

10 'RESTORE-LINE-NUMBER V3.0
20 'FOR THE DRAGON 32/64
30 'BY STEPHEN J WOOLHAM
40 '***************************
50 'BASIC EXAMPLE PROGRAM
60 '***************************
70 DATA 30,8D,0,1C,BC,1,7A,27,16,B6,1,79,A7,8D,0,38,FC,1,7A,ED,8D,0,32,86,7E,B7,1,79,BF,1,7A,39,34,7,81,90,26,20,10,9E,A6,9D,9F,9D,A5,27,14,BD,86,9A,35,17,DC,2B,9E,19,BD,84,3,25,3,7E,85,16,7E,86,5,10,9F,A6,35,7,39,39,39
80 CLEAR200,32692
90 FOR I=32693 TO 32767:READ MC$:X=VAL("&H"+MC$):CSUM=CSUM+X:POKEI,X:NEXT
100 IF CSUM<>6916 THEN CLS:PRINT"ERROR IN DATA LINE":END
110 EXEC32693
120 '
130 ' TEST ROUTINE
140 '
150 RESTORE2000:READ A$
160 RESTORE3000:READ B$
170 RESTORE1000:READ C$
180 CLS:PRINTA$;" ";B$;" ";C$
190 END
1000 DATA THREE
2000 DATA ONE
3000 DATA TWO
Here's the same routine for Tandy Color Computer models 1, 2, and 3.
N/B This routine is NOT compatible with the CoCo Break Disable v1.0.

Code: Select all

10 'RESTORE-LINE-NUMBER V3.0
20 'FOR TANDY COLOR COMPUTER
30 'MODELS 1, 2, AND 3
40 'BY STEPHEN J WOOLHAM
50 '***************************
60 'BASIC EXAMPLE PROGRAM
70 '***************************
80 DATA 30,8D,0,7,9C,A9,27,2,9F,A9,39,81,8F,26,2B,34,12,30,1,9C,A6,26,21,1F,12,9D,9F,9D,A5,27,16,BD,AF,67,DC,2B,9E,19,BD,AD,5,25,7,BD,AD,E6,35,12,4F,39,7E,AE,D2,10,9F,A6,35,12,7E,AA,1A
90 CLEAR200,32706
100 FOR I=32707 TO 32767:READ MC$:X=VAL("&H"+MC$):CSUM=CSUM+X:POKEI,X:NEXT
110 IF CSUM<>5927 THEN CLS:PRINT"ERROR IN DATA LINE":END
120 EXEC32707
130 '
140 ' TEST ROUTINE
150 '
160 RESTORE2000:READ A$
170 RESTORE3000:READ B$
180 RESTORE1000:READ C$
190 CLS:PRINTA$;" ";B$;" ";C$
200 END
1000 DATA THREE
2000 DATA ONE
3000 DATA TWO
Post Reply