Le Temps et Dos/Bios

Le Temps et Dos/Bios - ASM - Programmation

Marsh Posté le 27-05-2005 à 10:50:25    

Salut les futurs amis je suis un nouveau,
 
Je sors tout juste de ma grotte où je cherche depuis 1991 un réponse à une question, et voila-t-y pas que je découvre internet et windows. Hum, voila ma question :
Sauriez-vous quelles sont les interruptions du Bios ou de DOS (mode réel 16 bit of course) qui permettent un timing au centième de seconde au moins, par exemple pour des animations, ou dans mon cas pour un sampler de PC Speaker ?
 
Le programme doit répéter exactement (il s'agit de musique, donc au centième de seconde près) ce que j'aurais joué préalablement au clavier (d'ordinateur bien entendu). J'avais utilisé les fonction d'heure système de T Pascal qui ne s'avèrent pas très précises au centième - d'où une mise en place pas très funky du coup.
 
Ou alors en admettant que mes outils sont un peu rrrooots (ce qui ne se fera pas facilement), quelles fonctions sous C++ et XP pour tout ça ?
 
Merci !  :)

Reply

Marsh Posté le 27-05-2005 à 10:50:25   

Reply

Marsh Posté le 27-05-2005 à 11:01:55    

bin faut savoir tu veux ça sous DOS ou sous Xp ?
 
de mémoire:
 
sous DOS pur, le mieux c'est de détourner le timer rapide, reprogrammer sa fréquence pour passer de 18.2 interruptions/secs à quelque chose vers le milier d'interruption, et faire un décompteur dans ta routine d'interruption pour appeller la précédente dans les 18.2hz.
 
sous Xp:
y'a les timers multimédia je crois pour un truc stable, voir msdn.
 
Dos sous Xp: mmmm... j'ai des doutes que la machine virtuelle n'introduise pas de glissement.


Message édité par bjone le 27-05-2005 à 11:02:23
Reply

Marsh Posté le 27-05-2005 à 11:45:43    

Au fait je suis encore débutant en assembleur... Qu'est-ce que le "timer rapide" ? Suis-je obligé de créer ma propre interruption ? Quels sont les noms des interruptions BIOS qui gèrent le temps ?
Tout ce que je cherche c'est quelque chose de plus précis que les fonction de Turbo Pascal 7 (qui sont celles du DOS aussi je crois).
 
ps: je fais tourner DOS sous win98, j'ai deux ordis différents donc pas de DOS sous XP.

Reply

Marsh Posté le 27-05-2005 à 13:47:56    

Personne sait ? :hebe:

Reply

Marsh Posté le 27-05-2005 à 14:02:11    

si tu veux éxécuter du code à une fréquence stable c'est par le timer rapide (irq 0) que tu le feras.
 
c'est pareil DOS sous w98, il peut y avoir des blagues, mais ça devrait être moins problématique que sous Xp.

Reply

Marsh Posté le 27-05-2005 à 14:29:52    

Citation :

si tu veux éxécuter du code à une fréquence stable c'est par le timer rapide (irq 0) que tu le feras.  


 
Et comment exactement ? Tu pourrais me poster un petit bout de code stp ?

Reply

Marsh Posté le 27-05-2005 à 15:16:19    

quand je serai chez moa :D

Reply

Marsh Posté le 27-05-2005 à 15:56:04    

ok j'attends ça avec fébrilité  :)

Reply

Marsh Posté le 27-05-2005 à 22:19:41    

le listing pour l'interruption en mode protégé sous Watcom C (avec dos4gw)
à toi d'adapter pour le mode réel
 

Citation :


;
;                                TIMER DRIVER
;                               --------------
;                               (C) BJOne 1998
;
;=============================================================================
 
.486p
 
.MODEL FLAT
 
INCLUDE MACROS.INC
 
;=============================================================================
 
Prec            EQU     2048                    ;2048 impulsions/sec
F8253           EQU     1193180                 ;freq du 8253  
Divider         EQU     F8253/Prec              ;Nouveau diviseur
BiosTicks       EQU     0FFFFh*Prec/F8253       ;rapport Bios/Nouveau
CmdReg8253      EQU     43h                     ;8253 registre de commande
TickReg         EQU     40h                     ;8253 registre de donn‚es
BiosTickAddr    EQU     0000046Ch               ;adresse lin‚aire du tick Bios  
 
;=============================================================================
 
_DATA SEGMENT DWORD PUBLIC 'DATA'                
      PUBLIC _TimerCounter
      _TimerCounter  dd  0
      BiosCounter    dd  BiosTicks
_DATA ENDS
 
;=============================================================================
 
_TEXT SEGMENT DWORD PUBLIC 'CODE'
      ASSUME CS:_TEXT,DS:_DATA
      PUBLIC Timer_Init_,Timer_Restore_
 
;-----------------------------------------------------------------------------
; Gestionnaire d'interruption, ne doit jamais ˆtre appel‚
 
Timer_Handler PROC NEAR
              push eax
              push edx
              mov edx,BiosCounter
              inc _TimerCounter
              dec edx
              jnz EOI
              mov edx,BiosTicks
              dw 05ffh                   ; inc étendu sur DWORD
              dd BiosTickAddr  
         EOI: mov al,20h
              mov BiosCounter,edx
              out 20h,al
              pop edx
              pop eax
              iretd
Timer_Handler ENDP
 
;-----------------------------------------------------------------------------
; Installe le vecteur d'interruption.
 
Timer_Init_  PROC NEAR              
             push eax
             push ebx
             push ecx
             push edx
             
             mov  ax,205h                  ; On installe le gestionnaire
             mov  bl,08h                   ;
             mov  cx,cs                    ;
             mov  edx,offset Timer_Handler ;
             int  31h                      ;
             
             cli
             mov  al,36h                  ;Counter 0 / Mode 3  
             out  CmdReg8253,al           ;
             mov  ax,Divider                
             out  TickReg,al              ;Diviseur LSB
             mov  al,ah
             out  TickReg,al              ;Diviseur MSB
             sti
             pop edx
             pop ecx
             pop ebx
             pop eax
             mov _TimerCounter,0          
             ret
Timer_Init_  ENDP
 
;-----------------------------------------------------------------------------
; Restaure l'état initial du Timer
; doit être appelé si vous voulez ne pas vous retrouver en l'an 2025
; au bout de 10 sec.
 
Timer_Restore_ PROC NEAR
               push ax
               cli
               mov  al,36h
               out  CmdReg8253,al
               mov  ax,0ffffh
               out  TickReg,al            
               mov  al,ah
               out  TickReg,al            
               sti
               pop ax
               ret
Timer_Restore_ ENDP
 
_TEXT ENDS
END
 


 
le header qui va avec:
 

Citation :


/*
 
                                TIMER DRIVER
                               --------------
                               (C) BJOne 1998
 
 
*/
 
#ifndef __TIMER_DRIVER__
#define __TIMER_DRIVER__
 
#define TMR_CST    2048
 
extern "C" unsigned long TimerCounter;
extern "C" void Timer_Init(void);
extern "C" void Timer_Restore(void);
 
#define TMR_Init() Timer_Init();         \
                   atexit(Timer_Restore)
 
#endif


 
 
un exemple d'utilisation avec mon timer et mon driver clavier maison (que je peux te poster le code mais ça servira à rien c'était pour faire un xwing sous dos)
tant que tu appuyais pas sur ESC, le truc boucle à afficher le compteur haute vitesse (2048hz) et le compteur bios (à 18.2hz)
 

