Pl2 BIOS.DOC/fr

From Atari Wiki
Jump to navigation Jump to search

                          --------------------
                             CHAPITRE NR° 6
     
                            LES FONCTIONS DU

                           BIOS et de l'XBIOS

                          -------------------- 




                      *** LES FONCTIONS DU BIOS ***
                      -----------------------------

- Toutes les remarques précédentes conscernant les fonctions du GEMDOS 
  sont encore valables pour les fonctions du BIOS:
  
  .Initialisation indispensable (SETBLOCK)
  .Mode de transmission des paramètres par le pile système.
  .Retour de certaines valeurs dans certains registres.
  
  Le nr° de TRAP qui correspond aux fonctions du BIOS est: TRAP #13


- Je vais maintenant enumérer et commenter les fonctions du BIOS qui sont
  utiles ou intéressantes.(tout comme pour les fonctions du GEMDOS...)





$04 (RWABS),MOT=unité de disquette,MOT=nr°secteur début,MOT=nombre de sec-
---         teurs à lire ou à écrire,L-M=adresse d'un tampon,MOT=mode

RWABS permet d'écrire ou lire des secteurs sur disquette.

Les paramètres à passer sont:

1°:Le nr° de l'unité de disquette conscernée:
   0=Drive A,1=Drive B,2=Disque dur
2°:Le nr° du secteur ou RWABS doit débuter l'opération
3°:Le nombre de secteurs à lire ou à écrire
4°:L'adresse du tampon de données à lire ou à écrire selon le cas.
   La taille d'un secteur est de 512 octets.
