GFA
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Cartes Pokémon EV6.5 : où trouver le Bundle Lot 6 Boosters Fable ...
Voir le deal

Sauvegarde, initialisation et restauration système

Aller en bas

Sauvegarde, initialisation et restauration système Empty Sauvegarde, initialisation et restauration système

Message par Shadow272 Lun 23 Nov - 11:04

Sauvegarde, initialisation et restauration système
Par Strider

Lorsque l'on débute un nouveau jeu ou une nouvelle démo, rien de plus fastidieux que d'écrire toujours les mêmes routines de sauvegarde et de réinitialisation du système.

Je vous propose quelques procédures qui vont vous simplifier la vie, sans être forcément exaustives (il n'y a pas la gestion de la mémoire globale ou la restauration du système sonore par exemple). J'ai fait un peu de ménage dans le code et j'ai ajouté pas mal de commentaires pour qu'un débutant s'y retrouve. Pas testé pour voir si ça compile toujours, mais vous devriez quand même vous en sortir Wink

Ce que font ces lignes :
- sauvegarde d'une partie de l'état du système : résolution de l'écran, palette, adresses des écrans logique et physique, etc.
- initialisation : tests système, réservation d'écrans avec MALLOC
- restauration : on remet la bonne résolution, la bonne palette, etc.

Quelques procédures/fonctions peuvent être utilisées ailleurs :
- passage mode utilisateur/superviseur
- détermine le type de machine d'après la Cookie Jar
- définit une palette dont les 16 couleurs sont noires (utile pour les démos et les jeux)

[Vous devez être inscrit et connecté pour voir ce lien] :

Code:

' =============================================================================
' Procedures systeme
' =============================================================================
'
' à appeler dans cet ordre au début du programme :
' @sauve_systeme
' @init_systeme
'
' ensuite juste avant de quitter le programme :
' @restaure_systeme
' @exit
'
> PROCEDURE sauve_systeme
  @sauve_palette
  sys_keyclic|=PEEK(&H484)
  sys_vbl%=LPEEK(&H4D2)
  sys_phy%=XBIOS(2)
  sys_log%=XBIOS(3)
RETURN
> PROCEDURE init_systeme
  @super
  ' coupe le clic clavier
  SPOKE &H484,sys_keyclic| AND NOT 1
  '
  ' Détermine le chemin courant suivant le mode de démarrage (compilé ou interprêté)
  sys_compiled!=BYTE{BASEPAGE+256}<>96
  IF sys_compiled!
    sys_chemin$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)+"\"
  ELSE
    sys_chemin$="E:\CODING\TEST\"
  ENDIF
  '
  ' Dégage la souris
  OUT 4,18
  HIDEM
  '
  ' Teste si c'est un Falcon ou pas
  sys_test_mch&=@cookie_mch
  IF sys_test_mch&=6
    ' C'est un Falcon, on sauve l'ancien mode vidéo
    sys_sauv_mode%=XBIOS(88,-1)
    ~XBIOS(5,L:-1,L:-1,W:0)
  ELSE
    ' On demande au GEM si la taille de l'écran est supérieure ou égale à 320
    ' A ne pas utiliser depuis le dossier AUTO, le GEM doit être initialisé avant !
    IF WORK_OUT(0)=>320
      ~XBIOS(5,L:-1,L:-1,W:0)
      sys_change_resol!=TRUE
    ELSE
      sys_change_resol!=FALSE
    ENDIF
  ENDIF
  '
  ' Réservation d'espace pour les écrans (physique et logique)
  ' 2 x 32 Ko + 256 octets = 64256 octets
  les_ecrans%=MALLOC(64256)
  ' Les écrans doivent être sur une adresse multiple de 256 (sinon plantage sur ST/STF)
  buffer1%=AND(ADD(les_ecrans%,256),&HFFFFFF00)
  buffer2%=ADD(buffer1%,32000)
  '
  ' Redéfinition des écrans (logique et physique)
  ~XBIOS(5,L:buffer2%,L:buffer1%,W:-1)