Code :
  1. #include<stdio.h>
  2. #include"keyb.h"
  3. #include"timer.h"
  4. unsigned long *PBA=(unsigned long*)0x046C;
  5. main()
  6. {
  7. long last;
  8. KBD_Init();
  9. TMR_Init();
  10. TimerCounter=0;
  11. while(!KEYS[kESC]) printf("\n TC: %u, BC: %u",TimerCounter,PBA[0]);
  12. printf("\n Temps ‚coul‚: %f",(float)TimerCounter/TMR_CST);
  13. }


Message édité par bjone le 27-05-2005 à 22:23:20
Reply

Marsh Posté le 27-05-2005 à 22:26:23    

à oui j'oubliais: a toi d'adapter en mode réel et en plus d'inserer ce que tu veux faire.
 
après pour ce que tu veux il n'y a peut être pas forcément besoin de détourner le timer système, pour une animation tu peux boucler sans fin en retraçant ton animation et en mesurant ton temps par frame puis en actualisation les états de ton truc.
 
les timers qui te permettent d'éxécuter du code à une fréquence précise c'est plus pour la musique (player de mod/midi/pcspeaker etc etc...)

Reply

Marsh Posté le 27-05-2005 à 22:26:23   

Reply

Marsh Posté le 27-05-2005 à 22:28:54    

et oui et quand tu joues avec le timer rapide, il faut vraiment actualiser le la variable du bios (moi j'y allait à la bourrin en l'incrémentant directement), ou d'appeller l'ancienne routine (ce qui est plus propre après réflexion je suis que ce code marchait très bien :D)
 
si tu le fais pas, le temps du dos accélère, et tu peux générer des time-out à tire-larigot.

Reply

Marsh Posté le 28-05-2005 à 01:33:20    

:pt1cable:  
Je vais essayer de comprendre tout ça et je reviens demain la tête toute pleine
 :)

Reply

Marsh Posté le 29-05-2005 à 11:39:27    

tention y'a ptet des truc propres au mode protégé, ce qui est lié à l'int 31h c'est le serveur DPMI (dos4g/pmode)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed