Ce programme charge et execute le “bon” module de jeu suivant la carte graphique détectée.
Ce loader (très simple, il n'y a aucun “CALL”) effectue les opérations suivantes:
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:
;******************************************************************************************************************** ;* 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.
;******************************************************************************************************************** ;* 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
;******************************************************************************************************************** ;* 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
;******************************************************************************************************************** ;* Exit Loader, end of run * ;******************************************************************************************************************** exit_loader: MOV AH,0x4c INT 0x21
Voir INT 0x21 / 0x4c