sinus a écrit:
Petit bout de code pour déclarer le disque virtuel au système sans avoir à passer par le DOS 'iconique'.
Très bon début
sinus a écrit:
Je ne trouve pas de fonction qui le ferait sous Basic,
Il n'y en a pas, effectivement
Si tu le veux bien, nous allons reprendre ta routine point par point. Même si ton programme fonctionne parfaitement, il y a quelques corrections à faire.
Code:
ORG $9001
L'origine de ton programme se trouve en $9001, on peut comprendre pourquoi. Mais plutôt que de faire les opérations par le 6809 en utilisant l'octet en $9000 comme buffer temporaire, utilisons plutôt l'évaluateur de l'assembleur
Code:
PSHS PC,B,A
Pour commencer, il n'est pas nécessaire de préserver A et B pour le retour au Basic. Le Basic exige cependant de préserver les registres S, DP et éventuellement CC si les bits de contrôle des interruptions F et I ont été altérés. Mais ça n'est pas le cas. Donc pas besoin d'empiler.
... et il est inutile d'empiler PC non plus. Et même dangereux. Il est étonnant que ton programme fonctionne malgré tout. Le registre PC a déjà été empilé lors du branchement au programme par le Basic. Au sortir du programme, c'est bien cette adresse qui doit être récupérée par le PULS PC ou le RTS. Dans un cas général, on n'empile jamais le registre PC par un PSHS... sauf lorsqu'on veut écraser de la mémoire
En conclusion, pour bien faire, il aurait fallu que tu mettes 'PSHS A,B' en entrée et 'PULS A,B,PC' en sortie.
Code:
LDA #$98
LDB #$05 = taille 'V' du disque virtuel ( 0<=V<=5 ici V=5 donc disque 320Ko)
STB $9000
ADDA $9000
STA $60CD
Les 5 bits de poids fort du registre $60CD sont définis par la configuration matérielle de l'ordinateur : présence d'un floppy, d'un QDD, du nanoréseau, de l'extension mémoire et du crayon optique. Pour un TO9+, ces bits ont peu de chance de changer, c'est vrai. Mais sur un TO8, par exemple, il est possible qu'ils soient différents. Il est préférable alors de lire le registre, masquer les bits de configuration que l'on ne veut pas toucher, ajouter les bits que l'on veut changer et réécrire le registre. C'est la façon la plus 'propre' d'opérer.
Code:
LDA #$1F
LDB $9000
ASLB
ASLB
STB $9000
SUBA $9000
STA $6047
Tout ça pourrait être avantageusement remplacé en utilisant simplement l'évaluateur de l'assembleur
Qui plus est, d'autres registres doivent être initialisés dans la foulée, effectivement le registre $618C qui doit comporter le nombre de banques disponibles, mais aussi $6130 qui doit comporter la banque pour CLEAR et $614D qui doit comporter la banque pour BANK ("Désassemblage de l'Extramoniteur" par Obsidian).
Code:
PULS A,B,PC
END
La directive 'END' a la particularité d'accepter une opérande : l'adresse d'exécution du programme binaire. Ce qui permet ensuite de le lancer sous Basic par LOADM"fichier",,R. Pratique. Encore faudrait-il définir une étiquette pour l'exécution du programme.
Programme assembleur récpitulatif :Code:
Routine déclaration Disque Virtuel 320Ko sur système TO 512Ko RAM
DVIRTUEL.BIN
RAMSIZ EQU $05 Taille du RAMDISK par tranche de 64ko
ORG $9000
DEBUT EQU *
* Déclare le RAMDISK
LDB >$60CD Lit le registre de configuration matérielle
ANDB #$F8 Masque les autres bits
ORB #RAMSIZ Ajoute la taille du RAMDISK
STB >$60CD Ecrit le registre de configuration matérielle
* Mise à jour des registres relatifs aux banques
LDB #$1F-(RAMSIZ<2) Calcule dernière banque libre
STB >$6047 Initialise dernière banque libre
DECB Ajuste nombre de banques libres
STB >$618C Sauve nombre de banques
STB >$614D Pour instruction BANK
STB >$6130 Pour instruction CLEAR
* Formatage du RAMDISK
LDB #$04 ! Initialise le
STB >$6049 ! numéro de disquette
JSR >$E00A Formatage par le Moniteur
* Déclare le RAMDISK comme device par défaut
LDB #$84 Numéro de disque + flag disquette ($80)
STB >$6768 Déclare le RAMDISK en DEVICE
* Retour au Basic
RTS
END DEBUT
Citation:
lançable en BASIC par:
Code:
LOADM"DVIRTUEL.BIN"
EXEC &H9001
Lançable désormais par LOADM"DVIRTUEL",,R ... et en n'oubliant pas le CLEAR,&H9000 qui évitera de crasher la pile Basic
Programme Basic récpitulatif :Pour le programme Basic correspondant au programme assembleur, il est effectivement préférable d'utiliser des variables avec un seul caractère (A-Z), car elles sont stockées en mémoire non-commutable, au contraire des variables de nom plus complexe qui sont stockées à partir de la dernière banque RAM libre. Ca évite de les perdre quand on bidouille avec les espaces RAM
Les instructions Basic nous permettent en plus de donner un nom au RamDisk, qui est classiquement "Ram Disk". On se retrouve donc avec un RamDisk en tout point équivalent à celui créé par Réglage et Préférences.
La ligne 0 contient toute la commande de sauvegarde. Quand tu voudras sauvegarder ton fichier, fais simplement un LIST0, puis après avoir effacé le '0', l'espace et l'apostrophe, il suffira d'appuyer sur ENTREE. A la fin de cette ligne, il arrive que certains ajoutent ':RUN', ce qui permet en même temps de sauvegarder et de lancer le programme (petite astuce de programmeurs).
Code:
0 'SAVE"0:DIVRTUEL"
10 V=5
20 B=&H1F-(4*V)
30 POKE&H60CD,(PEEK(&H60CD)AND&HF8)+V
40 POKE&H6047,B
50 POKE&H618C,B-1
60 POKE&H614D,B-1
70 POKE&H6130,B-1
80 DSKINI4,,"Ram Disk"
90 DEVICE"4:
100 PRINT"DISQUE VIRTUEL";V*64;"Ko"
... et même avec tout ça, je ne suis pas sûr d'avoir été exhaustif
Si un bug est découvert, vous savez tous où me joindre.
sinus a écrit:
J'aurais bien mis tout ça dans un autre sujet, mais PhpBB me retourne des erreurs... 'sais pas pourquoi...
Ne t'inquiète pas pour ça : de mon côté, je n'ai toujours pas reçu de mail supposé m'avertir qu'une réponse a été postée. Heureusement que je suis allé faire un tour sur LogicielsMoto aujourd'hui (enfin hier, maintenant), sinon tu aurais dû encore attendre...
En tout cas, c'est un bon début. Continue !