C64 LOAD / SAVE

C'est le lieu des discussions diverses et variées, mais toujours en rapport avec le thème général du forum et dans l'esprit de celui-ci. Contient des rubriques électroniques.

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
frktaunus
Messages : 1148
Inscription : 08 mai 2019 11:23
Localisation : LILLE

C64 LOAD / SAVE

Message par frktaunus »

J'ai sauvé une disquette C128 de 1987 qui contenait un ensemble de programmes que j'ai écrit,
s'appelant les uns les autres, par la commande "RUN [nom du programme]".
Cette commande fait un LOAD du programme et le RUN, bien pratique (basic 7)

Je fais de l'archéologie dans mes programmes sur K7 de 1986, pour le commodore 64.
J'ai retrouvé la version K7 de ces programmes. Et je fais la même chose sans cette commande qui n'existe pas en basic 2.
J'ai écrit cela:

Code : Tout sélectionner

40 POKE53280,0:POKE53281,0:PRINT"{clr}{down}{down}{cyan}"
50 PRINTTAB(10)"{rvson} CHARGEMENT EN COURS "
60 FORA=631TO640:READB:POKEA,B:NEXTA
70 DATA76,207,13,83,217,55,54,56,48,13
80 POKE198,10:PRINT"{black}"
90 FORTN=0TO400:NEXTTN:END
En fait, je met tout en noir, fond et bord, je print "Chargement en cours"
et je poke 10 valeurs dans le buffer clavier (631 et suite)
Je poke 10 dans 198, indique la taille utilisée dans le buffer, soit les 10 caractères placés.
Je mets les écritures en noir pour que plus rien ne soit lisible à l'écran.
Une boucle d'attente et fin du programme.

Le buffer clavier se vide alors à l'écran comme si on tapait les commandes, soit :
76+207+13 = abréviation de LOAD + "Enter"
La data cassette se remet en marche pour charger le programme suivant sur la bande.
A la fin du chargement, il rend la "main" (Ready)

Ensuite arrivent les autres caractères restant du buffer:
83+217 = abréviation de SYS, appel d'une routine en langage machine
55+54+56+48 = adresse de la routine soit 7680 (1E00) correspond à une adresse dans la RAM réservée au basic (0800-9FFF)
13 = "Enter" pour exécution

Le programme suivant s'exécute donc, en LM à partir de l'adresse 1E00
Je ne trouve PAS comment cela ce fait que le programme suivant (qui n'est pas en basic) de la K7 se soit chargé à cette adresse 1E00.
LOAD et SAVE du basic v2 n'ont pas de paramètres pour cela.
Je ne me souvient plus de la méthode que j'ai utilisé. Une idée?
Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Avatar de l’utilisateur
frktaunus
Messages : 1148
Inscription : 08 mai 2019 11:23
Localisation : LILLE

Re: C64 LOAD / SAVE

Message par frktaunus »

Trouvé sur https://www.c64-wiki.com/wiki/LOAD

Code : Tout sélectionner

LOAD "*",8,1
The "secondary number" specifies how the data should be loaded:
,0 The program will be loaded to the start address of BASIC memory (2049/$0801).
,1 The program will be loaded absolute, namely it is stored to the location defined by the first two bytes in the PRG file image.
Typically needed for machine language programs to get properly located into the memory.
Pour la datacassette, on aurait donc

Code : Tout sélectionner

LOAD "*",1,1
En essai manuel, ca charge correctement, LIST ne donne rien, mais l'appel avec SYS7680 lance bien le programme

Il semble donc que "LOAD" émis sans aucun paramétre, charge de la K7 un programme basic en début de mémoire basic, et si il trouve un programme en LM, il le charge à l'endroit d'origine de ce programme, grâce aux 2 bits d'entête du dit programme.
Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: C64 LOAD / SAVE

Message par hlide »

2 bits ou 2 bytes du dit programme ?
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: C64 LOAD / SAVE

Message par Daniel »

D'où l'intérêt de parler français, pour ne pas confondre octet avec bit :lol:
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13253
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: C64 LOAD / SAVE

Message par Carl »

The first two bytes are the memory location: $0801. The rest of the data breaks down as follows:

Table 1. BASIC program breakdown

Memory Locations Value
$0801-$0802 2-byte pointer to the next line of BASIC code ($080C).
$0803-$0804 2-byte line number ($000A = 10).
$0805 Byte code for the SYS command.
$0806-$080A The rest of the line, which is just the string " 2064".
$080B Null byte, terminating the line.
$080C-$080D 2-byte pointer to the next line of BASIC code ($0000 = end of program).
That's 13 bytes. We started at 2049, so we need 2 more bytes of filler to make our code actually start at location 2064. These 17 bytes will give us the file format and the BASIC code we need to have our machine language program run.
Carl
Avatar de l’utilisateur
frktaunus
Messages : 1148
Inscription : 08 mai 2019 11:23
Localisation : LILLE

Re: C64 LOAD / SAVE

Message par frktaunus »

Daniel a écrit : 16 juin 2020 08:19 D'où l'intérêt de parler français, pour ne pas confondre octet avec bit :lol:
oui, désolé, on va revenir aux octets! ;)

Merci CARL pour la structure d'un programme basic en mémoire. Cela est utile.

Documentation du MONITEUR C128
COMMAND: S
PURPOSE: Save an area of memory onto tape or disk.
SYNTAX: S <"file name">, <device>, <address 1>, <address 2>
<"file name"> Any legal Commodore 128 file name. To save the data the name must be enclosed in double quotes. Single quotes cannot be used.
<device> A hexadecimal number indicating on which device the file is to be placed. Cassette is 1; disk is 8, 9, etc.
<address 1> Starting address of memory to be saved.
<address 2> Ending address of memory to be saved + 1. All data up to, but not including the byte of data at this address, is saved.
The file may be recalled, using the L command. When saving to cassette only bank 0 can be saved from.

EXAMPLE: S "GAME",8,0400,0C00
Saves memory from $0400 to $0C00 onto disk.
C'est ce que j'ai dû utiliser à l'époque. (donc j'état déjà passé au C128, mais je n'avais pas encore le lecteur de disquette, ou alors j'ai utilisé un moniteur sous C64)
il faut que je refasse un essai sur disquette et que je lise en bas niveau pour voir si les 2 premiers octets sont l'adresse d'origine en mémoire.
Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Avatar de l’utilisateur
frktaunus
Messages : 1148
Inscription : 08 mai 2019 11:23
Localisation : LILLE

Re: C64 LOAD / SAVE

Message par frktaunus »

Petit essai, je cale la K7 juste avant le fichier LM. je tape LOAD, press play on tape, comme on voit sur les t-shirts,
et cela trouve et charge un fichier.
Si je fais LIST, il n'y a rien, normal, les données sont plus haut en mémoire. Sur ce, je fais SAVE "monfichier",8 et cela sauve quelque chose sur la disquette.
Le répertoire de cette dernière montre un fichier de 77 blocs.
J'éteint la machine pour être sûr de vider la mémoire, et je tape LOAD "monfichier",8, cela charge le fichier. LIST ne donne toujours rien, je tape SYS7680 et le programme se lance nickel.

Conclusion, après un LOAD, le C64 doit avoir quelque part en mémoire l'adresse de début et l'adresse de fin ou la longueur de ce qu'il a chargé.
Ce qui a permis au SAVE émis juste après de sauver correctement le fichier.
Il faut que je sorte les grosses documentations pour trouver les adresses utilisées.
Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Répondre