Load/Save a machine code program

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

Load/Save a machine code program

Post by zephyr »

Load M/C program from Cassette or Disk, and use the following method to find the START, END, and EXEC address.

From Cassette to Cassette:

Code: Select all

A = PEEK(487)*256+PEEK(488)
B = PEEK(126)*256+PEEK(127)-1
C = PEEK(157)*256+PEEK(158)

CSAVEM"PROGRAM",A,B,C
From Cassette to Disk:

Code: Select all

A = PEEK(487)*256+PEEK(488)
B = PEEK(126)*256+PEEK(127)
C = PEEK(157)*256+PEEK(158)

SAVE"PROGRAM",A,B,C
From Disk to Disk:

Code: Select all

A = PEEK(1618)*256+PEEK(1619)
B = A+PEEK(1620)*256+PEEK(1621)
C = PEEK(1622)*256+PEEK(1623)

SAVE"PROGRAM",A,B,C
From Disk to Cassette:

Code: Select all

A = PEEK(1618)*256+PEEK(1619)
B = A+PEEK(1620)*256+PEEK(1621)-1
C = PEEK(1622)*256+PEEK(1623)

CSAVEM"PROGRAM",A,B,C
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: Load/Save a machine code program

Post by zephyr »

This utility displays the START, END, and EXEC addresses of a disk, or cassette based machine code program loaded into the Dragon's memory. Two versions are supplied, one for programs loaded from floppy disk (PEEKBIN), and one for programs loaded from cassette (PEEKCAS).

First you must type in the following BASIC programs, RUN them, and save the machine code to cassette using the START, END, and EXEC addresses displayed on screen.

e.g.
PEEKBIN

Code: Select all

CSAVEM"BIN",20480,20613,20480
PEEKCAS

Code: Select all

CSAVEM"CAS",2560,2697,2560
Alternatively, you can record the attached audio WAV files from your PC to a suitable cassette.

Code: Select all

0 'PEEKBIN V2.0
1 'FOR THE DRAGON 32/64
2 'BY STEPHEN J WOOLHAM
3 '
10 CLS:PRINT"WRITING MACHINE CODE..."
20 FOR I=20480 TO 20613:READ A$:X=VAL("&H"+A$):CSUM=CSUM+X:POKEI,X:NEXT
30 CLS:IF CSUM<>11848 THEN PRINT"ERROR IN DATA LINES":END
40 PRINT"START ADDRESS = 20480"
50 PRINT"END ADDRESS = 20613"
60 PRINT"EXEC ADDRESS = 20480"
70 POKE144,2:POKE145,0:END
100 DATA CE,1,E9,11,B3,1,A1,27,20,B6,1,A0,BE,1,A1,B7,50,37,BF,50,38,86,7E,B7,1,A0,FF,1,A1,8E,50,2A,A6,80,A7,C0,8C,50,86,25,F7,39,34
110 DATA 1,8C,81,94,26,4,81,39,27,5,35,1,39,39,39,9D,9F,35,11,FC,6,52,30,8D,0,2B,8D,19,FC,6,52,F3,6,54,83,0,1,30,8D,0,24,8D,A,FC,6,56
120 DATA 30,8D,0,21,8D,1,39,34,6,F,6F,BD,90,E5,35,6,BD,95,7A,86,D,7E,B5,4A,53,54,41,52,54,3A,20,0,45,4E,44,3A,20,0,45,58,45,43,3A,20,0

Code: Select all

0 'PEEKCAS V2.0
1 'FOR THE DRAGON 32/64
2 'BY STEPHEN J WOOLHAM
3 '
10 CLS:PRINT"WRITING MACHINE CODE..."
20 FOR I=2560 TO 2697:READ A$:X=VAL("&H"+A$):CSUM=CSUM+X:POKEI,X:NEXT
30 CLS:IF CSUM<>12842 THEN PRINT"ERROR IN DATA LINES":END
40 PRINT"START ADDRESS = 2560"
50 PRINT"END ADDRESS = 2697"
60 PRINT"EXEC ADDRESS = 2560"
70 POKE144,2:POKE145,0:END
100 DATA CE,7F,A8,11,B3,1,A1,27,5A,B6,1,A0,BE,1,A1,B7,A,3F,BF,A,40,86,7E,B7,1,A0,FF,1,A1,8E,A,32,A6,80,A7,C0,8C,A,8A,25,F7,CE,7F,36,8E
110 DATA 7F,A7,7E,85,9B,34,1,8C,81,94,26,4,81,39,27,5,35,1,39,39,39,9D,9F,35,11,FC,1,E7,30,8D,0,27,8D,15,DC,7E,83,0,1,30,8D,0,24,8D,A,FC
120 DATA 1,E5,30,8D,0,21,8D,1,39,34,6,F,6F,BD,90,E5,35,6,BD,95,7A,86,D,7E,B5,4A,53,54,41,52,54,3A,20,0,45,4E,44,3A,20,0,45,58,45,43,3A,20,0
To transfer BIN from cassette to floppy disk:

1. CLOADM"BIN" from cassette
2. Save to floppy disk with SAVE"BIN",20480,20614,20480


To use PEEKBIN:

1. LOAD"BIN.BIN":EXEC
2. LOAD any machine code program (game/utility) from floppy disk
3. CLS9


To use PEEKCAS:

1. CLOADM"CAS":EXEC
2. CLOADM any machine code program (game/utility) from cassette
3. CLS9

PEEKCAS can also be used directly by entering EXEC2630 at the BASIC command prompt. This direct method is useful when programs load to the top of RAM, overwriting the area ($7FA8 - $7FFF) where the PEEKCAS TSR is normally installed.
Attachments
PEEKBIN_PEEKCAS_V20.zip
(99.1 KiB) Downloaded 322 times
zephyr
Posts: 1474
Joined: Mon Jul 21, 2008 1:18 am

Re: Load/Save a machine code program

Post by zephyr »

Here's the same utility for the Dragon 64, and 64K expanded Dragon 32. These work in exactly the same way, but the main routine is copied to high RAM to avoid being overwritten. Same instructions for use as above, except for the EXEC2630, which is no longer applicable.

Code: Select all

0 'PEEKBIN64 V1.0
1 'FOR THE DRAGON 64
2 'BY STEPHEN J WOOLHAM
3 '
10 CLS:PRINT"WRITING MACHINE CODE..."
20 FOR I=20480 TO 20595:READ A$:X=VAL("&H"+A$):CSUM=CSUM+X:POKEI,X:NEXT
30 CLS:IF CSUM<>12304 THEN PRINT"ERROR IN DATA LINES":END
40 PRINT"START ADDRESS = 20480"
50 PRINT"END ADDRESS = 20595"
60 PRINT"EXEC ADDRESS = 20480"
70 POKE144,2:POKE145,0:END
100 DATA 1A,50,8E,80,0,7F,FF,DE,EC,84,7F,FF,DF,ED,81,8C,FE,FF,25,F1,86,7E,B7,BA,86,CE,BF,49,FF,BA,87,8E,50,2C,A6,80
110 DATA A7,C0,8C,50,74,25,F7,39,FC,6,52,30,8D,0,2B,8D,19,FC,6,52,F3,6,54,83,0,1,30,8D,0,24,8D,A,FC,6,56,30,8D,0,21,8D
120 DATA 1,39,34,6,F,6F,BD,90,E5,35,6,BD,95,7A,86,D,7E,B5,4A,53,54,41,52,54,3A,20,0,45,4E,44,3A,20,0,45,58,45,43,3A,20,0

Code: Select all

0 'PEEKCAS64 V1.0
1 'FOR THE DRAGON 64
2 'BY STEPHEN J WOOLHAM
3 '
10 CLS:PRINT"WRITING MACHINE CODE..."
20 FOR I=20480 TO 20591:READ A$:X=VAL("&H"+A$):CSUM=CSUM+X:POKEI,X:NEXT
30 CLS:IF CSUM<>12247 THEN PRINT"ERROR IN DATA LINES":END
40 PRINT"START ADDRESS = 20480"
50 PRINT"END ADDRESS = 20591"
60 PRINT"EXEC ADDRESS = 20480"
70 POKE144,2:POKE145,0:END
100 DATA 1A,50,8E,80,0,7F,FF,DE,EC,84,7F,FF,DF,ED,81,8C,FE,FF,25,F1,86,7E,B7,BA,86,CE,BF,49,FF,BA,87,8E,50,2C,A6
110 DATA 80,A7,C0,8C,50,70,25,F7,39,FC,1,E7,30,8D,0,27,8D,15,DC,7E,83,0,1,30,8D,0,24,8D,A,FC,1,E5,30,8D,0,21,8D,1
120 DATA 39,34,6,F,6F,BD,90,E5,35,6,BD,95,7A,86,D,7E,B5,4A,53,54,41,52,54,3A,20,0,45,4E,44,3A,20,0,45,58,45,43,3A,20,0
Attachments
PEEKBIN64_PEEKCAS64.zip
(98.91 KiB) Downloaded 315 times
Post Reply