Sauvegarde, initialisation et restauration système
GFA :: Programmation :: Utilitaires
Page 1 sur 1
Sauvegarde, initialisation et restauration système
Sauvegarde, initialisation et restauration système
Par Strider
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
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
Atlantis aime ce message
GFA :: Programmation :: Utilitaires
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|