5°:Le mode d'action de RWABS:
   0=lecture des secteurs
   1=écriture des secteurs
   2=lecture (ne tient pas compte d'un changement de disquette lors de 
     l'opération)
   3=écriture (ne tient pas compte d'un changement de disquette lors de
     l'opération)

RWABS retourne dans d0 une valeur nulle si tout est OK, ou un code 
d'erreur négatif dont la valeur peut ètre:

 -1=plantage
 -2=lecteur non prêt
 -3=ordre inconnu
 -4=erreur CRC  
 -5=ordre incorrect 
 -6=piste non trouvée
 -7=bootsector endommagé
 -8=secteur non trouvé
-10=erreur d'écriture
-11=erreur de lecture
-13=disquette protégée en écriture
-14=disquette changée pendant la lecture ou l'écriture
-15=périphérique inconnu
-16=vérification d'un secteur mal écrit
-17=pas de disquette
  
          MOVE      #0,-(SP)       ;DRIVE A
          MOVE      #0,-(SP)       ;début au secteur 0 
          MOVE      #10,-(SP)      ;10 secteurs
          PEA       tampon         ;adresse des données
          MOVE      #1,-(SP)       ;écriture
          MOVE      #4,-(SP)
          TRAP      #13
          ADDA.L    #14,SP

          DATA

tampon    DS.B      5120     ; les données à écrire sur les 10 secteurs
                             ; 10 secteurs=512*10 octets 


$05 (SETEXEC),L-M=valeur du nouveau vecteur,MOT=nr° du vecteur à changer
---
SETEXEC permet de changer la valeur d'un vecteur d'exeption.
(J'expliquerais en détail dans un chapitre sur les VECTEURS D'EXEPTION)

     PEA       nouveau        ;nouvelle adresse
     MOVE      #10,-(SP)      ;10=instruction illégale
     MOVE      #5,-(SP)
     TRAP      #13
     ADDA.L    #8,SP

$09 (MEDIACH),MOT=nr° du drive
---
MEDIACH permet de savoir si une disquette a été sortie ou introduite dans
le lecteur de disquette dont on spécifie le nr°. (0=Drive A,1=Drive B...)
Cette fonction marche seulement si la disquette n'est PAS protégée en 
écriture...

D0 retourne avec:

0 si la disquette a été maintenue. 
1 si la disquette a des chances d'avoir été changée (incertain).
2 si la disquette a été changée.  
 
MEDIACH oppère un test depuis le début de l'execution du programme et à
intervalles réguliers.
(Regardez la lumiére du LED rouge du lecteur de disquette clignoter très
faiblement à intervalles réguliers quand le lecteur est au repos...)
 
CHANGED   MACRO     $\1       ;MACRO à 1 paramètre (MEDIACH)
          MOVE      \1,-(SP)  ;\1=nr° du drive à tester
          MOVE      #9,-(SP)
          TRAP      #13
          ADDQ.L    #4,SP     ;retour dans d0
          ENDM

     Exemple d'utilisation:

          CHANGED   #1        ;la disquette du drive A a-t-elle été 
                              ;changée?


$0A (DRVMAP),pas de paramètre
---
Cette fonction retourne dans d0 les différents lecteurs de disquettes
connectés.
Le bit nr°X de d0 est actif quand le drive nr°X est disponible.
(0=Drive A,1=Drive B...)

NBD  MACRO
     MOVE      #$A,-(SP)
     TRAP      #13
     ADDQ.L    #2,SP
     ENDM

     Exemple d'utilisation:

     NDB

si d0.B retourne %00001001,les lecteurs A et D sont disponibles.
(On peut tester les bits de d0 avec BTST #X par exp. pour savoir si un
lecteur X est disponible...)


$0B (GETSHIFT),MOT=-1
---
GETSHIFT permet d'obtenir l'état de certaines touches qui peuvent pas 
être détectées par les autres fonctions d'attente de touche.

Il faut passer à GETSHIFT un mot=-1 par l'intermédiaire de la pile 
système pour obtenir dans d0.B un octet dont les bits ont la signi-
fication suivante: 
  
nr° du bit: Signification 

0         :Shift de droite
1         :Shift de gauche
2         :Control
3         :Alternate
4         :Caps Lock
5         :Clr/Home (ou touche droite de la souris)
6         :Insert   (ou touche gauche de la souris)

Si le bit est actif,la touche correspondante est activée.

GETSHIFT  MACRO     $\1       ;MACRO a 1 paramètre
          MOVE      \1,-(SP)  ;\1=-1 pour l'état des touches
          MOVE      #$B,-(SP)
          TRAP      #13
          ADDQ.L    #4,SP
          ENDM

     Exemple d'utilisation:

test      GETSHIFT
          BTST      #2,D0     ;a-t-on enfoncé la touche Control ?
          BEQ       test      ;si Bit=0:Z=1=non=retest




                    *** LES FONCTIONS DU XBIOS ***
                    ------------------------------     

- Toutes les remarques précédentes conscernant les fonctions du BIOS 
  sont encore valables pour les fonctions du XBIOS:
  
  .Initialisation indispensable (SETBLOCK)
  .Mode de transmission des paramètres par le pile système.
  .Retour de certaines valeurs dans certains registres.
  
  Le nr° de TRAP qui correspond aux fonctions du BIOS est: TRAP #14


- Je vais maintenant enumérer et commenter les fonctions du XBIOS qui 
  sont utiles ou intéressantes.(tout comme pour les fonctions du BIOS...)


$02 (PHYSBASE),pas de paramètre
---
PHYSBASE donne dans a0 le début de la mémoire RAM écran physique.

PHYSBASE  MACRO
          MOVE      #2,-(SP)
          TRAP      #14
          ADDQ.L    #2,SP
          ENDM

$03 (LOGBASE),pas de paramètre
---
LOGBASE donne dans a0 le début de la mémoire RAM écran logique.

LOGBASE   MACRO
          MOVE      #3,-(SP)
          TRAP      #14
          ADDQ.L    #2,SP
          ENDM

Pour les fonctions PHYSBASE et LOGBASE, je vous donnerais tous les détails
d'utilisation et de fonctionnement dans un programme exemple qui se sert
de ces 2 fonctions.


$04 (GETREZ),pas de paramètre
---
GETREZ permet d'obtenir dans d0 la résolution actuelle de l'écran.

0=Basse résolution (320*200 pixels en 16 couleurs)
1=Moyenne résolution (640*200 pixels en 4 couleurs)
2=Haute résolution (640*400 pixels en monochrome)

GETREZ    MACRO
          MOVE      #4,-(SP)
          TRAP      #14
          ADDQ.L    #2,SP
          ENDM

  
$05 (SETSCREEN),MOT=résolution,L-M=physbase,L-M=logbase
---
SETSCREEN permet de modifier la résolution de l'écran,l'adresse de la 
physbase et l'adresse de la logbase.
Si un de ces paramètre ne doit pas ètre modifié, il faut passer le 
paramètre -1 à la fonction.

SETSCREEN      MACRO     $\1,$\2,$\3    ;MACRO à 3 paramètres
               MOVE      \1,-(SP)       ;\1=REZ
               MOVE      \2,-(SP)       ;\2=PHYSBASE
               MOVE      \3,-(SP)       ;\3=LOGBASE
               MOVE      #5,-(SP)
               TRAP      #14
               ADDA.L    #12,SP
               ENDM

     Exemple d'utilisation:

     SETSCREEN  #1,#-1,#-1

     On passe en moyenne résolution.

ATTENTION, passer en résolution inférieure (par exp. de Moyenne résolution
en Basse résolution) ne permet que de disposer du nombre maximum de coul-
eurs du mode d'appel.(dans notre exp.,4 couleurs en Basse résolution...)
  

$06 (SETPALETTE),L-M=adresse de la nouvelle palette
---
SETPALETTE permet de changer les couleurs de la palette actuelle avec les
couleurs qui se trouvent à l'adresse pointée par l'adresse paramètre.
Les valeurs qui définissent les différentes couleurs doivent ètres des 
MOTS et il doit y en avoir 16.
Le 1° mot définit la couleur 0,le 2° mot la couleur 1 etc..

PALETTE   MACRO     $\1       ;MACRO à 1 paramètre
          PEA       \1        ;\1=adresse de la nouvelle palette.
          MOVE      #$6,-(SP)
          TRAP      #14
          ADDQ.L    #6,SP
          ENDM

     Exemple d'utilisation:

          PALETTE   couleurs

          DATA

couleurs  DC.W      $000,$077,$070,$700,$234,$123,$700,$444
          DC.W      $444,$000,$777,$700,$070,$007,$050,$777

NB:Pour définir aisement une couleur on utilise le mode héxadécimal:
-- Le chiffre des centaines représente la quantité de Rouge (de 0 à 7)
   Le chiffre des dixaines représente la quantité de Vert (de 0 à 7)
   Le chiffre des unités représente la quantité de Bleu (de 0 à 7)

Ainsi: $000=couleur noire
       $777=couleur blanche
       $700=couleur Rouge vif 
       $070=couleur Vert clair ...



$07 (SETCOLOR),MOT=nouvelle couleur,MOT=nr° de la couleur (0 à 15) à
---            changer.

SETCOLOR permet de ne changer qu'une couleur dont on fournit le nr° (de 0
à 15).
Il faut d'abord fournir à SETCOLOR la valeur que devra prendra la couleur
à changer.

COLOR     MACRO     $\1,$\2   ;MACRO à 2 paramètres.
          MOVE      \1,-(SP)  ;\1=valeur à prendre
          MOVE      \2,-(SP)  ;\2=nr° de la couleur à changer
          MOVE      #7,-(SP)
          TRAP      #14
          ADDQ.L    #6,SP
          ENDM

     Exemple d'utilisation:

     COLOR     #$777,#1

La couleur nr°1 sera blanche ($777)

$08 (FLOPRD),MOT=nombre de secteurs (1 à 9),MOT=face,MOT=nr° piste (0-79 
---          ou 0-40),MOT=nr° du 1° secteur à lire (1-9),MOT=Drive,MOT=0,
             L-M=adresse du tampon pour déposer les données.

FLOPRD permet de lire des secteurs sur disquette et dépose les données 
lues dans un tampon.

Les paramètres à passer sont:

1°:Le nombre de secteurs à lire à la suite dans une piste (de 1 à 9)
2°:La face du disk conscernée (0=face A,1=face B pour les doubles faces)
3°:Le nr° de la piste à lire (0 à 79 ou 0 à 40 suivant le formatage)
4°:Le nr° du 1° secteur à lire (de 1 à 9)
5°:Le nr° du Drive conscerné (1=A,2=B...)
6°:Un mot=0
7°:L'adresse d'un tampon ou les données seront déposées, d'une taille de
   (512 octets )*( le nombre de secteurs lus )
   Le tampon doit ètre situé à une adresse PAIRE.

D0 retourne avec une valeur nulle si tout est OK ou avec les codes 
d'erreur négatifs de RWABS.

Pour obtenir quelquechose de valable il faudra bien sur là aussi mettre
cette fonction dans une boucle et faire varier les paramètres qui doivent
être changés (nr° secteur...)
          


$0A (FLOPFMT),MOT=VIRGIN,L-M=$87654321,MOT=INTERLEAVE,MOT=face,MOT=nr° de
---           la piste,MOT=nombre de secteurs par piste,MOT=nr° Drive,MOT=
              0,L-M=adresse d'un tampon d'au moins 8 KO

FLOPFMT permet de formater une disquette, il suffit de passer les para-
mètres suivants à la fonction:

1°:Le VIRGIN (c'est la valeur qui sera écrite au cours du formatage)
   normalement,ce MOT=$E5E5
2°:Un L-M=$87654321 
3°:L'INTERLEAVE qui détermine l'ordre dans lequel les secteurs sont écrits
   Normalement ce MOT=1
4°:La face de la disquette à formater (0 ou éventuellement 1 pour les D.F)
5°:Le nr° de la piste à formater (0 à 79)
6°:Le nombre de secteurs par piste (normalement 9)
7°:Le nr° du Drive conscerné (0=A,1=B...)
8°:Un MOT=0
9°:L'adresse d'un tampon d'au moins 8 KO pour un formatage avec 9 secteurs
   par piste...
   Le tampon doit être situé à une adresse PAIRE.

D0 revient avec la valeur 0 si tout est OK ou avec un code d'erreur
négatif.


$11 (RANDOM),pas de paramètre
---
RANDOM donne un nombre aléatoir dans d0.L.
Les Bits 24 à 31 seront toujours nuls dans d0.

RANDOM    MACRO
          MOVE      #$11,-(SP)
          TRAP      #14
          ADDQ.L    #2,SP
          ENDM

NB:Pour Obtenir un nombre aléatoire compris entre 2 valeurs, on peut par
-- exemple appeller RANDOM et faire un ' AND.L  #max,d0 ' puis un 'ADD.L 
   #min,d0 ' si (max+min) est la valeur maximale et min la valeur mini-
   male voulue. 
   Le nombre ainsi obtenu sera <=(max+min) et sera >=min.

   C'est bien plus rapide que de faire plusieurs tests,plusieurs appels à
   la fonction RANDOM et des branchements conditionnels...


$14 (SCRDMP),pas de paramètre
---
SCRDMP permet de faire une HARDCOPY de l'écran actuel sur imprimante.

NB:Ceci s'obtient aussi en pressant [Alternate]+[Help] ...
--

HARDCOPY  MACRO
          MOVE      #$14,-(SP)
          TRAP      #14
          ADDQ.L    #2,SP
          ENDM


$16 (SETTIME),L-M=heure et date 
---
SETTIME permet de modifier l'heure ET la date de l'horloge du bureau GEM.

Le L-M paramètre a la configuration suivante:

bits  0- 4:secondes/2
bits  5-10:minutes
bits 11-15:heures
bits 16-20:jour
bits 21-24:moi
bits 25-31:(année-1980)

SETTIME   MACRO     $\1       ;MACRO à 1 paramètre
          MOVE.L    \1,-(SP)  ;\1=heure+date
          MOVE      #$16,-(SP)
          TRAP      #14
          ADDQ.L    #6,SP
          ENDM

     Exemple d'utilisation:

          SETTIME   #%00010000001000010001000000100001

bits  0- 4:%00001*2=2 secondes
bits  5-10:%000001=1 minutes  
bits 11-15:%00010=2 heures
bits 16-20:%00001=1 jour
bits 21-24:%0001=janvier
bits 25-31:%0001000=8+1980=1988


$17 (GETTIME),pas de paramètre
---
GETTIME retourne dans d0.L l'heure et la date selon le format précédent.

GETTIME   MACRO
          MOVE      #$17,-(SP)
          TRAP      #14
          ADDQ.L    #2,SP
          ENDM


$1A (JDSINT),MOT=nr° de l'interruption
---
JDSINT permet de bloquer l'interruption du MFP 68901 dont on indique
le nr°.

Nous utiliserons cette fonction dans le chapitre conscernant les 
interruptions.


$1F (XBTIMER),L-M=adresse de la routine,MOT=registre DATA,MOT=registre 
---           CONTROL,MOT=timer (A=0,B=1,C=2,D=3)

XBTIMER permet d'installer un programme sous interruption dans le TIMER 
dont on a indiqué le nr°.
Il suffit de passer les valeurs des registres DATA et CONTROL ainsi que
l'adresse du programme à la fonction.

Nous utiliserons XBTIMER quand nous parlerons des programmes sous inter-
ruption,patience...


$20 (DOSOUND),L-M=adresse des données
---
DOSOUND permet de jouer un son dont les données qui le définissent sont
pointée par l'adresse passée en paramètre dans le pile système.

La meilleur manière d'utiliser DOSOUND est de créer ses sons avec PRO
SOUND DESIGNER (Edité par TRIANGLE SOFTWARE):
Il possède un éditeur qui sauve les sons crées dans un fichier utilisa-
ble en assembleur (données DC.B).
Pour illustrer les capacités de DOSOUND, vous trouverez un programme
nommé SON.PRG (listing=SON.L) sur la disquette.


$23 (KEY RATE),MOT=répétition,MOT=retard
---
KEY RATE permet de controler la répétition des touches du clavier, le
paramètre 'répétition' indique le temps qui s'écoule entre 2 répétitions
de la touche, le paramètre 'retard' indique  le temps qui s'écoule avant
la mise en route de la répétition.
Les paramètre 'répétition' et 'retard' sont exprimés sous forme de
multiples de 20 ms.

Si un des 2 paramètres vaut -1, il n'est pas modifié et d0 retourne les
valeurs actuelles du retard et de la répétition sous cette forme:

Octet de poids faible de d0.W=répétition
Octet de poids fort de d0.W=retard

KEYRATE   MACRO     $\1,$\2   ;MACRO à 2 paramètres
          MOVE      \1,-(SP)  ;\1=répétition
          MOVE      \2,-(SP)  ;\2=retard
          MOVE      #$23,-(SP)
          TRAP      #14
          ADDQ.L    #6,SP
          ENDM


$25 (VSYNC),pas de paramètre
---
VSYNC permet de synchroniser certaines éditions graphiques en attendant
la prochaine interruption de trame.
VSYNC diminue le clignotement de l'écran dans certains cas o— la gestion
de l'écran est très chargée...


VSYNC     MACRO
          MOVE      #$25,-(SP)
          TRAP      #14
          ADDQ.L    #2,SP
          ENDM

$26 (SUPEXEC),L-M=adresse de la routine à executer en mode SUPERviseur
---
SUPEXEC permet l'execution d'une routine en mode superviseur, il suffit
de passer l'adresse de cette routine à SUPEXEC et de terminer la routine
par RTS.

     Exemple:

     PEA       ici       ;SUPEXEC 'ici'
     MOVE      #$26,-(SP)
     TRAP      #14
     ADDQ.L    #6,SP
     TERM              ;appel de la macro TERM du gemdos

ici  ANDI.W    #%1111111,SR   ;necessite le MODE SUPERVISEUR
     RTS




                              -----------------

Voilà pour ce qui est des fonctions du BIOS et de l'XBIOS, maintenant je
vous conseille très fortement de bien regarder le fichier MACROS.L qui 
contient les différentes macros que nous avons créé au cours de ces deux
derniers chapitres.
Au besoin, notez vous sur une fiche le nom des différentes MACROS et
leur utilité.

Quand vous vous sentirez prêts plongez dans les exercices, creusez vous
bien la tête pour chaque éxo., passez-y un jour ou deux s'il le faut,
ce n'est que par un travail individuel que vous pourrez progresser.

Ces exercices ne comportent pas de difficultés pour ceux qui connaissent
bien les instructions du 68000 et qui ont bien compris comment utiliser
les fonctions du GEMDOS,BIOS,XBIOS...
Utilisez le plus possible les MACROS que nous avons crées, elle ne sont
pas là pour rien...

Si vous êtes sur que votre listing est juste et que malgré tout il plante,
vous ne pourrez que vous en prendre à vous même.
Il suffit d'une minuscule petite erreur (qui passe souvent inaper‡ue),
comme mettre un L-M à la place d'un MOT ou faire une erreur dans les
modes d'adressage pour qu'un listing apparement correct plante à l'éxecu-
tion. (Bien que l'assembleur ne vous indique pas qu'il y a une erreur, il
est incapable de découvrir ces erreurs là: il ne détecte que les erreurs
grossières et les erreurs de syntaxe.) 

Il faudra alors aller à la chasse au BUG et ce n'est que si vous rentrez
bredouille, après 10 heures d'intense concentration que la correction du
listing vous sera vraiment utile.

Sachez bien qu'il n'y a pas plus minutieux et plus méticuleux qu'un bon
programmeur en assembleur:il ne laissera par le moindre octet trainer
dans son listing, et il est souvent plus fier de la perfection de son
listing que du résultat...

 BONNE CHANCE ...



  PIECHOCKI Laurent
  8,impasse Bellevue                        exercices dans:EXOS_2.DOC  
  57980 TENTELING                                          ----------


 



Back to ASM_Tutorial