RETURN
> PROCEDURE super
  ' Passage en mode superviseur
  super%=GEMDOS(32,L:0)
RETURN
> PROCEDURE user
  ' Passage en mode utilisateur
  ~GEMDOS(32,L:super%)
RETURN
> FUNCTION cookie_mch
  ' Détermine le type de machine
  ' Par défaut : ST/STF (pas de cookie list)
  resultat&=1
  adr_cookie_jar%=LONG{&H5A0}
  IF adr_cookie_jar%>0
    adr_courante%=adr_cookie_jar%
    adr_maxi%=adr_cookie_jar%+256
    text_cookie$=MKL$(LONG{adr_cookie_jar%})
    WHILE text_cookie$<>"_MCH" AND adr_courante%<adr_maxi%
      ADD adr_courante%,8
      text_cookie$=MKL$(LONG{adr_courante%})
    WEND
    IF text_cookie$="_MCH"
      ADD adr_courante%,4
      valeur%=LONG{adr_courante%}
      IF BTST(valeur%,17)
        IF BTST(valeur%,16)
          resultat&=6
        ELSE
          resultat&=5
        ENDIF
      ELSE IF BTST(valeur%,16)
        IF BTST(valeur%,0)
          resultat&=3
        ELSE IF BTST(valeur%,5)
          resultat&=4
        ELSE
          resultat&=2
        ENDIF
      ENDIF
    ENDIF
  ENDIF
  RETURN resultat&
ENDFUNC
'
> PROCEDURE restaure_systeme
  ' Restaure le clic clavier, s'il était défini
  SPOKE &H484,sys_keyclic|
  '
  ' Restaure la bonne résolution
  IF sys_test_mch&=6
    ' Dans ce cas c'est un Falcon
    ~XBIOS(5,L:sys_log%,L:sys_phy%,W:-1)
    ~XBIOS(5,L:-1,L:-1,W:3,sys_sauv_mode%)
  ELSE
    IF sys_change_resol!
      ' On repasse en moyenne résolution
      ~XBIOS(5,L:sys_log%,L:sys_phy%,W:1)
    ELSE
      ' On était déjà en moyenne résolution
      ~XBIOS(5,L:sys_log%,L:sys_phy%,W:-1)
    ENDIF
  ENDIF
RETURN
> PROCEDURE exit
  CLS
  @restaure_palette
  VSYNC
  '
  ' Restaure la souris
  OUT 4,8
  SHOWM
  '
  ' Libère la mémoire
  ~MFREE(buffer.temporaire%)
  ~MFREE(les_ecrans%)
  ~MFREE(buffer_zik_2%)
  ~MFREE(buffer_zik_1%)
  '
  ' Repasse en mode utilisateur puis quitte
  @user
  IF sys_compiled!
    SYSTEM
  ELSE
    EDIT
  ENDIF
RETURN
> PROCEDURE init_palettes
  ' On définit une palette toute noire
  sys_black$=MKI$(&H0)
  FOR i&=1 TO 15
    sys_black$=sys_black$+MKI$(&H0)
  NEXT i&
RETURN
> PROCEDURE black
  BMOVE V:sys_black$,&HFFFF8240,32
RETURN
> PROCEDURE sauve_palette
  ' Sauvegarde la palette système
  LOCAL i|
  sys_palette$=""
  FOR i|=0 TO 15
    sys_palette$=sys_palette$+MKI$(XBIOS(7,i|,-1))
  NEXT i|
RETURN
> PROCEDURE restaure_palette
  ' Restaure la palette système
  ~XBIOS(6,L:V:sys_palette$)
RETURN
Shadow272
Shadow272
Admin

Messages : 329
Date d'inscription : 28/12/2017
Age : 65
Localisation : Hainaut Belgique

http://toutatari.blog4ever.xyz/

Atlantis aime ce message

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum