Table des matières
Planet X3 - Part 2 - Loader
Ce programme charge et execute le “bon” module de jeu suivant la carte graphique détectée.
Description
Ce loader (très simple, il n'y a aucun “CALL”) effectue les opérations suivantes:
- construit 2 FCB simplifiés.
- réduire la taille de ram utilisé (par lui même) à 592 bytes (au lieu de 64kb).
- tente de détecter le type de carte graphique (en cas d'échec de détection, il lancera la version “CGA”).
- execute le module choisi
Analyse
comme ce programme est en réalité très court (82 octets de code, le reste est juste des structures FCB et un peu de ram), nous allons le désassembler complètement.
Il est “composé” de 4 parties distinctes:
FCB & réallocation mémoire
;******************************************************************************************************************** ;* Entry point * ;******************************************************************************************************************** start: MOV SP,Ofs_Stack ; create stack MOV word ptr [Cmd_Tails_Seg],DS ; complete "parameter block" MOV word ptr [FCB1_Seg],DS ; FCB 1&2 "creation" / Filling (for parameter block) MOV word ptr [FCB2_Seg],DS MOV AH,0x4a MOV BX,0x25 ;resize (free) memory block to 25h paragraph (592 bytes) INT 0x21 JC exit_loader
Ce block rempli quelques block mémoire pour permettre l'execution d'un sous programme. Le point d'orgue ici est la “réduction” de la mémoire de l'application à 592 bytes (pour libérer un maximum de mémoire au “vrai” programme.
Détection de la carte graphique
;******************************************************************************************************************** ;* Try to detect video card * ;******************************************************************************************************************** detect_video_card: MOV DX,local_PX3_cga ;default sub MOV AX,0x1a00 ;0x1a00 : Read display combinaison INT 0x10 ;VIDEO: try to detect video adapter CMP AL,0x1a ;0x1a : function not supported JNZ load_and_run_PX3 ;assume CGA sub CMP BL,0xff ;0xff : unknow display combinaison JZ load_and_run_PX3 ;assume CGA sub AND BL,0xf ;look only 4 lower bits CMP BL,0x6 ;<= 6 ? (0b0110) JBE load_and_run_PX3 ;assume CGA sub MOV DX,local_PX3_vga ;must be VGA compatible
Sans doute le coeur de ce programme, on utilise la fonction INT 0x10/0x1a00 (qui n'est “supportée” que dans les versions “VGA” du BIOS) ou qui renvoi une “combinaison inconnue”.
Voir INT 0x10 / 0x1a
Chargement & Lancement du Jeu
;******************************************************************************************************************** ;* Run the Sub program * ;******************************************************************************************************************** load_and_run_PX3: MOV AX,0x4b00 ;Load executable and run MOV BX,local_Exec_Block MOV word ptr [local_Stack_Seg],SS ;preserve SS:SP MOV word ptr [local_Stack_Ofs],SP ;int 0x21,funct 0x4b, destroy SS:SP regs, we must preserve it INT 0x21 ;run "PX3_xGA.com" CLI MOV SS,word ptr CS:[local_Stack_Seg] ;restore SS:SP to avoid crash on exit MOV SP,word ptr CS:[local_Stack_Ofs] STI
Voir INT 0x21 / 0x4b, PSP - DOS Program Segment Prefix Layout
Fin du programme
;******************************************************************************************************************** ;* Exit Loader, end of run * ;******************************************************************************************************************** exit_loader: MOV AH,0x4c INT 0x21
Voir INT 0x21 / 0x4c