Ceci est une ancienne révision du document !
Ce programme charge et execute le “bon” module de jeu.
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 MOV word ptr [Cmd_Tails_Seg],DS ; Execution Block MOV word ptr [FCB1_Seg],DS ; FCB 1&2 "creation" / Filling 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
;******************************************************************************************************************** ;* 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).
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
;******************************************************************************************************************** ;* Exit Loader, end of run * ;******************************************************************************************************************** exit_loader: MOV AH,0x4c INT 0x21
Voir INT 0x21 / 0x4c