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:

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.

Voir INT 0x21 / 0x4a, FCB - Standard DOS File Control Block

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