6923 lines
		
	
	
		
			149 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			6923 lines
		
	
	
		
			149 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
;  Grafx2 - The Ultimate 256-color bitmap paint program
 | 
						||
;
 | 
						||
;  Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
 | 
						||
;
 | 
						||
;  Grafx2 is free software; you can redistribute it and/or
 | 
						||
;  modify it under the terms of the GNU General Public License
 | 
						||
;  as published by the Free Software Foundation; version 2
 | 
						||
;  of the License.
 | 
						||
;
 | 
						||
;  Grafx2 is distributed in the hope that it will be useful,
 | 
						||
;  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						||
;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						||
;  GNU General Public License for more details.
 | 
						||
;
 | 
						||
;  You should have received a copy of the GNU General Public License
 | 
						||
;  along with Grafx2; if not, see <http://www.gnu.org/licenses/> or
 | 
						||
;  write to the Free Software Foundation, Inc.,
 | 
						||
;  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
						||
 | 
						||
.386P
 | 
						||
.MODEL FLAT
 | 
						||
 | 
						||
_TEXT Segment dword public 'code'
 | 
						||
      Assume cs:_TEXT, ds:_DATA
 | 
						||
 | 
						||
; -- Fonctions MCGA --
 | 
						||
public Set_mode_MCGA
 | 
						||
public Pixel_MCGA
 | 
						||
public Lit_pixel_MCGA
 | 
						||
public Effacer_tout_l_ecran_MCGA
 | 
						||
public Block_MCGA
 | 
						||
public Pixel_Preview_Normal_MCGA
 | 
						||
public Pixel_Preview_Loupe_MCGA
 | 
						||
public Ligne_horizontale_XOR_MCGA
 | 
						||
public Ligne_verticale_XOR_MCGA
 | 
						||
; -- Fonctions Mode X --
 | 
						||
public Set_mode_X
 | 
						||
public Pixel_mode_X
 | 
						||
public Lit_pixel_mode_X
 | 
						||
public Effacer_tout_l_ecran_mode_X
 | 
						||
public Block_mode_X
 | 
						||
public Pixel_Preview_Normal_mode_X
 | 
						||
public Pixel_Preview_Loupe_mode_X
 | 
						||
public Ligne_horizontale_XOR_mode_X
 | 
						||
public Ligne_verticale_XOR_mode_X
 | 
						||
; -- Fonctions VESA --
 | 
						||
public VESA_Change_banque_Fenetre_A
 | 
						||
public VESA_Change_banque_Fenetre_B
 | 
						||
public VESA_Change_banque_Fenetre_A_et_B
 | 
						||
public VESA_Change_banque_Fenetre_A_FAST
 | 
						||
public VESA_Change_banque_Fenetre_B_FAST
 | 
						||
public VESA_Change_banque_Fenetre_A_et_B_FAST
 | 
						||
;public Support_VESA
 | 
						||
;public Mode_VESA_supporte
 | 
						||
public Initialiser_mode_video_VESA
 | 
						||
public Retoucher_CRTC
 | 
						||
public Pixel_VESA
 | 
						||
public Lit_pixel_VESA
 | 
						||
public Effacer_tout_l_ecran_VESA
 | 
						||
public Block_VESA
 | 
						||
public Pixel_Preview_Normal_VESA
 | 
						||
public Pixel_Preview_Loupe_VESA
 | 
						||
public Ligne_horizontale_XOR_VESA
 | 
						||
public Ligne_verticale_XOR_VESA
 | 
						||
 | 
						||
public Display_brush_Color_MCGA
 | 
						||
public Display_brush_Mono_MCGA
 | 
						||
public Clear_brush_MCGA
 | 
						||
 | 
						||
public Display_brush_Color_VESA
 | 
						||
public Display_brush_Mono_VESA
 | 
						||
public Clear_brush_VESA
 | 
						||
 | 
						||
public Display_brush_Color_mode_X
 | 
						||
public Display_brush_Mono_mode_X
 | 
						||
public Clear_brush_mode_X
 | 
						||
 | 
						||
public Remap_screen_MCGA
 | 
						||
public Remap_screen_mode_X
 | 
						||
public Remap_screen_VESA
 | 
						||
 | 
						||
public Afficher_partie_de_l_ecran_MCGA
 | 
						||
public Afficher_une_ligne_a_l_ecran_MCGA
 | 
						||
public Lire_une_ligne_a_l_ecran_MCGA
 | 
						||
public Afficher_partie_de_l_ecran_zoomee_MCGA
 | 
						||
public Afficher_partie_de_l_ecran_mode_X
 | 
						||
public Afficher_une_ligne_a_l_ecran_mode_X
 | 
						||
public Lire_une_ligne_a_l_ecran_mode_X
 | 
						||
public Afficher_partie_de_l_ecran_zoomee_mode_X
 | 
						||
public Afficher_partie_de_l_ecran_VESA
 | 
						||
public Afficher_une_ligne_a_l_ecran_VESA
 | 
						||
public Lire_une_ligne_a_l_ecran_VESA
 | 
						||
public Afficher_partie_de_l_ecran_zoomee_VESA
 | 
						||
 | 
						||
public Display_brush_Color_Zoom_MCGA
 | 
						||
public Display_brush_Mono_Zoom_MCGA
 | 
						||
public Clear_brush_Zoom_MCGA
 | 
						||
public Display_brush_Color_Zoom_mode_X
 | 
						||
public Display_brush_Mono_Zoom_mode_X
 | 
						||
public Clear_brush_Zoom_mode_X
 | 
						||
public Display_brush_Color_Zoom_VESA
 | 
						||
public Display_brush_Mono_Zoom_VESA
 | 
						||
public Clear_brush_Zoom_VESA
 | 
						||
 | 
						||
 | 
						||
; -- Variables externes relatives au Mode X --
 | 
						||
extrn Mode_X_Ptr   :dword
 | 
						||
extrn MODE_X_Decalage_synchro      :dword
 | 
						||
extrn MODE_X_Largeur_de_ligne      :word
 | 
						||
extrn MODE_X_Valeur_initiale_de_esi:dword
 | 
						||
extrn MODE_X_Valeur_initiale_de_edi:dword
 | 
						||
 | 
						||
; -- Variables externes relatives au VESA --
 | 
						||
extrn Granularite  :byte
 | 
						||
extrn Mode_X_Ptr   :dataptr     ; Table de modification des registres du CRTC
 | 
						||
extrn VESA_Erreur                  :byte
 | 
						||
extrn VESA_WinFuncPtr              :dword
 | 
						||
extrn VESA_Liste_des_modes         :dword
 | 
						||
extrn VESA_Decalage_synchro        :dword
 | 
						||
extrn VESA_Largeur_ecran_en_dword  :word
 | 
						||
extrn VESA_Banque_en_cours         :byte
 | 
						||
extrn VESA_Derniere_banque_Fenetre_A_utilisee:byte
 | 
						||
extrn VESA_Derniere_banque_Fenetre_B_utilisee:byte
 | 
						||
extrn VESA_Change_banque_lecture   :dword
 | 
						||
extrn VESA_Change_banque_ecriture  :dword
 | 
						||
extrn VESA_Change_banque_lect_ecr  :dword
 | 
						||
extrn VESA_Version_Unite           :byte
 | 
						||
extrn VESA_Version_Decimale        :byte
 | 
						||
extrn VESA_Constructeur            :dword
 | 
						||
extrn VESA_Taille_memoire          :word
 | 
						||
 | 
						||
; -- Autres variables externes --
 | 
						||
extrn Brosse:dword
 | 
						||
extrn Principal_Ecran:dword
 | 
						||
extrn Principal_Largeur_image:word
 | 
						||
extrn Principal_Hauteur_image:word
 | 
						||
extrn Principal_Decalage_X:word
 | 
						||
extrn Principal_Decalage_Y:word
 | 
						||
extrn Largeur_ecran:word
 | 
						||
extrn Hauteur_ecran:word
 | 
						||
extrn Menu_Ordonnee:word
 | 
						||
extrn Principal_X_Zoom:word
 | 
						||
 | 
						||
extrn Table_mul_facteur_zoom:dataptr ; Table de multiplication par le facteur
 | 
						||
extrn Loupe_Decalage_X:word
 | 
						||
extrn Loupe_Decalage_Y:word
 | 
						||
extrn Loupe_Facteur   :word
 | 
						||
 | 
						||
extrn Limite_Haut_Zoom          :word
 | 
						||
extrn Limite_Gauche_Zoom        :word
 | 
						||
extrn Limite_visible_Bas_Zoom   :word
 | 
						||
extrn Limite_visible_Droite_Zoom:word
 | 
						||
 | 
						||
; -- Proc<6F>dures externes --
 | 
						||
extrn Zoomer_une_ligne:near
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; ***************************************************************************
 | 
						||
; ***************************************************************************
 | 
						||
; ********************************** MCGA ***********************************
 | 
						||
; ***************************************************************************
 | 
						||
; ***************************************************************************
 | 
						||
 | 
						||
 | 
						||
Set_mode_MCGA proc near
 | 
						||
 | 
						||
  pushad
 | 
						||
 | 
						||
 | 
						||
  mov   ax,13h
 | 
						||
  int   10h
 | 
						||
 | 
						||
 | 
						||
  popad
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Set_mode_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Pixel_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  X:word,Y:word,Couleur:byte
 | 
						||
 | 
						||
 | 
						||
  mov  eax,0A0140h
 | 
						||
  mov  cl,Couleur
 | 
						||
  mul  Y
 | 
						||
  add  ax,X
 | 
						||
  mov  [eax],cl
 | 
						||
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Lit_pixel_MCGA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   X:word,Y:word
 | 
						||
 | 
						||
 | 
						||
  mov   eax,0A0140h
 | 
						||
  mul   Y
 | 
						||
  add   ax,X
 | 
						||
  mov   al,[eax]
 | 
						||
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Lit_pixel_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Effacer_tout_l_ecran_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Couleur:byte
 | 
						||
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On place EDI en d<>but d'<27>cran:
 | 
						||
 | 
						||
  mov  edi,0A0000h
 | 
						||
 | 
						||
  ; On met (E)CX <20> 320*Menu_Ordonnee/4:   ( *80 <=> <<6 + <<4)
 | 
						||
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Menu_Ordonnee
 | 
						||
  mov  cx,ax
 | 
						||
  shl  ax,6
 | 
						||
  shl  cx,4
 | 
						||
  add  cx,ax
 | 
						||
 | 
						||
  ; On met dans EAX 4 fois la couleur:
 | 
						||
 | 
						||
  mov  dl,Couleur
 | 
						||
  mov  dh,dl
 | 
						||
  mov  ax,dx
 | 
						||
  shl  eax,16
 | 
						||
  mov  ax,dx
 | 
						||
 | 
						||
 | 
						||
  rep  stosd
 | 
						||
 | 
						||
  pop  edi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Effacer_tout_l_ecran_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Block_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Debut_X:word, Debut_Y:word, Largeur:word, Hauteur:word, Couleur:byte
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans EDI la position de d<>part du dessin de block
 | 
						||
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mov  ax,Debut_Y
 | 
						||
  mov  dx,ax
 | 
						||
  shl  ax,8
 | 
						||
  add  ax,Debut_X
 | 
						||
  shl  dx,6
 | 
						||
  add  ax,dx
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans SI l'incr<63>mentation de DI <20> chaque ligne
 | 
						||
 | 
						||
  mov  si,320
 | 
						||
  sub  si,Largeur
 | 
						||
 | 
						||
  ; On remplit EAX avec 4 fois la couleur
 | 
						||
 | 
						||
  mov  dl,Couleur
 | 
						||
  mov  dh,dl
 | 
						||
  mov  ax,dx
 | 
						||
  shl  eax,16
 | 
						||
  mov  ax,dx
 | 
						||
 | 
						||
  mov  dx,Hauteur
 | 
						||
 | 
						||
  xor  ecx,ecx
 | 
						||
 | 
						||
  Block_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    mov  cx,Largeur                  ; CX = Nb pixels <20> afficher sur la ligne
 | 
						||
 | 
						||
    shr  cx,1
 | 
						||
    jnc  Block_MCGA_Pair
 | 
						||
    stosb                        ; On commence par se d<>barrasser du 1er byte
 | 
						||
				 ; en cas d'imparit<69>}
 | 
						||
 | 
						||
    Block_MCGA_Pair:
 | 
						||
 | 
						||
    shr  cx,1
 | 
						||
    jnc  Block_MCGA_test_de_superiorite_a_3
 | 
						||
    stosw                        ; On se d<>barrasse des 2<>me et 3<>me bytes en
 | 
						||
				 ; cas de "non-multiplicit<69>-de-4"
 | 
						||
    Block_MCGA_test_de_superiorite_a_3:
 | 
						||
 | 
						||
    ; copie 32 bits
 | 
						||
    rep  stosd
 | 
						||
 | 
						||
    add  di,si
 | 
						||
    dec  dx
 | 
						||
 | 
						||
  jnz  Block_MCGA_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Block_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- Affichage d'un pixel dans l'<27>cran, par rapport au d<>calage de l'image
 | 
						||
;    dans l'<27>cran, en mode normal (pas en mode loupe) --
 | 
						||
 | 
						||
; Note: si on modifie cette proc<6F>dure, il faudra penser <20> faire <20>galement la
 | 
						||
;       modif dans la proc<6F>dure Pixel_Preview_Loupe_MCGA.
 | 
						||
 | 
						||
Pixel_Preview_Normal_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  X:word,Y:word,Couleur:byte
 | 
						||
 | 
						||
 | 
						||
  mov  dl,Couleur
 | 
						||
  mov  cx,Y
 | 
						||
  mov  ax,X
 | 
						||
  sub  cx,Principal_Decalage_Y
 | 
						||
  sub  ax,Principal_Decalage_X
 | 
						||
  push edx
 | 
						||
  push ecx
 | 
						||
  push eax
 | 
						||
 | 
						||
  call Pixel_MCGA
 | 
						||
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_Preview_Normal_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- Affichage d'un pixel dans l'<27>cran, par rapport au d<>calage de l'image
 | 
						||
;    dans l'<27>cran, en mode loupe --
 | 
						||
 | 
						||
Pixel_Preview_Loupe_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  X:word,Y:word,Couleur:byte
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
 | 
						||
  ; On affiche d'abord le pixel dans la partie non-zoom<6F>e
 | 
						||
 | 
						||
  mov  dl,Couleur               ; Ca ne co<63>te pas trop
 | 
						||
  mov  cx,Y                     ; en code de recopier
 | 
						||
  mov  ax,X                     ; le contenu de la
 | 
						||
  sub  cx,Principal_Decalage_Y  ; proc<6F>dure
 | 
						||
  sub  ax,Principal_Decalage_X  ; Pixel_Preview_Normal_MCGA
 | 
						||
  push edx                      ; et <20>a fait gagner du
 | 
						||
  push ecx                      ; temps, et ce temps est
 | 
						||
  push eax                      ; assez pr<70>cieux vu que
 | 
						||
  call Pixel_MCGA               ; c'est appel<65> TRES souvent.
 | 
						||
  add  esp,12  ; 3 param<61>tres dword
 | 
						||
 | 
						||
  ; On regarde si on peut afficher le pixel <20>galement dans la loupe
 | 
						||
 | 
						||
  mov  ax,Y
 | 
						||
  cmp  ax,Limite_Haut_Zoom
 | 
						||
  jb   Pixel_Preview_Loupe_MCGA_Fin
 | 
						||
  cmp  ax,Limite_visible_Bas_Zoom
 | 
						||
  ja   Pixel_Preview_Loupe_MCGA_Fin
 | 
						||
  mov  ax,X
 | 
						||
  cmp  ax,Limite_Gauche_Zoom
 | 
						||
  jb   Pixel_Preview_Loupe_MCGA_Fin
 | 
						||
  cmp  ax,Limite_visible_Droite_Zoom
 | 
						||
  ja   Pixel_Preview_Loupe_MCGA_Fin
 | 
						||
 | 
						||
  ; On passe la couleur
 | 
						||
 | 
						||
  mov  al,Couleur
 | 
						||
  mov  edx,Table_mul_facteur_zoom       ; On pointe sur la table de x (OPTI)
 | 
						||
  push eax
 | 
						||
 | 
						||
  ; On calcule dans EAX (X) et ECX (Y) le d<>marrage du bloc:
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,X
 | 
						||
  mov  cx,Y
 | 
						||
  sub  ax,Loupe_Decalage_X
 | 
						||
  sub  cx,Loupe_Decalage_Y
 | 
						||
  mov  ax,[edx+2*eax]
 | 
						||
  mov  cx,[edx+2*ecx]
 | 
						||
 | 
						||
  ; On sauve ces valeurs dans BX (X) et DX (Y):
 | 
						||
 | 
						||
  mov  bx,ax
 | 
						||
  mov  dx,cx
 | 
						||
 | 
						||
  ; On s'occupe de la hauteur:
 | 
						||
 | 
						||
  add  cx,Loupe_Facteur
 | 
						||
  cmp  cx,Menu_Ordonnee
 | 
						||
  ja   Pixel_Preview_Loupe_MCGA_Tronque_en_hauteur
 | 
						||
 | 
						||
  mov  cx,Loupe_Facteur
 | 
						||
  push ecx
 | 
						||
  jmp  Pixel_Preview_Loupe_MCGA_Traitement_de_la_largeur
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_MCGA_Tronque_en_hauteur:
 | 
						||
 | 
						||
  mov  cx,dx
 | 
						||
  neg  cx
 | 
						||
  add  cx,Menu_Ordonnee
 | 
						||
  push ecx
 | 
						||
 | 
						||
  ; On s'occupe de la largeur:
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_MCGA_Traitement_de_la_largeur:
 | 
						||
 | 
						||
  add  bx,Principal_X_Zoom
 | 
						||
 | 
						||
  mov  ax,Loupe_Facteur
 | 
						||
  push eax
 | 
						||
 | 
						||
  ; On passe le d<>but en Y:
 | 
						||
  push edx
 | 
						||
 | 
						||
  ; On passe le d<>but en X:
 | 
						||
  push ebx
 | 
						||
 | 
						||
  call Block_MCGA
 | 
						||
 | 
						||
 | 
						||
  add  esp,20                   ; 20 = 5 param<61>tres de type dword
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_MCGA_Fin:
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_Preview_Loupe_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Ligne_horizontale_XOR_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word, Pos_Y:word, Largeur:word
 | 
						||
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans EDI la position de d<>part du dessin de la ligne
 | 
						||
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mov  dx,ax
 | 
						||
  shl  ax,8
 | 
						||
  add  ax,Pos_X
 | 
						||
  shl  dx,6
 | 
						||
  add  ax,dx
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
 | 
						||
  mov  cx,Largeur             ; CX = Nb pixels <20> afficher sur la ligne
 | 
						||
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LH_MCGA_Pair
 | 
						||
  not  byte ptr[edi]           ; On commence par se d<>barrasser du 1er byte
 | 
						||
  inc  edi                     ; en cas d'imparit<69>
 | 
						||
 | 
						||
 | 
						||
  LH_MCGA_Pair:
 | 
						||
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LH_MCGA_test_de_superiorite_a_3
 | 
						||
  not  word ptr[edi]           ; On se d<>barrasse des 2<>me et 3<>me bytes en
 | 
						||
  add  edi,2                   ; cas de "non-multiplicit<69>-de-4"
 | 
						||
 | 
						||
  LH_MCGA_test_de_superiorite_a_3:
 | 
						||
 | 
						||
  or   cx,cx
 | 
						||
  jz   LH_MCGA_Fin
 | 
						||
 | 
						||
  ; copie 32 bits
 | 
						||
  LH_MCGA_Copie_32_bits:
 | 
						||
    not  dword ptr[edi]
 | 
						||
    add  edi,4
 | 
						||
    dec  cx
 | 
						||
  jnz  LH_MCGA_Copie_32_bits
 | 
						||
 | 
						||
  LH_MCGA_Fin:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Ligne_horizontale_XOR_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Ligne_verticale_XOR_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word, Pos_Y:word, Hauteur:word
 | 
						||
 | 
						||
 | 
						||
  ; On met dans EDX la position de d<>part du dessin de la ligne
 | 
						||
 | 
						||
  mov  edx,0A0000h
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mov  cx,ax
 | 
						||
  shl  ax,8
 | 
						||
  add  ax,Pos_X
 | 
						||
  shl  cx,6
 | 
						||
  add  ax,cx
 | 
						||
  mov  dx,ax
 | 
						||
 | 
						||
 | 
						||
  mov  cx,Hauteur             ; CX = Nb pixels <20> afficher sur la ligne
 | 
						||
 | 
						||
  LV_MCGA_Boucle:
 | 
						||
 | 
						||
    not  byte ptr[edx]
 | 
						||
    add  dx,320
 | 
						||
 | 
						||
    dec  cx
 | 
						||
    jnz  LV_MCGA_Boucle
 | 
						||
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Ligne_verticale_XOR_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; ***************************************************************************
 | 
						||
; ***************************************************************************
 | 
						||
; ********************************* MODE X **********************************
 | 
						||
; ***************************************************************************
 | 
						||
; ***************************************************************************
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Set_mode_X proc near
 | 
						||
 | 
						||
  pushad
 | 
						||
 | 
						||
  mov  ax,13h
 | 
						||
  int  10h
 | 
						||
 | 
						||
  mov  dx,3C6h         ; \
 | 
						||
  xor  al,al           ; -+-> Palette Off
 | 
						||
  out  dx,al           ; /
 | 
						||
  mov  dx,3C4h
 | 
						||
  mov  ax,0604h
 | 
						||
  out  dx,ax
 | 
						||
  mov  ax,0100h
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  mov  al,01h          ; \
 | 
						||
  out  dx,al           ;  +
 | 
						||
  inc  dx              ;  |
 | 
						||
  in   al,dx           ;  |
 | 
						||
  mov  ah,al           ;  |
 | 
						||
  mov  al,01h          ;  |
 | 
						||
  push ax              ;  |
 | 
						||
  mov  al,ah           ;  |
 | 
						||
  or   al,20h          ;  +-> Screen Off
 | 
						||
  out  dx,al           ; /
 | 
						||
 | 
						||
  mov  esi,Mode_X_Ptr
 | 
						||
  cld
 | 
						||
  lodsb
 | 
						||
  or   al,al
 | 
						||
  jz   DontSetDot
 | 
						||
  mov  dx,3C2h
 | 
						||
  out  dx,al
 | 
						||
  DontSetDot:
 | 
						||
 | 
						||
  mov  dx,3C4h
 | 
						||
  mov  ax,0300h
 | 
						||
  out  dx,ax
 | 
						||
  mov  dx,3D4h
 | 
						||
  mov  al,11h
 | 
						||
  out  dx,al
 | 
						||
  inc  dx
 | 
						||
  in   al,dx
 | 
						||
  and  al,7Fh
 | 
						||
  out  dx,al
 | 
						||
 | 
						||
  dec  dx
 | 
						||
  lodsb
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  cl,al
 | 
						||
  rep  outsw
 | 
						||
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  shr  ax,3
 | 
						||
  mov  ah,al
 | 
						||
  mov  al,13h
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  mov  dx,3C4h
 | 
						||
  mov  ax,0F02h
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  mov  edi,0A0000h
 | 
						||
  xor  eax,eax
 | 
						||
  mov  ecx,4000h
 | 
						||
  rep  stosd
 | 
						||
 | 
						||
 | 
						||
  ; On calcule le d<>calage qu'il y a entre la fin de l'<27>cran et le d<>but
 | 
						||
  ; de la ligne suivante:
 | 
						||
  ;
 | 
						||
  ; Decalage = (Largeur_image - Largeur_ecran)
 | 
						||
 | 
						||
  xor  ebx,ebx
 | 
						||
  mov   bx,Principal_Largeur_image
 | 
						||
  sub  bx,Largeur_ecran
 | 
						||
  mov  MODE_X_Decalage_synchro,ebx
 | 
						||
 | 
						||
  ; On calcule la largeur logique d'une ligne:
 | 
						||
  ;
 | 
						||
  ; Largeur_de_ligne = Largeur_ecran shr 2
 | 
						||
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  shr  ax,2
 | 
						||
  mov  MODE_X_Largeur_de_ligne,ax
 | 
						||
 | 
						||
  mov  dx,3C4h      ; \
 | 
						||
  pop  ax           ; -+-> Screen On
 | 
						||
  out  dx,ax        ; /
 | 
						||
  mov  dx,3C6h      ; \
 | 
						||
  mov  al,0FFh      ; -+-> Palette On
 | 
						||
  out  dx,al        ; /
 | 
						||
 | 
						||
 | 
						||
  popad
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Set_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Pixel_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg X:word,Y:word,Couleur:byte
 | 
						||
 | 
						||
  pushad
 | 
						||
 | 
						||
  mov  dx,3C4h
 | 
						||
  mov  ax,102h
 | 
						||
  mov  bx,X
 | 
						||
  mov  cx,bx
 | 
						||
  and  cl,03d
 | 
						||
  shl  ah,cl
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  mov  ax,MODE_X_Largeur_de_ligne
 | 
						||
  mul  Y
 | 
						||
  add  eax,0A0000h
 | 
						||
 | 
						||
  shr  bx,2
 | 
						||
  add  ax,bx
 | 
						||
  mov  bl,Couleur
 | 
						||
  mov  [eax],bl
 | 
						||
 | 
						||
  popad
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Lit_pixel_mode_X proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   X:word,Y:word
 | 
						||
 | 
						||
  push  bx
 | 
						||
 | 
						||
  mov   bx,X
 | 
						||
  mov   cx,bx
 | 
						||
  and   cl,03d
 | 
						||
  mov   dx,3CEh
 | 
						||
  mov   al,04h
 | 
						||
  mov   ah,cl
 | 
						||
  out   dx,ax
 | 
						||
 | 
						||
  xor   eax,eax
 | 
						||
  mov   ax,MODE_X_Largeur_de_ligne
 | 
						||
  mul   Y
 | 
						||
  add   eax,0A0000h
 | 
						||
 | 
						||
  shr   bx,02d
 | 
						||
  add   ax,bx
 | 
						||
  mov   al,[eax]
 | 
						||
 | 
						||
 | 
						||
  pop   bx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Lit_pixel_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Effacer_tout_l_ecran_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Couleur:byte
 | 
						||
 | 
						||
  pushad
 | 
						||
 | 
						||
 | 
						||
  ; On fait passer la carte VGA en mode <20>criture sur 4 plans simultan<61>s
 | 
						||
 | 
						||
  mov  dx,3C4h
 | 
						||
  mov  ax,0F02h
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  ; On place EDI en d<>but d'<27>cran:
 | 
						||
 | 
						||
  mov  edi,0A0000h
 | 
						||
 | 
						||
  ; On met EBX <20> 4 fois la couleur:
 | 
						||
 | 
						||
  mov  al,Couleur
 | 
						||
  mov  ah,al
 | 
						||
  mov  bx,ax
 | 
						||
  shl  ebx,16
 | 
						||
  mov  bx,ax
 | 
						||
 | 
						||
  ; On calcule le nb de dwords visibles dans l'image
 | 
						||
 | 
						||
  mov  ax,Menu_ordonnee
 | 
						||
  mul  MODE_X_Largeur_de_ligne
 | 
						||
  shr  ax,2
 | 
						||
  mov  cx,ax
 | 
						||
  jnc  @@Pas_de_probleme
 | 
						||
 | 
						||
  mov  [edi],bx
 | 
						||
  add  edi,2
 | 
						||
 | 
						||
  @@Pas_de_probleme:
 | 
						||
 | 
						||
  @@Boucle:
 | 
						||
 | 
						||
    mov  [edi],ebx
 | 
						||
    add  edi,4
 | 
						||
    dec  cx
 | 
						||
    jnz  @@Boucle
 | 
						||
 | 
						||
 | 
						||
  popad
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Effacer_tout_l_ecran_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Block_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Debut_X:word,Debut_Y:word,Largeur:word,Hauteur:word,Couleur:byte
 | 
						||
 | 
						||
  pushad
 | 
						||
 | 
						||
 | 
						||
  ; On met dans CL le plan initial
 | 
						||
 | 
						||
  mov  bx,Debut_X
 | 
						||
  mov  cl,bl
 | 
						||
  and  cl,00000011b
 | 
						||
 | 
						||
  ; On met dans CH la couleur
 | 
						||
 | 
						||
  mov  ch,Couleur
 | 
						||
 | 
						||
  ; On met dans ESI la valeur initiale de EDI
 | 
						||
 | 
						||
  mov  ax,Debut_Y
 | 
						||
  mul  MODE_X_Largeur_de_ligne
 | 
						||
  shr  bx,2
 | 
						||
  add  ax,bx
 | 
						||
  mov  esi,0A0000h
 | 
						||
  mov  si,ax
 | 
						||
 | 
						||
  mov  bx,Largeur                            ; BX = Nb de colonnes <20> afficher
 | 
						||
  mov  dx,3C4h                            ; DX = Port du CRTC (chngt de plan)
 | 
						||
 | 
						||
  Block_mode_X_Pour_chaque_colonne:
 | 
						||
 | 
						||
    ; On passe dans le plan d<>tenu par CL
 | 
						||
 | 
						||
    mov  ax,102h
 | 
						||
    shl  ah,cl
 | 
						||
    out  dx,ax
 | 
						||
 | 
						||
    ; On dessine la colonne en partant de ESI, et sur Hauteur pixels
 | 
						||
 | 
						||
    mov  edi,esi
 | 
						||
    mov  ax,Hauteur                            ; AX = Nb de pixels <20> dessiner
 | 
						||
 | 
						||
    Block_mode_X_Pour_chaque_ligne_du_block:
 | 
						||
 | 
						||
      ; On recopie un pixel de la couleur demand<6E>e
 | 
						||
 | 
						||
      mov  [edi],ch
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
 | 
						||
      add  di,MODE_X_Largeur_de_ligne
 | 
						||
      dec  ax
 | 
						||
      jnz  Block_mode_X_Pour_chaque_ligne_du_block
 | 
						||
 | 
						||
    ; On change de colonne:
 | 
						||
 | 
						||
    dec  bx                        ; Si plus de colonnes <20> traiter
 | 
						||
    jz   Block_mode_X_Fin_de_traitement ; -> On arr<72>te le traitement
 | 
						||
 | 
						||
    inc  cl                        ; Sinon, on se prepare <20> passer au plan
 | 
						||
    and  cl,00000011b              ; suivant. Si Plan <> 0
 | 
						||
    jnz  Block_mode_X_Pour_chaque_colonne     ;          -> On reprend simplement
 | 
						||
 | 
						||
    inc  esi                       ; Sinon, on incr<63>mente l'adresse
 | 
						||
    jmp  Block_mode_X_Pour_chaque_colonne     ; et on reprend
 | 
						||
 | 
						||
  Block_mode_X_Fin_de_traitement:
 | 
						||
 | 
						||
 | 
						||
  popad
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Block_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- Affichage d'un pixel dans l'<27>cran, par rapport au d<>calage de l'image
 | 
						||
;    dans l'<27>cran, en mode normal (pas en mode loupe) --
 | 
						||
 | 
						||
; Note: si on modifie cette proc<6F>dure, il faudra penser <20> faire <20>galement la
 | 
						||
;       modif dans la proc<6F>dure Pixel_Preview_Loupe_mode_X.
 | 
						||
 | 
						||
Pixel_Preview_Normal_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  X:word,Y:word,Couleur:byte
 | 
						||
 | 
						||
 | 
						||
  mov  dl,Couleur
 | 
						||
  mov  cx,Y
 | 
						||
  mov  ax,X
 | 
						||
  sub  cx,Principal_Decalage_Y
 | 
						||
  sub  ax,Principal_Decalage_X
 | 
						||
  push edx
 | 
						||
  push ecx
 | 
						||
  push eax
 | 
						||
 | 
						||
  call Pixel_mode_X
 | 
						||
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_Preview_Normal_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- Affichage d'un pixel dans l'<27>cran, par rapport au d<>calage de l'image
 | 
						||
;    dans l'<27>cran, en mode loupe --
 | 
						||
 | 
						||
Pixel_Preview_Loupe_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  X:word,Y:word,Couleur:byte
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
 | 
						||
  ; On affiche d'abord le pixel dans la partie non-zoom<6F>e
 | 
						||
 | 
						||
  mov  dl,Couleur               ; Ca ne co<63>te pas trop
 | 
						||
  mov  cx,Y                     ; en code de recopier
 | 
						||
  mov  ax,X                     ; le contenu de la
 | 
						||
  sub  cx,Principal_Decalage_Y  ; proc<6F>dure
 | 
						||
  sub  ax,Principal_Decalage_X  ; Pixel_Preview_Normal_mode_X
 | 
						||
  push edx                      ; et <20>a fait gagner du
 | 
						||
  push ecx                      ; temps, et ce temps est
 | 
						||
  push eax                      ; assez pr<70>cieux vu que
 | 
						||
  call Pixel_mode_X             ; c'est appel<65> TRES souvent.
 | 
						||
  add  esp,12  ; 3 param<61>tres dword
 | 
						||
 | 
						||
  ; On regarde si on peut afficher le pixel <20>galement dans la loupe
 | 
						||
 | 
						||
  mov  ax,Y
 | 
						||
  cmp  ax,Limite_Haut_Zoom
 | 
						||
  jb   Pixel_Preview_Loupe_mode_X_Fin
 | 
						||
  cmp  ax,Limite_visible_Bas_Zoom
 | 
						||
  ja   Pixel_Preview_Loupe_mode_X_Fin
 | 
						||
  mov  ax,X
 | 
						||
  cmp  ax,Limite_Gauche_Zoom
 | 
						||
  jb   Pixel_Preview_Loupe_mode_X_Fin
 | 
						||
  cmp  ax,Limite_visible_Droite_Zoom
 | 
						||
  ja   Pixel_Preview_Loupe_mode_X_Fin
 | 
						||
 | 
						||
  ; On passe la couleur
 | 
						||
 | 
						||
  mov  al,Couleur
 | 
						||
  mov  edx,Table_mul_facteur_zoom       ; On pointe sur la table de x (OPTI)
 | 
						||
  push eax
 | 
						||
 | 
						||
  ; On calcule dans EAX (X) et ECX (Y) le d<>marrage du bloc:
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,X
 | 
						||
  mov  cx,Y
 | 
						||
  sub  ax,Loupe_Decalage_X
 | 
						||
  sub  cx,Loupe_Decalage_Y
 | 
						||
  mov  ax,[edx+2*eax]
 | 
						||
  mov  cx,[edx+2*ecx]
 | 
						||
 | 
						||
  ; On sauve ces valeurs dans BX (X) et DX (Y):
 | 
						||
 | 
						||
  mov  bx,ax
 | 
						||
  mov  dx,cx
 | 
						||
 | 
						||
  ; On s'occupe de la hauteur:
 | 
						||
 | 
						||
  add  cx,Loupe_Facteur
 | 
						||
  cmp  cx,Menu_Ordonnee
 | 
						||
  ja   Pixel_Preview_Loupe_mode_X_Tronque_en_hauteur
 | 
						||
 | 
						||
  mov  cx,Loupe_Facteur
 | 
						||
  push ecx
 | 
						||
  jmp  Pixel_Preview_Loupe_mode_X_Traitement_de_la_largeur
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_mode_X_Tronque_en_hauteur:
 | 
						||
 | 
						||
  mov  cx,dx
 | 
						||
  neg  cx
 | 
						||
  add  cx,Menu_Ordonnee
 | 
						||
  push ecx
 | 
						||
 | 
						||
  ; On s'occupe de la largeur:
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_mode_X_Traitement_de_la_largeur:
 | 
						||
 | 
						||
  add  bx,Principal_X_Zoom
 | 
						||
 | 
						||
  mov  ax,Loupe_Facteur
 | 
						||
  push eax
 | 
						||
 | 
						||
  ; On passe le d<>but en Y:
 | 
						||
  push edx
 | 
						||
 | 
						||
  ; On passe le d<>but en X:
 | 
						||
  push ebx
 | 
						||
 | 
						||
  call Block_mode_X
 | 
						||
 | 
						||
 | 
						||
  add  esp,20                   ; 20 = 5 param<61>tres de type dword
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_mode_X_Fin:
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_Preview_Loupe_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Ligne_horizontale_XOR_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word, Pos_Y:word, Largeur:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans CL le plan initial
 | 
						||
 | 
						||
  mov  bx,Pos_X
 | 
						||
  mov  cl,bl
 | 
						||
  and  cl,00000011b
 | 
						||
 | 
						||
  ; On met dans ESI la valeur initiale de EDI
 | 
						||
  ; (ESI=D<>but de ligne, EDI=Position dans la ligne)
 | 
						||
 | 
						||
  mov  esi,0A0000h
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mul  MODE_X_Largeur_de_ligne
 | 
						||
  shr  bx,2
 | 
						||
  add  ax,bx
 | 
						||
  mov  si,ax
 | 
						||
 | 
						||
  ; On met dans BX la coordonn<6E>e de fin +1
 | 
						||
 | 
						||
  mov  bx,Pos_X
 | 
						||
  add  bx,Largeur
 | 
						||
 | 
						||
  ; On place dans CH le nb de plans <20> traiter
 | 
						||
 | 
						||
  mov  ch,4
 | 
						||
 | 
						||
  LH_Pour_chaque_plan:
 | 
						||
 | 
						||
    ; On initialise EDI
 | 
						||
 | 
						||
    mov  edi,esi
 | 
						||
 | 
						||
    ; On passe dans le plan d<>tenu par CL
 | 
						||
 | 
						||
      ; Plan d'<27>criture:
 | 
						||
 | 
						||
    mov  dx,3C4h                          ; DX = Port du CRTC (chngt de plan)
 | 
						||
    mov  ax,102h
 | 
						||
    shl  ah,cl
 | 
						||
    out  dx,ax
 | 
						||
 | 
						||
      ; Plan de lecture:
 | 
						||
 | 
						||
    mov  dx,3CEh                          ; DX = Port du TS (enfin, je crois)
 | 
						||
    mov  ah,cl
 | 
						||
    mov  al,04h
 | 
						||
    out  dx,ax
 | 
						||
 | 
						||
    ; On met dans AX la coordonn<6E>e de d<>part
 | 
						||
 | 
						||
    mov  ax,Pos_X
 | 
						||
 | 
						||
    LH_Boucle:
 | 
						||
 | 
						||
      cmp  ax,bx
 | 
						||
      jae  LH_Fin_de_traitement
 | 
						||
 | 
						||
      not  byte ptr[edi] ; On inverse le pixel courant
 | 
						||
 | 
						||
      inc  edi  ; On passe <20> la coordonn<6E>e +4
 | 
						||
      add  ax,4
 | 
						||
 | 
						||
      jmp  LH_Boucle
 | 
						||
 | 
						||
    LH_Fin_de_traitement:
 | 
						||
 | 
						||
    ; On pr<70>pare CL pour le prochain plan:
 | 
						||
 | 
						||
    inc  cl
 | 
						||
    and  cl,00000011b
 | 
						||
    jnz  LH_On_repasse_pas_dans_le_plan_0
 | 
						||
 | 
						||
    ; On pr<70>pare ESI pour le prochain plan:
 | 
						||
 | 
						||
    inc  esi
 | 
						||
 | 
						||
    LH_On_repasse_pas_dans_le_plan_0:
 | 
						||
 | 
						||
    ; On pr<70>pare la coordonn<6E>e de d<>part pour le prochain plan:
 | 
						||
 | 
						||
    inc  Pos_X
 | 
						||
 | 
						||
    ; On regarde s'il reste un plan <20> traiter:
 | 
						||
 | 
						||
    dec  ch
 | 
						||
    jnz  LH_Pour_chaque_plan
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Ligne_horizontale_XOR_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Ligne_verticale_XOR_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word, Pos_Y:word, Hauteur:word
 | 
						||
 | 
						||
 | 
						||
  ; On met dans CL le plan initial
 | 
						||
 | 
						||
  mov  cx,Pos_X
 | 
						||
  and  cl,00000011b
 | 
						||
 | 
						||
  ; On passe dans le plan d<>tenu par CL
 | 
						||
 | 
						||
    ; Plan d'<27>criture:
 | 
						||
 | 
						||
  mov  dx,3C4h                          ; DX = Port du CRTC (chngt de plan)
 | 
						||
  mov  ax,102h
 | 
						||
  shl  ah,cl
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
    ; Plan de lecture:
 | 
						||
 | 
						||
  mov  dx,3CEh                          ; DX = Port du TS (enfin, je crois)
 | 
						||
  mov  ah,cl
 | 
						||
  mov  al,04h
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  ; On met dans EDX la coordonn<6E>e initiale
 | 
						||
 | 
						||
  mov  edx,0A0000h
 | 
						||
  mov  cx,Pos_X
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mul  MODE_X_Largeur_de_ligne
 | 
						||
  shr  cx,2
 | 
						||
  add  ax,cx
 | 
						||
  mov  dx,ax
 | 
						||
 | 
						||
  ; On place dans CX le nb de pixels <20> traiter
 | 
						||
 | 
						||
  mov  cx,Hauteur
 | 
						||
 | 
						||
  ; On place dans AX la distance qu'il y a d'une ligne <20> l'autre:
 | 
						||
 | 
						||
  mov  ax,Mode_X_Largeur_de_ligne
 | 
						||
 | 
						||
  LV_Pour_chaque_ligne:
 | 
						||
 | 
						||
    not  byte ptr[edx]
 | 
						||
    add  dx,ax
 | 
						||
 | 
						||
    dec  cx
 | 
						||
    jnz  LV_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Ligne_verticale_XOR_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; ***************************************************************************
 | 
						||
; ***************************************************************************
 | 
						||
; ********************************** VESA ***********************************
 | 
						||
; ***************************************************************************
 | 
						||
; ***************************************************************************
 | 
						||
 | 
						||
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_A_FAST proc near
 | 
						||
 | 
						||
; Param<61>tre en entr<74>e:
 | 
						||
;   AL = Banque sur laquelle aller dans la fen<65>tre A
 | 
						||
 | 
						||
  cmp  al,VESA_Derniere_banque_Fenetre_A_utilisee
 | 
						||
  je   VESA_Change_banque_Fenetre_A_FAST_Pas_besoin_de_changer
 | 
						||
 | 
						||
    pushad
 | 
						||
    xor  ah,ah
 | 
						||
    mov  cl,Granularite
 | 
						||
    mov  dx,ax
 | 
						||
    xor  bx,bx
 | 
						||
    shl  dx,cl
 | 
						||
    mov  ax,4F05h
 | 
						||
    call [VESA_WinFuncPtr]
 | 
						||
    popad
 | 
						||
    mov  VESA_Derniere_banque_Fenetre_A_utilisee,al
 | 
						||
 | 
						||
  VESA_Change_banque_Fenetre_A_FAST_Pas_besoin_de_changer:
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_A_FAST endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_B_FAST proc near
 | 
						||
 | 
						||
; Param<61>tre en entr<74>e:
 | 
						||
;   AL = Banque sur laquelle aller dans la fen<65>tre B
 | 
						||
 | 
						||
  cmp  al,VESA_Derniere_banque_Fenetre_B_utilisee
 | 
						||
  je   VESA_Change_banque_Fenetre_B_FAST_Pas_besoin_de_changer
 | 
						||
 | 
						||
    pushad
 | 
						||
    xor  ah,ah
 | 
						||
    mov  cl,Granularite
 | 
						||
    mov  dx,ax
 | 
						||
    mov  bx,1
 | 
						||
    shl  dx,cl
 | 
						||
    mov  ax,4F05h
 | 
						||
    call [VESA_WinFuncPtr]
 | 
						||
    popad
 | 
						||
    mov  VESA_Derniere_banque_Fenetre_B_utilisee,al
 | 
						||
 | 
						||
  VESA_Change_banque_Fenetre_B_FAST_Pas_besoin_de_changer:
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_B_FAST endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_A_et_B_FAST proc near
 | 
						||
 | 
						||
; Param<61>tre en entr<74>e:
 | 
						||
;   AL = Banque sur laquelle aller dans les fen<65>tres A et B
 | 
						||
 | 
						||
  cmp  al,VESA_Derniere_banque_Fenetre_A_utilisee
 | 
						||
  je   VESA_Change_banque_Fenetre_A_et_B_FAST_Pas_besoin_de_changer_A
 | 
						||
 | 
						||
    pushad
 | 
						||
    xor  ah,ah
 | 
						||
    mov  cl,Granularite
 | 
						||
    mov  dx,ax
 | 
						||
    xor  bx,bx
 | 
						||
    shl  dx,cl
 | 
						||
    mov  ax,4F05h
 | 
						||
    call [VESA_WinFuncPtr]
 | 
						||
    popad
 | 
						||
    mov  VESA_Derniere_banque_Fenetre_A_utilisee,al
 | 
						||
 | 
						||
  VESA_Change_banque_Fenetre_A_et_B_FAST_Pas_besoin_de_changer_A:
 | 
						||
 | 
						||
  cmp  al,VESA_Derniere_banque_Fenetre_B_utilisee
 | 
						||
  je   VESA_Change_banque_Fenetre_A_et_B_FAST_Pas_besoin_de_changer_B
 | 
						||
 | 
						||
    pushad
 | 
						||
    xor  ah,ah
 | 
						||
    mov  cl,Granularite
 | 
						||
    mov  dx,ax
 | 
						||
    mov  bx,1
 | 
						||
    shl  dx,cl
 | 
						||
    mov  ax,4F05h
 | 
						||
    call [VESA_WinFuncPtr]
 | 
						||
    popad
 | 
						||
    mov  VESA_Derniere_banque_Fenetre_B_utilisee,al
 | 
						||
 | 
						||
  VESA_Change_banque_Fenetre_A_et_B_FAST_Pas_besoin_de_changer_B:
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_A_et_B_FAST endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_A proc near
 | 
						||
 | 
						||
; Param<61>tre en entr<74>e:
 | 
						||
;   AL = Banque sur laquelle aller dans la fen<65>tre A
 | 
						||
 | 
						||
  cmp  al,VESA_Derniere_banque_Fenetre_A_utilisee
 | 
						||
  je   VESA_Change_banque_Fenetre_A_Pas_besoin_de_changer
 | 
						||
 | 
						||
    pushad
 | 
						||
    xor  ah,ah
 | 
						||
    mov  cl,Granularite
 | 
						||
    mov  dx,ax
 | 
						||
    xor  bx,bx
 | 
						||
    shl  dx,cl
 | 
						||
    mov  ax,4F05h
 | 
						||
    int  10h
 | 
						||
    popad
 | 
						||
    mov  VESA_Derniere_banque_Fenetre_A_utilisee,al
 | 
						||
 | 
						||
  VESA_Change_banque_Fenetre_A_Pas_besoin_de_changer:
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_A endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_B proc near
 | 
						||
 | 
						||
; Param<61>tre en entr<74>e:
 | 
						||
;   AL = Banque sur laquelle aller dans la fen<65>tre B
 | 
						||
 | 
						||
  cmp  al,VESA_Derniere_banque_Fenetre_B_utilisee
 | 
						||
  je   VESA_Change_banque_Fenetre_B_Pas_besoin_de_changer
 | 
						||
 | 
						||
    pushad
 | 
						||
    xor  ah,ah
 | 
						||
    mov  cl,Granularite
 | 
						||
    mov  dx,ax
 | 
						||
    mov  bx,1
 | 
						||
    shl  dx,cl
 | 
						||
    mov  ax,4F05h
 | 
						||
    int  10h
 | 
						||
    popad
 | 
						||
    mov  VESA_Derniere_banque_Fenetre_B_utilisee,al
 | 
						||
 | 
						||
  VESA_Change_banque_Fenetre_B_Pas_besoin_de_changer:
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_B endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_A_et_B proc near
 | 
						||
 | 
						||
; Param<61>tre en entr<74>e:
 | 
						||
;   AL = Banque sur laquelle aller dans les fen<65>tres A et B
 | 
						||
 | 
						||
  cmp  al,VESA_Derniere_banque_Fenetre_A_utilisee
 | 
						||
  je   VESA_Change_banque_Fenetre_A_et_B_Pas_besoin_de_changer_A
 | 
						||
 | 
						||
    pushad
 | 
						||
    xor  ah,ah
 | 
						||
    mov  cl,Granularite
 | 
						||
    mov  dx,ax
 | 
						||
    xor  bx,bx
 | 
						||
    shl  dx,cl
 | 
						||
    mov  ax,4F05h
 | 
						||
    int  10h
 | 
						||
    popad
 | 
						||
    mov  VESA_Derniere_banque_Fenetre_A_utilisee,al
 | 
						||
 | 
						||
  VESA_Change_banque_Fenetre_A_et_B_Pas_besoin_de_changer_A:
 | 
						||
 | 
						||
  cmp  al,VESA_Derniere_banque_Fenetre_B_utilisee
 | 
						||
  je   VESA_Change_banque_Fenetre_A_et_B_Pas_besoin_de_changer_B
 | 
						||
 | 
						||
    pushad
 | 
						||
    xor  ah,ah
 | 
						||
    mov  cl,Granularite
 | 
						||
    mov  dx,ax
 | 
						||
    mov  bx,1
 | 
						||
    shl  dx,cl
 | 
						||
    mov  ax,4F05h
 | 
						||
    int  10h
 | 
						||
    popad
 | 
						||
    mov  VESA_Derniere_banque_Fenetre_B_utilisee,al
 | 
						||
 | 
						||
  VESA_Change_banque_Fenetre_A_et_B_Pas_besoin_de_changer_B:
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
VESA_Change_banque_Fenetre_A_et_B endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;; - -- --- ----\/\ Detection du support VESA sur la machine: /\/---- --- -- -
 | 
						||
;
 | 
						||
;Support_VESA proc near
 | 
						||
;
 | 
						||
;  pushad
 | 
						||
;
 | 
						||
;  ; On pr<70>suppose qu'il n'y a pas d'erreur (pour l'instant)
 | 
						||
;
 | 
						||
;  mov  VESA_Erreur,0
 | 
						||
;
 | 
						||
;  ; On passe en mode graphique, o<> nous attend un super buffer de 64Ko
 | 
						||
;
 | 
						||
;  mov  ax,0013h
 | 
						||
;  int  10h
 | 
						||
;  mov  dx,03C6h  ; On <20>teint la palette
 | 
						||
;  xor  al,al
 | 
						||
;  out  dx,al
 | 
						||
;
 | 
						||
;  ; On demande les infos VESA: (AX=4F00, ES:DI=Adresse du buffer)
 | 
						||
;
 | 
						||
;  mov  ax,0300h    ; Service DPMI simuler une interruption en mode r<>el
 | 
						||
;  mov  bl,10h      ; Interruption <20> appeler (int vid<69>o)
 | 
						||
;  xor  bh,bh       ; Etat des flags pass<73> <20> l'interruption
 | 
						||
;  xor  cx,cx       ; Nb d'elements de la pile <20> passer
 | 
						||
;  mov  edi,0A8000h ; Adresse des valeurs des registres <20> passer <20> l'interruption
 | 
						||
;  mov  dword ptr[edi+28],00004F00h ; EAX pass<73> <20> l'interruption
 | 
						||
;  mov  dword ptr[edi+00],00000000h ; EDI pass<73> <20> l'interruption
 | 
						||
;  mov   word ptr[edi+34],0A000h    ; ES  pass<73> <20> l'interruption
 | 
						||
;  mov  edx,0A0000h
 | 
						||
;  mov  dword ptr[edx],32454256h ; valeur hexa de "VBE2"
 | 
						||
;  int  31h        ; Appel de l'interruption du DPMI
 | 
						||
;
 | 
						||
;  ; Si AX <> 004F => Echec
 | 
						||
;
 | 
						||
;  mov  eax,dword ptr[edi+28]
 | 
						||
;  cmp  ax,004Fh
 | 
						||
;  je   Support_VESA_Pas_d_echec
 | 
						||
;
 | 
						||
;  ; L'appel <20> l'interruption a <20>chou<6F>
 | 
						||
;
 | 
						||
;  Support_VESA_Echec:
 | 
						||
;
 | 
						||
;  mov  VESA_Erreur,1
 | 
						||
;  jmp  Support_VESA_Fin_traitement
 | 
						||
;
 | 
						||
;  Support_VESA_Pas_d_echec:
 | 
						||
;
 | 
						||
;  ; L'appel <20> l'interruption n'a pas <20>chou<6F>
 | 
						||
;
 | 
						||
;  ; On v<>rifie que la signature soit bien <20>gale <20> VESA:
 | 
						||
;
 | 
						||
;  mov  esi,0A0000h
 | 
						||
;  cmp  byte ptr[esi+0],'V'
 | 
						||
;  jne  Support_VESA_Echec
 | 
						||
;
 | 
						||
;  cmp  byte ptr[esi+1],'E'
 | 
						||
;  jne  Support_VESA_Echec
 | 
						||
;
 | 
						||
;  cmp  byte ptr[esi+2],'S'
 | 
						||
;  jne  Support_VESA_Echec
 | 
						||
;
 | 
						||
;  cmp  byte ptr[esi+3],'A'
 | 
						||
;  jne  Support_VESA_Echec
 | 
						||
;
 | 
						||
;  ; La signature est bien pr<70>sente
 | 
						||
;
 | 
						||
;  ; On enregistre l'adresse de la liste des modes VESA support<72>s:
 | 
						||
;
 | 
						||
;  xor  ebx,ebx
 | 
						||
;  xor  eax,eax
 | 
						||
;  mov  bx,[esi+16] ; (Lst_Seg)
 | 
						||
;  mov  ax,[esi+14] ; (Lst_Ofs)
 | 
						||
;  shl  ebx,4
 | 
						||
;  add  ebx,eax
 | 
						||
;  mov  VESA_Liste_des_modes,ebx
 | 
						||
;
 | 
						||
;  ; On enregistre le num<75>ro de version de VESA
 | 
						||
;
 | 
						||
;  mov  ax,word ptr[esi+4]
 | 
						||
;  mov  VESA_Version_Unite,ah
 | 
						||
;  mov  VESA_Version_Decimale,al
 | 
						||
;
 | 
						||
;  ; On enregistre l'adresse de la cha<68>ne du constructeur
 | 
						||
;
 | 
						||
;  xor  ebx,ebx
 | 
						||
;  xor  eax,eax
 | 
						||
;  mov  bx,word ptr[esi+8]
 | 
						||
;  mov  ax,word ptr[esi+6]
 | 
						||
;  shl  ebx,4
 | 
						||
;  add  ebx,eax
 | 
						||
;  mov  VESA_Constructeur,ebx
 | 
						||
;
 | 
						||
;  ; On enregistre la taille totale de m<>moire vid<69>o
 | 
						||
;
 | 
						||
;  mov  ax,[esi+18]
 | 
						||
;  mov  VESA_Taille_memoire,ax
 | 
						||
;
 | 
						||
;
 | 
						||
;  Support_VESA_Fin_Traitement:
 | 
						||
;
 | 
						||
;  popad
 | 
						||
;
 | 
						||
;  ret
 | 
						||
;
 | 
						||
;Support_VESA endp
 | 
						||
;
 | 
						||
;
 | 
						||
;
 | 
						||
;; - -- --- -----\/\ Detection du support VESA pour un mode: /\/----- --- -- -
 | 
						||
;
 | 
						||
;Mode_VESA_supporte proc near
 | 
						||
;
 | 
						||
;  push ebp
 | 
						||
;  mov  ebp,esp
 | 
						||
;
 | 
						||
;  arg  Mode:word
 | 
						||
;
 | 
						||
;  pushad
 | 
						||
;
 | 
						||
;  ; On pressupose qu'il n'y a pas d'erreur (pour l'instant)
 | 
						||
;  ; On se servira de la valeur de SI comme code d'erreur pour faciliter le
 | 
						||
;  ; d<>bugging
 | 
						||
;
 | 
						||
;  mov  si,4 ; Code d'erreur de base
 | 
						||
;  mov  VESA_Erreur,0
 | 
						||
;
 | 
						||
;  ; On va commencer par regarder si le mode n'est pas dans la liste de ceux
 | 
						||
;  ; support<72>s par la carte. Pour cela, il nous faut redemander cette liste
 | 
						||
;  ; car certaines cartes la "perdent" d'un appel sur l'autre.
 | 
						||
;
 | 
						||
;  ; On passe en mode graphique, o<> nous attend un super buffer de 64Ko
 | 
						||
;
 | 
						||
;  mov  ax,0013h
 | 
						||
;  int  10h
 | 
						||
;  mov  dx,03C6h  ; On <20>teint la palette
 | 
						||
;  xor  al,al
 | 
						||
;  out  dx,al
 | 
						||
;
 | 
						||
;  ; On demande les infos VESA: (AX=4F00, ES:DI=Adresse du buffer)
 | 
						||
;
 | 
						||
;  mov  ax,0300h    ; Service DPMI simuler une interruption en mode r<>el
 | 
						||
;  mov  bl,10h      ; Interruption <20> appeler (int vid<69>o)
 | 
						||
;  xor  bh,bh       ; Etat des flags pass<73> <20> l'interruption
 | 
						||
;  xor  cx,cx       ; Nb d'elements de la pile <20> passer
 | 
						||
;  mov  edi,0A8000h ; Adresse des valeurs des registres <20> passer <20> l'interruption
 | 
						||
;  mov  dword ptr[edi+28],00004F00h ; EAX pass<73> <20> l'interruption
 | 
						||
;  mov  dword ptr[edi+00],00000000h ; EDI pass<73> <20> l'interruption
 | 
						||
;  mov   word ptr[edi+34],0A000h    ; ES  pass<73> <20> l'interruption
 | 
						||
;  mov  edx,0A0000h
 | 
						||
;  mov  dword ptr[edx],32454256h ; valeur hexa de "VBE2"
 | 
						||
;  int  31h        ; Appel de l'interruption du DPMI
 | 
						||
;
 | 
						||
;  ; Si AX <> 004F => Echec
 | 
						||
;
 | 
						||
;  mov  eax,dword ptr[edi+28]
 | 
						||
;  cmp  ax,004Fh
 | 
						||
;  jne  Mode_VESA_supporte_Echec
 | 
						||
;
 | 
						||
;  ; On enregistre l'adresse de la liste des modes VESA support<72>s dans EDI
 | 
						||
;
 | 
						||
;  mov  edi,0A0000h
 | 
						||
;  xor  ebx,ebx
 | 
						||
;  xor  eax,eax
 | 
						||
;  mov  bx,[edi+16] ; (Lst_Seg)
 | 
						||
;  mov  ax,[edi+14] ; (Lst_Ofs)
 | 
						||
;  shl  ebx,4
 | 
						||
;  add  ebx,eax
 | 
						||
;  mov  edi,ebx
 | 
						||
;
 | 
						||
;  ; Et on parcours la liste pour chercher le mode demand<6E>
 | 
						||
;
 | 
						||
;  mov  ax,Mode
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Boucle:
 | 
						||
;
 | 
						||
;    cmp  [edi],ax
 | 
						||
;    je   Mode_VESA_supporte_Fin_boucle
 | 
						||
;
 | 
						||
;    cmp  word ptr[edi],0FFFFh
 | 
						||
;    je   Mode_VESA_supporte_Fin_boucle
 | 
						||
;
 | 
						||
;    add  edi,2
 | 
						||
;    jmp  Mode_VESA_supporte_Boucle
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Fin_boucle:
 | 
						||
;
 | 
						||
;  ; Si le mode en cours = FFFF => Echec
 | 
						||
;
 | 
						||
;  mov  si,5 ; Nouveau code d'erreur
 | 
						||
;
 | 
						||
;  cmp  word ptr[edi],ax
 | 
						||
;  je   Mode_VESA_supporte_Pas_echec
 | 
						||
;
 | 
						||
;  ; Ce mode vid<69>o VESA n'est pas support<72>:
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Echec:
 | 
						||
;
 | 
						||
;  mov  ax,si
 | 
						||
;  mov  VESA_Erreur,al
 | 
						||
;  jmp  Mode_VESA_supporte_Fin_traitement
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Pas_echec:
 | 
						||
;
 | 
						||
;  ; Ce mode vid<69>o VESA est un <20>l<EFBFBD>ment de la liste:
 | 
						||
;
 | 
						||
;  ; On passe en mode graphique, o<> nous attend un super buffer de 64Ko (c00l)
 | 
						||
;
 | 
						||
;  mov  ax,0013h
 | 
						||
;  int  10h
 | 
						||
;  mov  dx,03C6h  ; On <20>teint la palette
 | 
						||
;  xor  al,al
 | 
						||
;  out  dx,al
 | 
						||
;
 | 
						||
;  ; On demande les infos VESA du mode: (AX=4F01, CX=Mode, ES:DI=Adresse du buffer)
 | 
						||
;
 | 
						||
;  mov  ax,0300h    ; Service DPMI simuler une interruption en mode r<>el
 | 
						||
;  mov  bl,10h      ; Interruption <20> appeler (int vid<69>o)
 | 
						||
;  xor  bh,bh       ; Etat des flags pass<73> <20> l'interruption
 | 
						||
;  xor  cx,cx       ; Nb d'elements de la pile <20> passer
 | 
						||
;  mov  edi,0A8000h ; Adresse des valeurs des registres <20> passer <20> l'interruption
 | 
						||
;  mov  dword ptr[edi+28],00004F01h ; AX pass<73> <20> l'interruption
 | 
						||
;  xor  edx,edx
 | 
						||
;  mov  dx,Mode
 | 
						||
;  mov  dword ptr[edi+24],edx       ; ECX pass<73> <20> l'interruption
 | 
						||
;  mov  dword ptr[edi+00],00000000h ; EDI pass<73> <20> l'interruption
 | 
						||
;  mov   word ptr[edi+34],0A000h    ;  ES pass<73> <20> l'interruption
 | 
						||
;  int  31h        ; Appel de l'interruption du DPMI
 | 
						||
;
 | 
						||
;  ; Si AX <> 004F => Echec
 | 
						||
;
 | 
						||
;  mov  si,6 ; Nouveau code d'erreur
 | 
						||
;
 | 
						||
;  mov  eax,dword ptr[edi+28]
 | 
						||
;  cmp  ax,004Fh
 | 
						||
;  jne  Mode_VESA_supporte_Echec
 | 
						||
;
 | 
						||
;  ; L'appel <20> l'interruption n'a pas <20>chou<6F>
 | 
						||
;
 | 
						||
;  ; On v<>rifie l'utilit<69> des deux fen<65>tres:
 | 
						||
;
 | 
						||
;  mov  edi,0A0000h
 | 
						||
;  mov  al,[edi+2]
 | 
						||
;  and  al,7
 | 
						||
;  cmp  al,7
 | 
						||
;  jne  Mode_VESA_supporte_Fenetre_A_insuffisante
 | 
						||
;
 | 
						||
;  mov  VESA_Erreur,0
 | 
						||
;  jmp  Mode_VESA_supporte_Traitement_fenetres_termine
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Fenetre_A_insuffisante:
 | 
						||
;
 | 
						||
;  mov  al,[edi+3]
 | 
						||
;  and  al,7
 | 
						||
;  cmp  al,7
 | 
						||
;  jne  Mode_VESA_supporte_Fenetre_B_insuffisante
 | 
						||
;
 | 
						||
;  mov  VESA_Erreur,1
 | 
						||
;  jmp  Mode_VESA_supporte_Traitement_fenetres_termine
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Fenetre_B_insuffisante:
 | 
						||
;
 | 
						||
;  mov  al,[edi+2]
 | 
						||
;  test al,1
 | 
						||
;  jz   Mode_VESA_supporte_Pas_fenetres_par_defaut
 | 
						||
;
 | 
						||
;  mov  VESA_Erreur,2
 | 
						||
;  jmp  Mode_VESA_supporte_Traitement_fenetres_termine
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Pas_fenetres_par_defaut:
 | 
						||
;
 | 
						||
;  test al,2
 | 
						||
;  jz   Mode_VESA_supporte_Fenetre_A_pas_lisible
 | 
						||
;
 | 
						||
;  mov  VESA_Erreur,3
 | 
						||
;  jmp  Mode_VESA_supporte_Traitement_fenetres_termine
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Fenetre_A_pas_lisible:
 | 
						||
;
 | 
						||
;  mov  VESA_Erreur,2
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Traitement_fenetres_termine:
 | 
						||
;
 | 
						||
;  ; On v<>rifie que la taille des fen<65>tres soit bien de 64Ko:
 | 
						||
;
 | 
						||
;  mov  si,7 ; Nouveau code d'erreur
 | 
						||
;
 | 
						||
;  cmp  word ptr[edi+6],64
 | 
						||
;  jne  Mode_VESA_supporte_Echec
 | 
						||
;
 | 
						||
;  ; On lit la valeur de granularite:
 | 
						||
;
 | 
						||
;  mov  ax,[edi+4]
 | 
						||
;
 | 
						||
;  ; Et on en d<>duit un facteur de granularite:
 | 
						||
;
 | 
						||
;  ; Test si granularite = 64:
 | 
						||
;
 | 
						||
;  cmp  ax,64
 | 
						||
;  jne  Mode_VESA_supporte_Gran_pas_64
 | 
						||
;
 | 
						||
;  mov  Granularite,0
 | 
						||
;  jmp  Mode_VESA_supporte_Fin_traitement_granularite
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Gran_pas_64:
 | 
						||
;
 | 
						||
;  ; Test si granularite = 32:
 | 
						||
;
 | 
						||
;  cmp  ax,32
 | 
						||
;  jne  Mode_VESA_supporte_Gran_pas_32
 | 
						||
;
 | 
						||
;  mov  Granularite,1
 | 
						||
;  jmp  Mode_VESA_supporte_Fin_traitement_granularite
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Gran_pas_32:
 | 
						||
;
 | 
						||
;  ; Test si granularite = 16:
 | 
						||
;
 | 
						||
;  cmp  ax,16
 | 
						||
;  jne  Mode_VESA_supporte_Gran_pas_16
 | 
						||
;
 | 
						||
;  mov  Granularite,2
 | 
						||
;  jmp  Mode_VESA_supporte_Fin_traitement_granularite
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Gran_pas_16:
 | 
						||
;
 | 
						||
;  ; Test si granularite = 8:
 | 
						||
;
 | 
						||
;  cmp  ax,8
 | 
						||
;  jne  Mode_VESA_supporte_Gran_pas_8
 | 
						||
;
 | 
						||
;  mov  Granularite,3
 | 
						||
;  jmp  Mode_VESA_supporte_Fin_traitement_granularite
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Gran_pas_8:
 | 
						||
;
 | 
						||
;  ; Test si granularite = 4:
 | 
						||
;
 | 
						||
;  cmp  ax,4
 | 
						||
;  jne  Mode_VESA_supporte_Gran_pas_4
 | 
						||
;
 | 
						||
;  mov  Granularite,4
 | 
						||
;  jmp  Mode_VESA_supporte_Fin_traitement_granularite
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Gran_pas_4:
 | 
						||
;
 | 
						||
;  ; Test si granularite = 2:
 | 
						||
;
 | 
						||
;  cmp  ax,2
 | 
						||
;  jne  Mode_VESA_supporte_Gran_pas_2
 | 
						||
;
 | 
						||
;  mov  Granularite,5
 | 
						||
;  jmp  Mode_VESA_supporte_Fin_traitement_granularite
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Gran_pas_2:
 | 
						||
;
 | 
						||
;  ; Test si granularite = 1:
 | 
						||
;
 | 
						||
;  cmp  ax,1
 | 
						||
;  jne  Mode_VESA_supporte_Gran_pas_1
 | 
						||
;
 | 
						||
;  mov  Granularite,6
 | 
						||
;  jmp  Mode_VESA_supporte_Fin_traitement_granularite
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Gran_pas_1:
 | 
						||
;
 | 
						||
;  mov  VESA_Erreur,4
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Fin_traitement_granularite:
 | 
						||
;
 | 
						||
;
 | 
						||
;
 | 
						||
;  mov  VESA_WinFuncPtr,00000000h
 | 
						||
;
 | 
						||
;  ; On passe en mode graphique, o<> nous attend un super buffer de 64Ko (c00l)
 | 
						||
;
 | 
						||
;  mov  ax,0013h
 | 
						||
;  int  10h
 | 
						||
;  mov  dx,03C6h  ; On <20>teint la palette
 | 
						||
;  xor  al,al
 | 
						||
;  out  dx,al
 | 
						||
;
 | 
						||
;  ; On demande le code de changement de banque
 | 
						||
;
 | 
						||
;  mov  ax,0300h    ; Service DPMI simuler une interruption en mode r<>el
 | 
						||
;  mov  bl,10h      ; Interruption <20> appeler (int vid<69>o)
 | 
						||
;  xor  bh,bh       ; Etat des flags pass<73> <20> l'interruption
 | 
						||
;  xor  cx,cx       ; Nb d'elements de la pile <20> passer
 | 
						||
;  mov  edi,0A8000h ; Adresse des valeurs des registres <20> passer <20> l'interruption
 | 
						||
;  mov  dword ptr[edi+28],00004F0Ah ; EAX pass<73> <20> l'interruption
 | 
						||
;  mov  dword ptr[edi+16],00000000h ; EBX pass<73> <20> l'interruption
 | 
						||
;  int  31h         ; Appel de l'interruption du DPMI
 | 
						||
;
 | 
						||
;  ; Si AX <> 004F => Echec
 | 
						||
;
 | 
						||
;  mov  si,8 ; Nouveau code d'erreur
 | 
						||
;
 | 
						||
;  mov  eax,dword ptr[edi+28]
 | 
						||
;  cmp  ax,004Fh
 | 
						||
;  jne  Mode_VESA_supporte_Fin_traitement
 | 
						||
;
 | 
						||
;  ; On note l'adresse du handler software de changement de banque
 | 
						||
;
 | 
						||
;  xor  eax,eax
 | 
						||
;  xor  ecx,ecx
 | 
						||
;  mov  ax,word ptr[edi+34]  ; ES retourn<72> par l'interruption
 | 
						||
;  mov  cx,word ptr[edi+00]  ; DI retourn<72> par l'interruption
 | 
						||
;  shl  eax,4
 | 
						||
;  add  eax,ecx
 | 
						||
;  mov  cx,[eax]
 | 
						||
;  add  eax,ecx
 | 
						||
;  mov  VESA_WinFuncPtr,eax
 | 
						||
;
 | 
						||
;  Mode_VESA_supporte_Fin_traitement:
 | 
						||
;
 | 
						||
;
 | 
						||
;  popad
 | 
						||
;
 | 
						||
;  mov  esp,ebp
 | 
						||
;  pop  ebp
 | 
						||
;
 | 
						||
;  ret
 | 
						||
;
 | 
						||
;Mode_VESA_supporte endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- Initialisation du Mode Graphique VESA --
 | 
						||
 | 
						||
Initialiser_mode_video_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Video_mode:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
  mov  VESA_Derniere_banque_Fenetre_A_utilisee,0
 | 
						||
  mov  VESA_Derniere_banque_Fenetre_B_utilisee,0
 | 
						||
 | 
						||
  mov  ax,4F02h
 | 
						||
  mov  bx,Video_mode
 | 
						||
  int  10h
 | 
						||
 | 
						||
  ; On donne la largeur logique de l'<27>cran car certaines cartes vid<69>o la
 | 
						||
  ; reconnaissent mal... (va savoir pourquoi!?)
 | 
						||
  mov  ax,4F06h
 | 
						||
  xor  bl,bl
 | 
						||
  mov  cx,Largeur_ecran
 | 
						||
  int  10h
 | 
						||
 | 
						||
  ; On calcule la distance d'octet en m<>moire qu'il y a entre la fin d'une
 | 
						||
  ; ligne d'image <20> l'<27>cran et le d<>but de la suivante <20> l'<27>cran:
 | 
						||
  ;
 | 
						||
  ; Decalage = (Largeur_image - Largeur_ecran)
 | 
						||
 | 
						||
  xor  ebx,ebx
 | 
						||
  mov   bx,Principal_Largeur_image
 | 
						||
  sub  bx,Largeur_ecran
 | 
						||
  mov  VESA_Decalage_synchro,ebx
 | 
						||
 | 
						||
  ; On calcule la largeur d'une ligne de l'<27>cran en dword:
 | 
						||
  ;
 | 
						||
  ; Largeur en dword = Largeur_ecran shr 2
 | 
						||
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  shr  ax,2
 | 
						||
  mov  VESA_Largeur_ecran_en_dword,ax
 | 
						||
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Initialiser_mode_video_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; - --/\/ Retoucher les registres du CRTC pour redimensionner l'<27>cran \/\-- -
 | 
						||
 | 
						||
Retoucher_CRTC proc near
 | 
						||
 | 
						||
  pushad
 | 
						||
 | 
						||
  mov  esi,Mode_X_Ptr
 | 
						||
  cld
 | 
						||
  lodsb
 | 
						||
  or   al,al
 | 
						||
  jz   NoThankYou
 | 
						||
  mov  dx,3C2h
 | 
						||
  out  dx,al
 | 
						||
  NoThankYou:
 | 
						||
 | 
						||
  mov  dx,3D4h
 | 
						||
  mov  al,11h
 | 
						||
  out  dx,al
 | 
						||
  inc  dx
 | 
						||
  in   al,dx
 | 
						||
  and  al,7Fh
 | 
						||
  out  dx,al
 | 
						||
 | 
						||
  dec  dx
 | 
						||
  lodsb
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  cl,al
 | 
						||
  rep  outsw
 | 
						||
 | 
						||
  popad
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Retoucher_CRTC endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- Affichage d'un point graphique en X,Y --
 | 
						||
 | 
						||
Pixel_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Couleur:byte
 | 
						||
 | 
						||
 | 
						||
  mov  edx,0A0000h
 | 
						||
  mov  cl,Couleur
 | 
						||
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mul  Largeur_ecran
 | 
						||
  add  ax,Pos_X
 | 
						||
  adc  dx,0
 | 
						||
 | 
						||
  xchg dx,ax
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  mov  [edx],cl
 | 
						||
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- R<>cup<75>ration d'un point graphique en X,Y --
 | 
						||
 | 
						||
Lit_pixel_VESA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  ARG   Pos_X:word,Pos_Y:word
 | 
						||
 | 
						||
 | 
						||
  xor   eax,eax
 | 
						||
  mov   edx,0A0000h
 | 
						||
 | 
						||
  mov   ax,Pos_Y
 | 
						||
  mul   Largeur_ecran
 | 
						||
  add   ax,Pos_X
 | 
						||
  adc   dx,0
 | 
						||
 | 
						||
  xchg  dx,ax
 | 
						||
  call  [VESA_Change_banque_lecture]
 | 
						||
 | 
						||
  mov   al,byte ptr[edx]
 | 
						||
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Lit_pixel_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Effacer_tout_l_ecran_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Couleur:byte
 | 
						||
 | 
						||
  pushad
 | 
						||
 | 
						||
 | 
						||
  ; On met dans EBX 4 fois la couleur
 | 
						||
 | 
						||
  mov  al,Couleur
 | 
						||
  mov  ah,al
 | 
						||
  mov  bx,ax
 | 
						||
  shl  ebx,16
 | 
						||
  mov  bx,ax
 | 
						||
 | 
						||
  ; On calcule l'endroit jusqu'o<> on efface l'ecran
 | 
						||
 | 
						||
  mov  ax,Menu_ordonnee
 | 
						||
  mul  Largeur_ecran
 | 
						||
 | 
						||
  ; DX = Derni<6E>re banque touch<63>e
 | 
						||
  ; AX = Derni<6E>re position touch<63>e
 | 
						||
 | 
						||
  shr  ax,2 ; On divise AX par 4 puisqu'on travaille avec des dword
 | 
						||
 | 
						||
  Pour_chaque_banque:
 | 
						||
 | 
						||
    ; On passe <20> la banque DL
 | 
						||
 | 
						||
    xchg dx,ax
 | 
						||
    call [VESA_Change_banque_ecriture]
 | 
						||
    xchg dx,ax
 | 
						||
 | 
						||
    ; On se positionne en d<>but de banque:
 | 
						||
 | 
						||
    mov  edi,0A0000h
 | 
						||
 | 
						||
    ; On efface AX mots:
 | 
						||
 | 
						||
    mov  cx,ax
 | 
						||
 | 
						||
    ; On met dans EAX 4 fois la couleur:
 | 
						||
 | 
						||
    mov  eax,ebx
 | 
						||
 | 
						||
    Boucle:
 | 
						||
 | 
						||
      mov  [edi],eax
 | 
						||
      add  edi,4
 | 
						||
      dec  cx
 | 
						||
      jnz  Boucle
 | 
						||
 | 
						||
    mov  ax,4000h ; On demande pour la prochaine banque un remplissage sur
 | 
						||
		  ; toute sa taille
 | 
						||
 | 
						||
    dec  dl
 | 
						||
    jns  Pour_chaque_banque
 | 
						||
 | 
						||
 | 
						||
  popad
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Effacer_tout_l_ecran_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Block_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Debut_X:word,Debut_Y:word,Largeur:word,Hauteur:word,Couleur:byte
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On place dans ESI 4 fois la couleur
 | 
						||
 | 
						||
  mov  cl,Couleur
 | 
						||
  mov  ch,cl
 | 
						||
  mov  si,cx
 | 
						||
  shl  esi,16
 | 
						||
  mov  si,cx
 | 
						||
 | 
						||
  ; On calcule dans EDI la premi<6D>re coordonn<6E>e du bloc:
 | 
						||
 | 
						||
  mov  ax,Debut_Y
 | 
						||
  mul  Largeur_ecran
 | 
						||
  add  ax,Debut_X
 | 
						||
  adc  dx,0
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On m<>morise la banque n<>cessaire
 | 
						||
 | 
						||
  mov  VESA_Banque_en_cours,dl
 | 
						||
 | 
						||
  ; On passe dans cette banque
 | 
						||
 | 
						||
  mov  al,dl
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On met dans BX le nombre de ligne <20> traiter:
 | 
						||
 | 
						||
  mov  bx,Hauteur
 | 
						||
 | 
						||
  ; On met dans DX le d<>calage qu'il faudra effectuer en fin de ligne sur DI
 | 
						||
  ; pour qu'il pointe sur la nouvelle ligne
 | 
						||
 | 
						||
  mov  dx,Largeur_ecran
 | 
						||
  sub  dx,Largeur
 | 
						||
 | 
						||
  xor  ecx,ecx
 | 
						||
 | 
						||
  Block_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On regarde si la totalit<69> de la ligne loge dans la banque:
 | 
						||
 | 
						||
    mov  cx,di
 | 
						||
    add  cx,Largeur
 | 
						||
    jc   Block_VESA_Ligne_rompue
 | 
						||
 | 
						||
    ; A ce stade, on sait que la ligne loge enti<74>rement sur l'<27>cran
 | 
						||
 | 
						||
    ; On va donc placer dans EAX 4 fois la couleur
 | 
						||
 | 
						||
    mov  eax,esi
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> afficher sur la ligne
 | 
						||
 | 
						||
    mov  cx,Largeur
 | 
						||
 | 
						||
    ; On commence par afficher les "d<>chets" de d<>but de ligne
 | 
						||
 | 
						||
    shr  cx,1
 | 
						||
    jnc  Block_VESA_Ininterrompue_Largeur_paire
 | 
						||
    stosb
 | 
						||
 | 
						||
    Block_VESA_Ininterrompue_Largeur_paire:
 | 
						||
 | 
						||
    shr  cx,1
 | 
						||
    jnc  Block_VESA_Ininterrompue_Largeur_multiple_de_4
 | 
						||
    stosw
 | 
						||
 | 
						||
    Block_VESA_Ininterrompue_Largeur_multiple_de_4:
 | 
						||
 | 
						||
    ; On affiche ce qui reste de la ligne
 | 
						||
 | 
						||
    rep  stosd
 | 
						||
 | 
						||
    ; On regarde si ce n'<27>tait pas la derni<6E>re ligne
 | 
						||
 | 
						||
    dec  bx
 | 
						||
    jz   Block_VESA_Fin_de_traitement
 | 
						||
 | 
						||
    ; Sinon,
 | 
						||
    ; Maintenant que la ligne est affich<63>e, on regarde si le changement de
 | 
						||
    ; ligne ne d<>clenche pas un changement de banque:
 | 
						||
 | 
						||
    add  di,dx
 | 
						||
    jnc  Block_VESA_Pour_chaque_ligne
 | 
						||
 | 
						||
    ; Si le changement de banque est n<>cessaire, on s'en fait un:
 | 
						||
 | 
						||
    inc  VESA_Banque_en_cours
 | 
						||
    mov  al,VESA_Banque_en_cours
 | 
						||
    call [VESA_Change_banque_ecriture]
 | 
						||
    jmp  Block_VESA_Pour_chaque_ligne
 | 
						||
 | 
						||
  Block_VESA_Ligne_rompue:
 | 
						||
 | 
						||
    ; A ce stade, on sait que la ligne ne loge pas enti<74>rement sur l'<27>cran
 | 
						||
 | 
						||
    ; On m<>morise dans la pile ce qu'il restera <20> afficher <20> la droite de la
 | 
						||
    ; rupture:
 | 
						||
 | 
						||
    push cx
 | 
						||
 | 
						||
    ; On place dans EAX 4 fois la couleur
 | 
						||
 | 
						||
    mov  eax,esi
 | 
						||
 | 
						||
    ; On met dans CX le nb de pixels affichables avant la rupture
 | 
						||
 | 
						||
    mov  cx,di
 | 
						||
    neg  cx
 | 
						||
 | 
						||
    ; On commence par afficher les "d<>chets" de d<>but de ligne
 | 
						||
 | 
						||
    shr  cx,1
 | 
						||
    jnc  Block_VESA_Interrompue_Largeur_gauche_paire
 | 
						||
    stosb
 | 
						||
 | 
						||
    Block_VESA_Interrompue_Largeur_gauche_paire:
 | 
						||
 | 
						||
    shr  cx,1
 | 
						||
    jnc  Block_VESA_Interrompue_Largeur_gauche_multiple_de_4
 | 
						||
    stosw
 | 
						||
 | 
						||
    Block_VESA_Interrompue_Largeur_gauche_multiple_de_4:
 | 
						||
 | 
						||
    ; On affiche ce qui reste de la partie gauche de la ligne
 | 
						||
 | 
						||
    rep  stosd
 | 
						||
 | 
						||
    ; On change de banque:
 | 
						||
 | 
						||
    inc  VESA_Banque_en_cours
 | 
						||
    mov  al,VESA_Banque_en_cours
 | 
						||
    call [VESA_Change_banque_ecriture]
 | 
						||
    mov  eax,esi
 | 
						||
 | 
						||
    ; On replace EDI en d<>but de banque
 | 
						||
 | 
						||
    mov  edi,0A0000h
 | 
						||
 | 
						||
    ; On restaure le nb de pixels <20> afficher <20> droite de la rupture
 | 
						||
 | 
						||
    pop  cx
 | 
						||
 | 
						||
    ; On commence par afficher les "d<>chets" de d<>but de ligne
 | 
						||
 | 
						||
    shr  cx,1
 | 
						||
    jnc  Block_VESA_Interrompue_Largeur_droite_paire
 | 
						||
    stosb
 | 
						||
 | 
						||
    Block_VESA_Interrompue_Largeur_droite_paire:
 | 
						||
 | 
						||
    shr  cx,1
 | 
						||
    jnc  Block_VESA_Interrompue_Largeur_droite_multiple_de_4
 | 
						||
    stosw
 | 
						||
 | 
						||
    Block_VESA_Interrompue_Largeur_droite_multiple_de_4:
 | 
						||
 | 
						||
    ; On affiche ce qui reste de la partie droite de la ligne
 | 
						||
 | 
						||
    rep  stosd
 | 
						||
 | 
						||
    ; On regarde si ce n'<27>tait pas la derni<6E>re ligne
 | 
						||
    ; (on peut se permettre de supposer qu'apr<70>s ce changement de banque,
 | 
						||
    ;  on ne cours qu'un risque proche de 0 qu'un nouveau changement de
 | 
						||
    ;  banque survienne lors du changement de ligne - pour ne pas dire que
 | 
						||
    ;  c'est une chose impossible)
 | 
						||
 | 
						||
    add  di,dx
 | 
						||
    dec  bx
 | 
						||
    jnz  Block_VESA_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  Block_VESA_Fin_de_traitement:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Block_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- Affichage d'un pixel dans l'<27>cran, par rapport au d<>calage de l'image
 | 
						||
;    dans l'<27>cran, en mode normal (pas en mode loupe) --
 | 
						||
 | 
						||
; Note: si on modifie cette proc<6F>dure, il faudra penser <20> faire <20>galement la
 | 
						||
;       modif dans la proc<6F>dure Pixel_Preview_Loupe_VESA.
 | 
						||
 | 
						||
Pixel_Preview_Normal_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  X:word,Y:word,Couleur:byte
 | 
						||
 | 
						||
 | 
						||
  mov  dl,Couleur
 | 
						||
  mov  cx,Y
 | 
						||
  mov  ax,X
 | 
						||
  sub  cx,Principal_Decalage_Y
 | 
						||
  sub  ax,Principal_Decalage_X
 | 
						||
  push edx
 | 
						||
  push ecx
 | 
						||
  push eax
 | 
						||
 | 
						||
  call Pixel_VESA
 | 
						||
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_Preview_Normal_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; -- Affichage d'un pixel dans l'<27>cran, par rapport au d<>calage de l'image
 | 
						||
;    dans l'<27>cran, en mode loupe --
 | 
						||
 | 
						||
Pixel_Preview_Loupe_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  X:word,Y:word,Couleur:byte
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
 | 
						||
  ; On affiche d'abord le pixel dans la partie non-zoom<6F>e
 | 
						||
 | 
						||
  mov  dl,Couleur               ; Ca ne co<63>te pas trop
 | 
						||
  mov  cx,Y                     ; en code de recopier
 | 
						||
  mov  ax,X                     ; le contenu de la
 | 
						||
  sub  cx,Principal_Decalage_Y  ; proc<6F>dure
 | 
						||
  sub  ax,Principal_Decalage_X  ; Pixel_Preview_Normal_VESA
 | 
						||
  push edx                      ; et <20>a fait gagner du
 | 
						||
  push ecx                      ; temps, et ce temps est
 | 
						||
  push eax                      ; assez pr<70>cieux vu que
 | 
						||
  call Pixel_VESA               ; c'est appel<65> TRES souvent.
 | 
						||
  add  esp,12  ; 3 param<61>tres dword
 | 
						||
 | 
						||
  ; On regarde si on peut afficher le pixel <20>galement dans la loupe
 | 
						||
 | 
						||
  mov  ax,Y
 | 
						||
  cmp  ax,Limite_Haut_Zoom
 | 
						||
  jb   Pixel_Preview_Loupe_VESA_Fin
 | 
						||
  cmp  ax,Limite_visible_Bas_Zoom
 | 
						||
  ja   Pixel_Preview_Loupe_VESA_Fin
 | 
						||
  mov  ax,X
 | 
						||
  cmp  ax,Limite_Gauche_Zoom
 | 
						||
  jb   Pixel_Preview_Loupe_VESA_Fin
 | 
						||
  cmp  ax,Limite_visible_Droite_Zoom
 | 
						||
  ja   Pixel_Preview_Loupe_VESA_Fin
 | 
						||
 | 
						||
  ; On passe la couleur
 | 
						||
 | 
						||
  mov  al,Couleur
 | 
						||
  mov  edx,Table_mul_facteur_zoom       ; On pointe sur la table de x (OPTI)
 | 
						||
  push eax
 | 
						||
 | 
						||
  ; On calcule dans EAX (X) et ECX (Y) le d<>marrage du bloc:
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,X
 | 
						||
  mov  cx,Y
 | 
						||
  sub  ax,Loupe_Decalage_X
 | 
						||
  sub  cx,Loupe_Decalage_Y
 | 
						||
  mov  ax,[edx+2*eax]
 | 
						||
  mov  cx,[edx+2*ecx]
 | 
						||
 | 
						||
  ; On sauve ces valeurs dans BX (X) et DX (Y):
 | 
						||
 | 
						||
  mov  bx,ax
 | 
						||
  mov  dx,cx
 | 
						||
 | 
						||
  ; On s'occupe de la hauteur:
 | 
						||
 | 
						||
  add  cx,Loupe_Facteur
 | 
						||
  cmp  cx,Menu_Ordonnee
 | 
						||
  ja   Pixel_Preview_Loupe_VESA_Tronque_en_hauteur
 | 
						||
 | 
						||
  mov  cx,Loupe_Facteur
 | 
						||
  push ecx
 | 
						||
  jmp  Pixel_Preview_Loupe_VESA_Traitement_de_la_largeur
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_VESA_Tronque_en_hauteur:
 | 
						||
 | 
						||
  mov  cx,dx
 | 
						||
  neg  cx
 | 
						||
  add  cx,Menu_Ordonnee
 | 
						||
  push ecx
 | 
						||
 | 
						||
  ; On s'occupe de la largeur:
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_VESA_Traitement_de_la_largeur:
 | 
						||
 | 
						||
  add  bx,Principal_X_Zoom
 | 
						||
 | 
						||
  mov  ax,Loupe_Facteur
 | 
						||
  push eax
 | 
						||
 | 
						||
  ; On passe le d<>but en Y:
 | 
						||
  push edx
 | 
						||
 | 
						||
  ; On passe le d<>but en X:
 | 
						||
  push ebx
 | 
						||
 | 
						||
  call Block_VESA
 | 
						||
 | 
						||
 | 
						||
  add  esp,20                   ; 20 = 5 param<61>tres de type dword
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  Pixel_Preview_Loupe_VESA_Fin:
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Pixel_Preview_Loupe_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Ligne_horizontale_XOR_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word, Pos_Y:word, Largeur:word
 | 
						||
 | 
						||
 | 
						||
  mov  edx,0A0000h
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mul  Largeur_ecran
 | 
						||
  add  ax,Pos_X
 | 
						||
  adc  dx,0
 | 
						||
 | 
						||
  xchg dx,ax
 | 
						||
  call [VESA_Change_banque_lect_ecr]
 | 
						||
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  LH_VESA_Boucle:
 | 
						||
 | 
						||
    not  byte ptr[edx]
 | 
						||
 | 
						||
    inc  dx
 | 
						||
    jnz  LH_VESA_Pas_de_changement_de_banque
 | 
						||
 | 
						||
    inc  al
 | 
						||
    call [VESA_Change_banque_lect_ecr]
 | 
						||
 | 
						||
    LH_VESA_Pas_de_changement_de_banque:
 | 
						||
 | 
						||
    dec  cx
 | 
						||
    jnz  LH_VESA_Boucle
 | 
						||
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Ligne_horizontale_XOR_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Ligne_verticale_XOR_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word, Pos_Y:word, Hauteur:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
 | 
						||
  mov  bx,Largeur_ecran
 | 
						||
  mov  edx,0A0000h
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mul  bx
 | 
						||
  add  ax,Pos_X
 | 
						||
  adc  dx,0
 | 
						||
 | 
						||
  xchg dx,ax
 | 
						||
  call [VESA_Change_banque_lect_ecr]
 | 
						||
 | 
						||
  mov  cx,Hauteur
 | 
						||
 | 
						||
  LV_VESA_Boucle:
 | 
						||
 | 
						||
    not  byte ptr[edx]
 | 
						||
 | 
						||
    add  dx,bx
 | 
						||
    jnc  LV_VESA_Pas_de_changement_de_banque
 | 
						||
 | 
						||
    inc  al
 | 
						||
    call [VESA_Change_banque_lect_ecr]
 | 
						||
 | 
						||
    LV_VESA_Pas_de_changement_de_banque:
 | 
						||
 | 
						||
    dec  cx
 | 
						||
    jnz  LV_VESA_Boucle
 | 
						||
 | 
						||
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Ligne_verticale_XOR_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse en couleur en MCGA
 | 
						||
 | 
						||
Display_brush_Color_MCGA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Largeur_brosse:word
 | 
						||
 | 
						||
  push  ebx
 | 
						||
  push  esi
 | 
						||
  push  edi
 | 
						||
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran
 | 
						||
  mov   edi,0A0000h
 | 
						||
  mov   di,Pos_Y   ; |
 | 
						||
  mov   bx,di      ; |
 | 
						||
  shl   di,8       ; |- DI <- Pos_Y * 320
 | 
						||
  shl   bx,6       ; |
 | 
						||
  add   di,bx      ; |
 | 
						||
  add   di,Pos_X
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es (Decalage_X,Decalage_Y) dans la brosse
 | 
						||
  xor   eax,eax
 | 
						||
  xor   ebx,ebx
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov   ax,Largeur_brosse
 | 
						||
  mov   bx,Decalage_Y
 | 
						||
  mov   cx,Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Brosse
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; On place dans DX le nb de lignes <20> traiter
 | 
						||
  mov   dx,Hauteur
 | 
						||
 | 
						||
  ; On place dans BH la couleur de transparence
 | 
						||
  mov   bh,Couleur_de_transparence
 | 
						||
 | 
						||
  ; On place dans EAX la distance entre deux lignes <20> l'<27>cran
 | 
						||
  mov   eax,320
 | 
						||
  sub    ax,Largeur
 | 
						||
 | 
						||
  Display_brush_Color_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la ligne
 | 
						||
    mov   cx,Largeur
 | 
						||
 | 
						||
    Display_brush_Color_MCGA_Pour_chaque_pixel:
 | 
						||
 | 
						||
      ; On lit le contenu de la brosse
 | 
						||
      mov   bl,[esi]
 | 
						||
 | 
						||
      ; Gestion de la transparence
 | 
						||
      cmp   bl,bh
 | 
						||
      je    Display_brush_Color_MCGA_Pas_de_copie
 | 
						||
 | 
						||
	; On affiche le pixel de la brosse <20> l'<27>cran
 | 
						||
	mov   [edi],bl
 | 
						||
 | 
						||
      Display_brush_Color_MCGA_Pas_de_copie:
 | 
						||
 | 
						||
      ; On passe au pixel suivant
 | 
						||
      inc   esi
 | 
						||
      inc   edi
 | 
						||
      dec   cx
 | 
						||
      jnz   Display_brush_Color_MCGA_Pour_chaque_pixel
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    mov   cx,Largeur_brosse
 | 
						||
    add   edi,eax
 | 
						||
    sub   cx,Largeur
 | 
						||
    add   esi,ecx
 | 
						||
    dec   dx
 | 
						||
    jnz   Display_brush_Color_MCGA_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  pop   edi
 | 
						||
  pop   esi
 | 
						||
  pop   ebx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Color_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse en monochrome en MCGA
 | 
						||
 | 
						||
Display_brush_Mono_MCGA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Couleur:byte,Largeur_brosse:word
 | 
						||
 | 
						||
  push  ebx
 | 
						||
  push  esi
 | 
						||
  push  edi
 | 
						||
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran
 | 
						||
  mov   edi,0A0000h
 | 
						||
  mov   di,Pos_Y   ; |
 | 
						||
  mov   bx,di      ; |
 | 
						||
  shl   di,8       ; |- DI <- Pos_Y * 320
 | 
						||
  shl   bx,6       ; |
 | 
						||
  add   di,bx      ; |
 | 
						||
  add   di,Pos_X
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es (Decalage_X,Decalage_Y) dans la brosse
 | 
						||
  xor   eax,eax
 | 
						||
  xor   ebx,ebx
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov   ax,Largeur_brosse
 | 
						||
  mov   bx,Decalage_Y
 | 
						||
  mov   cx,Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Brosse
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; On place dans DX le nb de lignes <20> traiter
 | 
						||
  mov   dx,Hauteur
 | 
						||
 | 
						||
  ; On place dans BH la couleur de transparence
 | 
						||
  mov   bh,Couleur_de_transparence
 | 
						||
 | 
						||
  ; On place dans BL la couleur de coloriage
 | 
						||
  mov   bl,Couleur
 | 
						||
 | 
						||
  ; On place dans EAX la distance entre 2 lignes <20> l'<27>cran
 | 
						||
  mov   eax,320
 | 
						||
  sub    ax,Largeur
 | 
						||
 | 
						||
  Display_brush_Mono_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la ligne
 | 
						||
    mov   cx,Largeur
 | 
						||
 | 
						||
    Display_brush_Mono_MCGA_Pour_chaque_pixel:
 | 
						||
 | 
						||
      ; On v<>rifie que le contenu de la brosse ne soit pas transparent
 | 
						||
      cmp   [esi],bh
 | 
						||
      je    Display_brush_Mono_MCGA_Pas_de_copie
 | 
						||
 | 
						||
	; On affiche le pixel de la brosse <20> l'<27>cran
 | 
						||
	mov   [edi],bl
 | 
						||
 | 
						||
      Display_brush_Mono_MCGA_Pas_de_copie:
 | 
						||
 | 
						||
      ; On passe au pixel suivant
 | 
						||
      inc   esi
 | 
						||
      inc   edi
 | 
						||
      dec   cx
 | 
						||
      jnz   Display_brush_Mono_MCGA_Pour_chaque_pixel
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    mov   cx,Largeur_brosse
 | 
						||
    add   edi,eax
 | 
						||
    sub   cx,Largeur
 | 
						||
    add   esi,ecx
 | 
						||
    dec   dx
 | 
						||
    jnz   Display_brush_Mono_MCGA_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  pop   edi
 | 
						||
  pop   esi
 | 
						||
  pop   ebx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Mono_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Effacer la partie de la brosse affich<63>e <20> l'<27>cran en MCGA
 | 
						||
 | 
						||
Clear_brush_MCGA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Largeur_image:word
 | 
						||
 | 
						||
  push  ebx
 | 
						||
  push  esi
 | 
						||
  push  edi
 | 
						||
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran
 | 
						||
  mov   edi,0A0000h
 | 
						||
  mov   ax,Pos_Y   ; |
 | 
						||
  mov   di,ax      ; |
 | 
						||
  shl   ax,6       ; |- DI <- Pos_Y * 320
 | 
						||
  shl   di,8       ; |
 | 
						||
  add   di,ax      ; |
 | 
						||
  add   di,Pos_X
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es
 | 
						||
  ; (Pos_X+Principal_Decalage_X,Pos_Y+Principal_Decalage_Y) dans l'image
 | 
						||
  xor   eax,eax
 | 
						||
  xor   ebx,ebx
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov    ax,Pos_Y
 | 
						||
  mov    bx,Largeur_image
 | 
						||
  mov    cx,Pos_X
 | 
						||
  add    ax,Principal_Decalage_Y
 | 
						||
  add    cx,Principal_Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Principal_Ecran
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; On place dans DX le nb de lignes <20> traiter
 | 
						||
  mov   dx,Hauteur
 | 
						||
 | 
						||
  ; On met dans EBX la distance entre 2 lignes <20> l'<27>cran
 | 
						||
  mov   ebx,320
 | 
						||
  sub    bx,Largeur
 | 
						||
 | 
						||
  ; On met dans EAX la distance entre 2 lignes dans l'image
 | 
						||
  xor   eax,eax
 | 
						||
  mov    ax,Largeur_image
 | 
						||
  sub    ax,Largeur
 | 
						||
 | 
						||
  ; On nettoie la partie haute de ECX:
 | 
						||
  xor   ecx,ecx
 | 
						||
 | 
						||
  Clear_brush_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la ligne
 | 
						||
    mov   cx,Largeur
 | 
						||
 | 
						||
    ; On fait une copie de la ligne
 | 
						||
    shr   cx,1
 | 
						||
    jnc   Clear_brush_MCGA_Multiple_de_2
 | 
						||
    movsb
 | 
						||
    Clear_brush_MCGA_Multiple_de_2:
 | 
						||
    shr   cx,1
 | 
						||
    jnc   Clear_brush_MCGA_Multiple_de_4
 | 
						||
    movsw
 | 
						||
    Clear_brush_MCGA_Multiple_de_4:
 | 
						||
    rep   movsd
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    add   esi,eax
 | 
						||
    add   edi,ebx
 | 
						||
    dec   dx
 | 
						||
    jnz   Clear_brush_MCGA_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  pop   edi
 | 
						||
  pop   esi
 | 
						||
  pop   ebx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Clear_brush_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse en couleur en VESA
 | 
						||
 | 
						||
Display_brush_Color_VESA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Largeur_brosse:word
 | 
						||
 | 
						||
  push  ebx
 | 
						||
  push  esi
 | 
						||
  push  edi
 | 
						||
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es (Decalage_X,Decalage_Y) dans la brosse
 | 
						||
  xor   eax,eax
 | 
						||
  xor   ebx,ebx
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov   ax,Largeur_brosse
 | 
						||
  mov   bx,Decalage_Y
 | 
						||
  mov   cx,Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Brosse
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran
 | 
						||
  mov   edi,0A0000h
 | 
						||
  mov   ax,Pos_Y
 | 
						||
  mul   Largeur_ecran
 | 
						||
  add   ax,Pos_X
 | 
						||
  adc   dx,0
 | 
						||
  mov   di,ax
 | 
						||
 | 
						||
  ; On passe dans la banque n<>cessaire (et on la m<>morise dans AL)
 | 
						||
  mov   al,dl
 | 
						||
  call  [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On place dans AH la couleur de transparence
 | 
						||
  mov   ah,Couleur_de_transparence
 | 
						||
 | 
						||
  ; On place dans BX la diff<66>rence <20> l'<27>cran entre 2 lignes:
 | 
						||
  mov   bx,Largeur_ecran
 | 
						||
  sub   bx,Largeur
 | 
						||
 | 
						||
  Display_brush_Color_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la ligne
 | 
						||
    mov   cx,Largeur
 | 
						||
 | 
						||
    Display_brush_Color_VESA_Pour_chaque_pixel:
 | 
						||
 | 
						||
      ; On lit le contenu de la brosse
 | 
						||
      mov   dl,[esi]
 | 
						||
 | 
						||
      ; Gestion de la transparence
 | 
						||
      cmp   dl,ah
 | 
						||
      je    Display_brush_Color_VESA_Pas_de_copie
 | 
						||
 | 
						||
	; On affiche le pixel de la brosse <20> l'<27>cran
 | 
						||
	mov   [edi],dl
 | 
						||
 | 
						||
      Display_brush_Color_VESA_Pas_de_copie:
 | 
						||
 | 
						||
      ; On passe au pixel suivant
 | 
						||
      inc   esi
 | 
						||
      inc    di
 | 
						||
 | 
						||
      jz    Display_brush_Color_VESA_Debordement_1
 | 
						||
 | 
						||
      dec   cx
 | 
						||
      jnz   Display_brush_Color_VESA_Pour_chaque_pixel
 | 
						||
      jmp   Display_brush_Color_VESA_Fin_de_ligne
 | 
						||
 | 
						||
      Display_brush_Color_VESA_Debordement_1:
 | 
						||
 | 
						||
	; On passe dans la banque suivante
 | 
						||
	inc   al
 | 
						||
	call  [VESA_Change_banque_ecriture]
 | 
						||
	dec   cx
 | 
						||
	jnz   Display_brush_Color_VESA_Pour_chaque_pixel
 | 
						||
 | 
						||
      Display_brush_Color_VESA_Fin_de_ligne:
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    mov    cx,Largeur_brosse
 | 
						||
    sub    cx,Largeur
 | 
						||
    add   esi,ecx
 | 
						||
    add    di,bx
 | 
						||
 | 
						||
    jc    Display_brush_Color_VESA_Debordement_2
 | 
						||
 | 
						||
    dec   Hauteur
 | 
						||
    jnz   Display_brush_Color_VESA_Pour_chaque_ligne
 | 
						||
    jmp   Display_brush_Color_VESA_Fin_de_traitement
 | 
						||
 | 
						||
    Display_brush_Color_VESA_Debordement_2:
 | 
						||
 | 
						||
      ; On passe dans la banque suivante
 | 
						||
      inc   al
 | 
						||
      call  [VESA_Change_banque_ecriture]
 | 
						||
      dec   Hauteur
 | 
						||
      jnz   Display_brush_Color_VESA_Pour_chaque_ligne
 | 
						||
 | 
						||
    Display_brush_Color_VESA_Fin_de_traitement:
 | 
						||
 | 
						||
 | 
						||
  pop   edi
 | 
						||
  pop   esi
 | 
						||
  pop   ebx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Color_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse en monochrome en VESA
 | 
						||
 | 
						||
Display_brush_Mono_VESA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Couleur:byte,Largeur_brosse:word
 | 
						||
 | 
						||
  push  ebx
 | 
						||
  push  esi
 | 
						||
  push  edi
 | 
						||
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es (Decalage_X,Decalage_Y) dans la brosse
 | 
						||
  xor   eax,eax
 | 
						||
  xor   ebx,ebx
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov   ax,Largeur_brosse
 | 
						||
  mov   bx,Decalage_Y
 | 
						||
  mov   cx,Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Brosse
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran
 | 
						||
  mov   edi,0A0000h
 | 
						||
  mov   ax,Pos_Y
 | 
						||
  mul   Largeur_ecran
 | 
						||
  add   ax,Pos_X
 | 
						||
  adc   dx,0
 | 
						||
  mov   di,ax
 | 
						||
 | 
						||
  ; On passe dans la banque n<>cessaire (et on la m<>morise dans AL)
 | 
						||
  mov   al,dl
 | 
						||
  call  [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On place dans AH la couleur de transparence
 | 
						||
  mov   ah,Couleur_de_transparence
 | 
						||
 | 
						||
  ; On place dans DL la couleur de coloriage
 | 
						||
  mov   dl,Couleur
 | 
						||
 | 
						||
  ; On place dans BX la diff<66>rence <20> l'<27>cran entre 2 lignes:
 | 
						||
  mov   bx,Largeur_ecran
 | 
						||
  sub   bx,Largeur
 | 
						||
 | 
						||
  Display_brush_Mono_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la ligne
 | 
						||
    mov   cx,word ptr[Largeur]
 | 
						||
 | 
						||
    Display_brush_Mono_VESA_Pour_chaque_pixel:
 | 
						||
 | 
						||
      ; On v<>rifie que le contenu de la brosse ne soit pas la couleur de
 | 
						||
      ; transparence
 | 
						||
      cmp   [esi],ah
 | 
						||
      je    Display_brush_Mono_VESA_Pas_de_copie
 | 
						||
 | 
						||
	; On affiche un pixel de la couleur <20> l'<27>cran
 | 
						||
	mov   [edi],dl
 | 
						||
 | 
						||
      Display_brush_Mono_VESA_Pas_de_copie:
 | 
						||
 | 
						||
      ; On passe au pixel suivant
 | 
						||
      inc   esi
 | 
						||
      inc    di
 | 
						||
 | 
						||
      jz    Display_brush_Mono_VESA_Debordement_1
 | 
						||
 | 
						||
      dec   cx
 | 
						||
      jnz   Display_brush_Mono_VESA_Pour_chaque_pixel
 | 
						||
      jmp   Display_brush_Mono_VESA_Fin_de_ligne
 | 
						||
 | 
						||
      Display_brush_Mono_VESA_Debordement_1:
 | 
						||
 | 
						||
	; On passe dans la banque suivante
 | 
						||
	inc   al
 | 
						||
	call  [VESA_Change_banque_ecriture]
 | 
						||
	dec   cx
 | 
						||
	jnz   Display_brush_Mono_VESA_Pour_chaque_pixel
 | 
						||
 | 
						||
      Display_brush_Mono_VESA_Fin_de_ligne:
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    mov    cx,Largeur_brosse
 | 
						||
    sub    cx,Largeur
 | 
						||
    add   esi,ecx
 | 
						||
    add    di,bx
 | 
						||
 | 
						||
    jc    Display_brush_Mono_VESA_Debordement_2
 | 
						||
 | 
						||
    dec   Hauteur
 | 
						||
    jnz   Display_brush_Mono_VESA_Pour_chaque_ligne
 | 
						||
    jmp   Display_brush_Mono_VESA_Fin_de_traitement
 | 
						||
 | 
						||
    Display_brush_Mono_VESA_Debordement_2:
 | 
						||
 | 
						||
      ; On passe dans la banque suivante
 | 
						||
      inc   al
 | 
						||
      call  [VESA_Change_banque_ecriture]
 | 
						||
      dec   Hauteur
 | 
						||
      jnz   Display_brush_Mono_VESA_Pour_chaque_ligne
 | 
						||
 | 
						||
    Display_brush_Mono_VESA_Fin_de_traitement:
 | 
						||
 | 
						||
 | 
						||
  pop   edi
 | 
						||
  pop   esi
 | 
						||
  pop   ebx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Mono_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Effacer la partie de la brosse affich<63>e <20> l'<27>cran en VESA
 | 
						||
 | 
						||
Clear_brush_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Largeur_image:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es
 | 
						||
  ; (Pos_X+Principal_Decalage_X,Pos_Y+Principal_Decalage_Y) dans l'image
 | 
						||
  xor   eax,eax
 | 
						||
  xor   ebx,ebx
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov    ax,Pos_Y
 | 
						||
  mov    bx,Largeur_image
 | 
						||
  mov    cx,Pos_X
 | 
						||
  add    ax,Principal_Decalage_Y
 | 
						||
  add    cx,Principal_Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Principal_Ecran
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mul  Largeur_ecran
 | 
						||
  add  ax,Pos_X
 | 
						||
  adc  dx,0
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On passe dans la banque n<>cessaire (et on la m<>morise dans AL)
 | 
						||
  mov  al,dl
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On place dans DX la diff<66>rence entre 2 lignes <20> l'<27>cran
 | 
						||
  mov  dx,Largeur_ecran
 | 
						||
  sub  dx,Largeur
 | 
						||
 | 
						||
  ; On place dans EBX la diff<66>rence entre 2 lignes dans l'image
 | 
						||
  mov  bx,Largeur_image
 | 
						||
  sub  bx,Largeur
 | 
						||
 | 
						||
  Clear_brush_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la ligne
 | 
						||
    mov  cx,Largeur
 | 
						||
 | 
						||
    Clear_brush_VESA_Pour_chaque_pixel:
 | 
						||
 | 
						||
      ; On recopie le pixel de l'image <20> l'<27>cran
 | 
						||
      mov  ah,[esi]
 | 
						||
      inc  esi
 | 
						||
      mov  [edi],ah
 | 
						||
      inc  di
 | 
						||
 | 
						||
      jz   Clear_brush_VESA_Debordement_1
 | 
						||
 | 
						||
      dec  cx
 | 
						||
      jnz  Clear_brush_VESA_Pour_chaque_pixel
 | 
						||
      jmp  Clear_brush_VESA_Fin_de_ligne
 | 
						||
 | 
						||
      Clear_brush_VESA_Debordement_1:
 | 
						||
 | 
						||
	; On passe dans la banque suivante
 | 
						||
	inc  al
 | 
						||
	call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
;        ; On r<>ajuste EDI qui vient de sortir du segment vid<69>o
 | 
						||
;        mov  edi,0A0000h
 | 
						||
 | 
						||
	dec  cx
 | 
						||
	jnz  Clear_brush_VESA_Pour_chaque_pixel
 | 
						||
 | 
						||
      Clear_brush_VESA_Fin_de_ligne:
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    add  esi,ebx
 | 
						||
    add  di,dx
 | 
						||
 | 
						||
    jc   Clear_brush_VESA_Debordement_2
 | 
						||
 | 
						||
    dec  Hauteur
 | 
						||
    jnz  Clear_brush_VESA_Pour_chaque_ligne
 | 
						||
    jmp  Clear_brush_VESA_Fin_de_traitement
 | 
						||
 | 
						||
    Clear_brush_VESA_Debordement_2:
 | 
						||
 | 
						||
      ; On passe dans la banque suivante
 | 
						||
      inc  al
 | 
						||
      call [VESA_Change_banque_ecriture]
 | 
						||
      dec  Hauteur
 | 
						||
      jnz  Clear_brush_VESA_Pour_chaque_ligne
 | 
						||
 | 
						||
    Clear_brush_VESA_Fin_de_traitement:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Clear_brush_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse en couleur en mode X
 | 
						||
 | 
						||
Display_brush_Color_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Largeur_brosse:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
  ; On nettoye la partie haute de Largeur_brosse
 | 
						||
  and   Largeur_brosse,0FFFFh
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es (Decalage_X,Decalage_Y) dans la brosse
 | 
						||
  xor   ebx,ebx
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov   eax,Largeur_brosse
 | 
						||
  mov   bx,Decalage_Y
 | 
						||
  mov   cx,Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Brosse
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran et dans AX
 | 
						||
  ; le plan (AH = 1, 2, 4 ou 8) et le n<> de registre de chgnt de plan
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mov  ax,MODE_X_Largeur_de_ligne
 | 
						||
  mov  cx,Pos_X
 | 
						||
  mul  Pos_Y
 | 
						||
  mov  dx,cx
 | 
						||
  shr  dx,2
 | 
						||
  add  ax,dx
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  mov  ax,0102h
 | 
						||
  and  cx,03h
 | 
						||
  shl  ah,cl
 | 
						||
 | 
						||
  ; On passe dans le plan de d<>part
 | 
						||
  ;
 | 
						||
  ; Pour passer dans le plan N (0-3) en <20>criture:
 | 
						||
  ; out 3C4h,02h
 | 
						||
  ; out 3C5h,1 shl N
 | 
						||
  ;
 | 
						||
  mov  dx,3C4h
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  ; On sauve la valeur initiale de EDI
 | 
						||
  mov  MODE_X_Valeur_initiale_de_edi,edi
 | 
						||
 | 
						||
  ; On sauve la valeur initiale de ESI
 | 
						||
  mov  MODE_X_Valeur_initiale_de_esi,esi
 | 
						||
 | 
						||
  ; On place dans BH la couleur de transparence
 | 
						||
  mov  bh,Couleur_de_transparence
 | 
						||
 | 
						||
  Display_brush_Color_mode_X_Pour_chaque_colonne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la colonne
 | 
						||
    mov  cx,Hauteur
 | 
						||
 | 
						||
    ; On place dans DX la distance entre 2 lignes <20> l'<27>cran
 | 
						||
    mov  dx,MODE_X_Largeur_de_ligne
 | 
						||
 | 
						||
    Display_brush_Color_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On lit le contenu de la brosse
 | 
						||
      mov  bl,[esi]
 | 
						||
 | 
						||
      ; Gestion de la transparence
 | 
						||
      cmp  bl,bh
 | 
						||
      je   Display_brush_Color_mode_X_Pas_de_copie
 | 
						||
 | 
						||
	; On affiche le pixel de la brosse <20> l'<27>cran
 | 
						||
	mov  [edi],bl
 | 
						||
 | 
						||
      Display_brush_Color_mode_X_Pas_de_copie:
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      add  esi,Largeur_brosse
 | 
						||
      add  di,dx
 | 
						||
      dec  cx
 | 
						||
      jnz  Display_brush_Color_mode_X_Pour_chaque_ligne
 | 
						||
 | 
						||
    ; On passe <20> la colonne suivante
 | 
						||
    inc  MODE_X_Valeur_initiale_de_esi
 | 
						||
    mov  esi,MODE_X_Valeur_initiale_de_esi
 | 
						||
 | 
						||
    add  ah,ah
 | 
						||
    cmp  ah,10h
 | 
						||
    jne  Display_brush_Color_mode_X_Pas_de_reset_de_plan
 | 
						||
 | 
						||
      inc  MODE_X_Valeur_initiale_de_edi
 | 
						||
      mov  ah,01h
 | 
						||
 | 
						||
    Display_brush_Color_mode_X_Pas_de_reset_de_plan:
 | 
						||
 | 
						||
    mov  edi,MODE_X_Valeur_initiale_de_edi
 | 
						||
 | 
						||
    ; On passe dans le nouveau plan
 | 
						||
    ;
 | 
						||
    ; Pour passer dans le plan N (0-3) en <20>criture:
 | 
						||
    ; out 3C4h,02h
 | 
						||
    ; out 3C5h,1 shl N
 | 
						||
    ;
 | 
						||
    mov  dx,3C4h
 | 
						||
    out  dx,ax
 | 
						||
 | 
						||
    dec  Largeur
 | 
						||
    jnz  Display_brush_Color_mode_X_Pour_chaque_colonne
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Color_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse en monochrome en mode X
 | 
						||
 | 
						||
Display_brush_Mono_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Couleur:byte,Largeur_brosse:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On nettoye la partie haute de Largeur_brosse
 | 
						||
  and   Largeur_brosse,0FFFFh
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es (Decalage_X,Decalage_Y) dans la brosse
 | 
						||
  xor   ebx,ebx
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov   eax,Largeur_brosse
 | 
						||
  mov   bx,Decalage_Y
 | 
						||
  mov   cx,Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Brosse
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran et dans AX
 | 
						||
  ; le plan (AH = 1, 2, 4 ou 8) et le n<> de registre de chgnt de plan
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mov  ax,MODE_X_Largeur_de_ligne
 | 
						||
  mov  cx,Pos_X
 | 
						||
  mul  Pos_Y
 | 
						||
  mov  dx,cx
 | 
						||
  shr  dx,2
 | 
						||
  add  ax,dx
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  mov  ax,0102h
 | 
						||
  and  cx,03h
 | 
						||
  shl  ah,cl
 | 
						||
 | 
						||
  ; On passe dans le plan de d<>part
 | 
						||
  ;
 | 
						||
  ; Pour passer dans le plan N (0-3) en <20>criture:
 | 
						||
  ; out 3C4h,02h
 | 
						||
  ; out 3C5h,1 shl N
 | 
						||
  ;
 | 
						||
  mov  dx,3C4h
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  ; On sauve la valeur initiale de EDI
 | 
						||
  mov  MODE_X_Valeur_initiale_de_edi,edi
 | 
						||
 | 
						||
  ; On sauve la valeur initiale de ESI
 | 
						||
  mov  MODE_X_Valeur_initiale_de_esi,esi
 | 
						||
 | 
						||
  ; On place dans BH la couleur de transparence
 | 
						||
  mov  bh,Couleur_de_transparence
 | 
						||
 | 
						||
  ; On place dans BL la couleur de coloriage
 | 
						||
  mov  bl,Couleur
 | 
						||
 | 
						||
  Display_brush_Mono_mode_X_Pour_chaque_colonne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la colonne
 | 
						||
    mov  cx,Hauteur
 | 
						||
 | 
						||
    ; On place dans DX la distance entre 2 lignes <20> l'<27>cran
 | 
						||
    mov  dx,MODE_X_Largeur_de_ligne
 | 
						||
 | 
						||
    Display_brush_Mono_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On v<>rifie que le contenu de la brosse ne soit pas transparent
 | 
						||
      cmp  [esi],bh
 | 
						||
      je   Display_brush_Mono_mode_X_Pas_de_copie
 | 
						||
 | 
						||
	; On affiche le pixel de la brosse <20> l'<27>cran
 | 
						||
	mov  [edi],bl
 | 
						||
 | 
						||
      Display_brush_Mono_mode_X_Pas_de_copie:
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      add  esi,Largeur_brosse
 | 
						||
      add  di,dx
 | 
						||
      dec  cx
 | 
						||
      jnz  Display_brush_Mono_mode_X_Pour_chaque_ligne
 | 
						||
 | 
						||
    ; On passe <20> la colonne suivante
 | 
						||
    inc  MODE_X_Valeur_initiale_de_esi
 | 
						||
    mov  esi,MODE_X_Valeur_initiale_de_esi
 | 
						||
 | 
						||
    add  ah,ah
 | 
						||
    cmp  ah,10h
 | 
						||
    jne  Display_brush_Mono_mode_X_Pas_de_reset_de_plan
 | 
						||
 | 
						||
      inc  MODE_X_Valeur_initiale_de_edi
 | 
						||
      mov  ah,01h
 | 
						||
 | 
						||
    Display_brush_Mono_mode_X_Pas_de_reset_de_plan:
 | 
						||
 | 
						||
    mov  edi,MODE_X_Valeur_initiale_de_edi
 | 
						||
 | 
						||
    ; On passe dans le nouveau plan
 | 
						||
    ;
 | 
						||
    ; Pour passer dans le plan N (0-3) en <20>criture:
 | 
						||
    ; out 3C4h,02h
 | 
						||
    ; out 3C5h,1 shl N
 | 
						||
    ;
 | 
						||
    mov  dx,3C4h
 | 
						||
    out  dx,ax
 | 
						||
 | 
						||
    dec  Largeur
 | 
						||
    jnz  Display_brush_Mono_mode_X_Pour_chaque_colonne
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Mono_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Effacer la partie visible de la brosse en mode X
 | 
						||
 | 
						||
Clear_brush_mode_X proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Hauteur:word,Couleur_de_transparence:byte,Largeur_image:dword
 | 
						||
 | 
						||
  push  ebx
 | 
						||
  push  esi
 | 
						||
  push  edi
 | 
						||
 | 
						||
 | 
						||
  ; On nettoye la partie haute de Largeur_image
 | 
						||
  and   Largeur_image,0FFFFh
 | 
						||
 | 
						||
  ; Calculer dans ESI les coordonn<6E>es
 | 
						||
  ; (Pos_X+Principal_Decalage_X,Pos_Y+Principal_Decalage_Y) dans l'image
 | 
						||
  xor   eax,eax
 | 
						||
  xor   ecx,ecx
 | 
						||
  mov    ax,Pos_Y
 | 
						||
  mov   ebx,Largeur_image
 | 
						||
  mov    cx,Pos_X
 | 
						||
  add    ax,Principal_Decalage_Y
 | 
						||
  add    cx,Principal_Decalage_X
 | 
						||
  mul   ebx
 | 
						||
  mov   esi,Principal_Ecran
 | 
						||
  add   eax,ecx
 | 
						||
  add   esi,eax
 | 
						||
 | 
						||
  ; On sauve la valeur initiale de ESI
 | 
						||
  mov  MODE_X_Valeur_initiale_de_esi,esi
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran et dans AX
 | 
						||
  ; le plan (AH = 1, 2, 4 ou 8) et le n<> de registre de chgnt de plan
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mov  ax,MODE_X_Largeur_de_ligne
 | 
						||
  mov  cx,Pos_X
 | 
						||
  mul  Pos_Y
 | 
						||
  mov  dx,cx
 | 
						||
  shr  dx,2
 | 
						||
  add  ax,dx
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  mov  ax,0102h
 | 
						||
  and  cx,03h
 | 
						||
  shl  ah,cl
 | 
						||
 | 
						||
  ; On passe dans le plan de d<>part
 | 
						||
  ;
 | 
						||
  ; Pour passer dans le plan N (0-3) en <20>criture:
 | 
						||
  ; out 3C4h,02h
 | 
						||
  ; out 3C5h,1 shl N
 | 
						||
  ;
 | 
						||
  mov  dx,3C4h
 | 
						||
  out  dx,ax
 | 
						||
 | 
						||
  ; On sauve la valeur initiale de EDI
 | 
						||
  mov  MODE_X_Valeur_initiale_de_edi,edi
 | 
						||
 | 
						||
  Clear_brush_mode_X_Pour_chaque_colonne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la colonne
 | 
						||
    mov  cx,Hauteur
 | 
						||
 | 
						||
    ; On place dans DX la distance entre 2 lignes <20> l'<27>cran
 | 
						||
    mov  dx,MODE_X_Largeur_de_ligne
 | 
						||
 | 
						||
    Clear_brush_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On copie le pixel de l'image vers l'<27>cran en passant <20> la ligne
 | 
						||
      ; suivante
 | 
						||
      mov  bl,[esi]
 | 
						||
      add  esi,Largeur_image
 | 
						||
      mov  [edi],bl
 | 
						||
      add  di,dx
 | 
						||
 | 
						||
      dec  cx
 | 
						||
      jnz  Clear_brush_mode_X_Pour_chaque_ligne
 | 
						||
 | 
						||
    ; On passe <20> la colonne suivante
 | 
						||
    inc  MODE_X_Valeur_initiale_de_esi
 | 
						||
    mov  esi,MODE_X_Valeur_initiale_de_esi
 | 
						||
 | 
						||
    add  ah,ah
 | 
						||
    cmp  ah,10h
 | 
						||
    jne  Clear_brush_mode_X_Pas_de_reset_de_plan
 | 
						||
 | 
						||
      inc  MODE_X_Valeur_initiale_de_edi
 | 
						||
      mov  ah,01h
 | 
						||
 | 
						||
    Clear_brush_mode_X_Pas_de_reset_de_plan:
 | 
						||
 | 
						||
    mov  edi,MODE_X_Valeur_initiale_de_edi
 | 
						||
 | 
						||
    ; On passe dans le nouveau plan
 | 
						||
    ;
 | 
						||
    ; Pour passer dans le plan N (0-3) en <20>criture:
 | 
						||
    ; out 3C4h,02h
 | 
						||
    ; out 3C5h,1 shl N
 | 
						||
    ;
 | 
						||
    mov  dx,3C4h
 | 
						||
    out  dx,ax
 | 
						||
 | 
						||
    dec  Largeur
 | 
						||
    jnz  Clear_brush_mode_X_Pour_chaque_colonne
 | 
						||
 | 
						||
 | 
						||
  pop   edi
 | 
						||
  pop   esi
 | 
						||
  pop   ebx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Clear_brush_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Remapper une partie de l'<27>cran en MCGA
 | 
						||
 | 
						||
Remap_screen_MCGA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Hauteur:word,Conversion:dword
 | 
						||
 | 
						||
  push  ebx
 | 
						||
  push  esi
 | 
						||
  push  edi
 | 
						||
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran
 | 
						||
 | 
						||
  mov   edi,0A0000h
 | 
						||
  mov   di,Pos_Y   ; |
 | 
						||
  mov   bx,di      ; |
 | 
						||
  shl   di,8       ; |_ DI <- (Pos_Y*320) + Pos_X
 | 
						||
  shl   bx,6       ; |
 | 
						||
  add   di,bx      ; |
 | 
						||
  add   di,Pos_X   ; |
 | 
						||
 | 
						||
  ; On place dans DX le nb de lignes <20> traiter
 | 
						||
 | 
						||
  mov   dx,Hauteur
 | 
						||
 | 
						||
  ; On place dans EBX l'adresse de la table de conversion
 | 
						||
 | 
						||
  mov   ebx,Conversion
 | 
						||
 | 
						||
  ; On nettoie (entre autres) la partie haute de EAX
 | 
						||
 | 
						||
  xor   eax,eax
 | 
						||
 | 
						||
  ; On met dans ESI la distance entre la fin d'une ligne et le d<>but de la
 | 
						||
  ; suivante
 | 
						||
 | 
						||
  mov   esi,320
 | 
						||
  sub   si,Largeur
 | 
						||
 | 
						||
  Remap_screen_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la ligne
 | 
						||
 | 
						||
    mov   cx,Largeur
 | 
						||
 | 
						||
    Remap_screen_MCGA_Pour_chaque_pixel:
 | 
						||
 | 
						||
      mov  al,[edi]
 | 
						||
      mov  al,[ebx+eax]
 | 
						||
      mov  [edi],al
 | 
						||
 | 
						||
      ; On passe au pixel suivant
 | 
						||
      inc  edi
 | 
						||
      dec  cx
 | 
						||
      jnz  Remap_screen_MCGA_Pour_chaque_pixel
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    add  edi,esi
 | 
						||
 | 
						||
    dec  dx
 | 
						||
    jnz  Remap_screen_MCGA_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  pop   edi
 | 
						||
  pop   esi
 | 
						||
  pop   ebx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Remap_screen_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Remapper une partie de l'<27>cran en mode X
 | 
						||
 | 
						||
Remap_screen_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Largeur:word,Hauteur:word,Conversion:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans CL le plan initial
 | 
						||
 | 
						||
  mov  bx,Pos_X
 | 
						||
  mov  cl,bl
 | 
						||
  and  cl,00000011b
 | 
						||
 | 
						||
  ; On met dans ESI la valeur initiale de EDI
 | 
						||
  ; (ESI=D<>but de ligne, EDI=Position dans la ligne)
 | 
						||
 | 
						||
  mov  esi,0A0000h
 | 
						||
  mov  ax,Pos_Y
 | 
						||
  mul  MODE_X_Largeur_de_ligne
 | 
						||
  shr  bx,2
 | 
						||
  add  ax,bx
 | 
						||
  mov  si,ax
 | 
						||
 | 
						||
  ; On met dans BX la coordonn<6E>e de fin +1 (horizontalement)
 | 
						||
 | 
						||
  mov  bx,Pos_X
 | 
						||
  add  bx,Largeur
 | 
						||
 | 
						||
  Remap_screen_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CH le nb de plans <20> traiter
 | 
						||
 | 
						||
    mov  ch,4
 | 
						||
 | 
						||
    Remap_screen_mode_X_Pour_chaque_plan:
 | 
						||
 | 
						||
      ; On initialise EDI
 | 
						||
 | 
						||
      mov  edi,esi
 | 
						||
 | 
						||
      ; On passe dans le plan d<>tenu par CL
 | 
						||
 | 
						||
	; Plan d'<27>criture:
 | 
						||
 | 
						||
      mov  dx,3C4h                         ; DX = Port du CRTC (chngt de plan)
 | 
						||
      mov  ax,102h
 | 
						||
      shl  ah,cl
 | 
						||
      out  dx,ax
 | 
						||
 | 
						||
	; Plan de lecture:
 | 
						||
 | 
						||
      mov  dx,3CEh                         ; DX = Port du TS (enfin, je crois)
 | 
						||
      mov  ah,cl
 | 
						||
      mov  al,04h
 | 
						||
      out  dx,ax
 | 
						||
 | 
						||
      ; On met dans AX la coordonn<6E>e de d<>part
 | 
						||
 | 
						||
      mov  ax,Pos_X
 | 
						||
 | 
						||
      Remap_screen_mode_X_Boucle:
 | 
						||
 | 
						||
	cmp  ax,bx
 | 
						||
	jae  Remap_screen_mode_X_Fin_de_traitement
 | 
						||
 | 
						||
	; On convertit le pixel courant
 | 
						||
	xor  edx,edx
 | 
						||
	mov  dl,[edi]
 | 
						||
	add  edx,Conversion
 | 
						||
	mov  dl,[edx]
 | 
						||
	mov  [edi],dl
 | 
						||
 | 
						||
	inc  edi  ; On passe <20> la coordonn<6E>e +4
 | 
						||
	add  ax,4
 | 
						||
 | 
						||
	jmp  Remap_screen_mode_X_Boucle
 | 
						||
 | 
						||
      Remap_screen_mode_X_Fin_de_traitement:
 | 
						||
 | 
						||
      ; On pr<70>pare CL pour le prochain plan:
 | 
						||
 | 
						||
      inc  cl
 | 
						||
      and  cl,00000011b
 | 
						||
      jnz  Remap_screen_mode_X_On_repasse_pas_dans_le_plan_0
 | 
						||
 | 
						||
      ; On pr<70>pare ESI pour le prochain plan:
 | 
						||
 | 
						||
      inc  esi
 | 
						||
 | 
						||
      Remap_screen_mode_X_On_repasse_pas_dans_le_plan_0:
 | 
						||
 | 
						||
      ; On pr<70>pare la coordonn<6E>e de d<>part pour le prochain plan:
 | 
						||
 | 
						||
      inc  Pos_X
 | 
						||
 | 
						||
      ; On regarde s'il reste un plan <20> traiter:
 | 
						||
 | 
						||
      dec  ch
 | 
						||
      jnz  Remap_screen_mode_X_Pour_chaque_plan
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    dec si               ; ESI a forc<72>ment ripp<70> sur la droite, on le corrige
 | 
						||
    add si,MODE_X_Largeur_de_ligne                ; et on passe <20> la suivante
 | 
						||
    sub Pos_X,4          ; On fait de m<>me avec Pos_X
 | 
						||
 | 
						||
    dec Hauteur
 | 
						||
    jnz Remap_screen_mode_X_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Remap_screen_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Remapper une partie de l'<27>cran en VESA
 | 
						||
 | 
						||
Remap_screen_VESA proc near
 | 
						||
 | 
						||
  push  ebp
 | 
						||
  mov   ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Hauteur:word,Conversion:dword
 | 
						||
 | 
						||
  push  ebx
 | 
						||
  push  esi
 | 
						||
  push  edi
 | 
						||
 | 
						||
 | 
						||
  ; Calculer dans EDI les coordonn<6E>es (Pos_X,Pos_Y) <20> l'<27>cran
 | 
						||
 | 
						||
  mov   edi,0A0000h
 | 
						||
  mov   ax,Pos_Y
 | 
						||
  mul   Largeur_ecran
 | 
						||
  add   ax,Pos_X
 | 
						||
  adc   dx,0
 | 
						||
  mov   di,ax
 | 
						||
 | 
						||
  ; On passe dans la banque n<>cessaire (et on la m<>morise dans AL)
 | 
						||
 | 
						||
  mov   al,dl
 | 
						||
  call  [VESA_Change_banque_lect_ecr]
 | 
						||
 | 
						||
  ; On place dans EBX l'adresse de la table de conversion
 | 
						||
 | 
						||
  mov   ebx,Conversion
 | 
						||
 | 
						||
  ; On nettoie la partie haute de EDX
 | 
						||
 | 
						||
  xor   edx,edx
 | 
						||
 | 
						||
  ; On met dans SI la distance entre la fin d'une ligne et le d<>but de la
 | 
						||
  ; suivante
 | 
						||
 | 
						||
  mov   si,Largeur_ecran
 | 
						||
  sub   si,Largeur
 | 
						||
 | 
						||
  Remap_screen_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On place dans CX le nb de pixels <20> traiter sur la ligne
 | 
						||
 | 
						||
    mov   cx,Largeur
 | 
						||
 | 
						||
    Remap_screen_VESA_Pour_chaque_pixel:
 | 
						||
 | 
						||
      mov   dl,[edi]
 | 
						||
      mov   dl,[edx+ebx]
 | 
						||
      mov   [edi],dl
 | 
						||
 | 
						||
      ; On passe au pixel suivant
 | 
						||
 | 
						||
      inc   di
 | 
						||
      jz    Remap_screen_VESA_Debordement_1
 | 
						||
 | 
						||
      dec   cx
 | 
						||
      jnz   Remap_screen_VESA_Pour_chaque_pixel
 | 
						||
      jmp   Remap_screen_VESA_Fin_de_ligne
 | 
						||
 | 
						||
      Remap_screen_VESA_Debordement_1:
 | 
						||
 | 
						||
      ; On passe dans la banque suivante
 | 
						||
 | 
						||
      inc   al
 | 
						||
      call  [VESA_Change_banque_lect_ecr]
 | 
						||
 | 
						||
      dec   cx
 | 
						||
      jnz   Remap_screen_VESA_Pour_chaque_pixel
 | 
						||
 | 
						||
      Remap_screen_VESA_Fin_de_ligne:
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
 | 
						||
    add   di,si
 | 
						||
    jc    Remap_screen_VESA_Debordement_2
 | 
						||
 | 
						||
    dec   Hauteur
 | 
						||
    jnz   Remap_screen_VESA_Pour_chaque_ligne
 | 
						||
    jmp   Remap_screen_VESA_Fin_de_traitement
 | 
						||
 | 
						||
    Remap_screen_VESA_Debordement_2:
 | 
						||
 | 
						||
    ; On passe dans la banque suivante
 | 
						||
 | 
						||
    inc   al
 | 
						||
    call  [VESA_Change_banque_lect_ecr]
 | 
						||
 | 
						||
    dec   Hauteur
 | 
						||
    jnz   Remap_screen_VESA_Pour_chaque_ligne
 | 
						||
 | 
						||
    Remap_screen_VESA_Fin_de_traitement:
 | 
						||
 | 
						||
 | 
						||
  pop   edi
 | 
						||
  pop   esi
 | 
						||
  pop   ebx
 | 
						||
 | 
						||
  mov   esp,ebp
 | 
						||
  pop   ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Remap_screen_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
; Afficher une partie de l'image tel quel sur l'<27>cran
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Largeur:word,Hauteur:word,Largeur_image:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Principal_Decalage_Y*Largeur_image)+Principal_Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_image
 | 
						||
  mov  bx,Principal_Decalage_Y
 | 
						||
  mov  cx,Principal_Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h
 | 
						||
 | 
						||
  mov  edi,0A0000h
 | 
						||
 | 
						||
  ; On met dans EAX la distance qu'il y a entre le dernier pixel affich<63>
 | 
						||
  ; d'une ligne et le premier pixel affich<63> de la ligne suivante DANS L'IMAGE
 | 
						||
  ;
 | 
						||
  ; EAX = Largeur_image-Largeur
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  mov   ax,Largeur_image
 | 
						||
  sub   ax,Largeur
 | 
						||
 | 
						||
  ; On met dans EBX la distance qu'il y a entre le dernier pixel affich<63>
 | 
						||
  ; d'une ligne et le premier pixel affich<63> de la ligne suivante DANS L'ECRAN
 | 
						||
  ;
 | 
						||
  ; EBX = 320 - Largeur
 | 
						||
  mov  ebx,320
 | 
						||
  sub   bx,Largeur
 | 
						||
 | 
						||
  ; On met dans DX le nombre de lignes <20> traiter:
 | 
						||
  mov  dx,Hauteur
 | 
						||
 | 
						||
  ; On nettoye la partie haute de ECX: (OPTIM.: VIRABLE CAR FAIT PLUS HAUT)
 | 
						||
  xor  ecx,ecx
 | 
						||
 | 
						||
  APDLE_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On met dans ECX le nombre de pixels <20> traiter:
 | 
						||
 | 
						||
    mov  cx,Largeur
 | 
						||
 | 
						||
    ; On les traite au mieux par copie 8/16/32 bits
 | 
						||
    shr  cx,1
 | 
						||
    jnc  APDLE_MCGA_ECX_multiple_de_2
 | 
						||
    movsb
 | 
						||
    APDLE_MCGA_ECX_multiple_de_2:
 | 
						||
    shr  cx,1
 | 
						||
    jnc  APDLE_MCGA_ECX_multiple_de_4
 | 
						||
    movsw
 | 
						||
    APDLE_MCGA_ECX_multiple_de_4:
 | 
						||
    rep  movsd
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante
 | 
						||
    ; sans oublier d'incr<63>menter correctement ESI et EDI
 | 
						||
    add  esi,eax
 | 
						||
    add  edi,ebx
 | 
						||
 | 
						||
    dec  dx
 | 
						||
    jnz  APDLE_MCGA_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_une_ligne_a_l_ecran_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
  mov  esi,Ligne
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*320)+Pos_X)
 | 
						||
  mov  ax,320
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mul  Pos_Y
 | 
						||
  add  ax,Pos_X
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans ECX le nombre de pixels <20> traiter:
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  ; On les traite au mieux par copie 8/16/32 bits
 | 
						||
  shr  cx,1
 | 
						||
  jnc  AULALE_MCGA_ECX_multiple_de_2
 | 
						||
  movsb
 | 
						||
  AULALE_MCGA_ECX_multiple_de_2:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  AULALE_MCGA_ECX_multiple_de_4
 | 
						||
  movsw
 | 
						||
  AULALE_MCGA_ECX_multiple_de_4:
 | 
						||
  rep  movsd
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_a_l_ecran_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Lire une ligne <20> l'<27>cran et la stocker dans un buffer
 | 
						||
 | 
						||
Lire_une_ligne_a_l_ecran_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans EDI l'adresse de la ligne <20> lire:
 | 
						||
 | 
						||
  mov  edi,Ligne
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*320)+Pos_X)
 | 
						||
 | 
						||
  mov  ax,320
 | 
						||
  mov  esi,0A0000h
 | 
						||
  mul  Pos_Y
 | 
						||
  add  ax,Pos_X
 | 
						||
  mov  si,ax
 | 
						||
 | 
						||
  ; On met dans ECX le nombre de pixels <20> traiter:
 | 
						||
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  ; On les traite au mieux par copie 8/16/32 bits
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LULALE_MCGA_ECX_multiple_de_2
 | 
						||
  movsb
 | 
						||
  LULALE_MCGA_ECX_multiple_de_2:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LULALE_MCGA_ECX_multiple_de_4
 | 
						||
  movsw
 | 
						||
  LULALE_MCGA_ECX_multiple_de_4:
 | 
						||
  rep  movsd
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Lire_une_ligne_a_l_ecran_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de l'image zoom<6F>e <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_zoomee_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Largeur:word,Hauteur:word,Largeur_image:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
  ; Hauteur = Hauteur zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Loupe_Decalage_Y*Largeur_image)+Loupe_Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_image
 | 
						||
  mov  bx,Loupe_Decalage_Y
 | 
						||
  mov  cx,Loupe_Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans EDX la ligne en cours de traitement:
 | 
						||
  xor  edx,edx
 | 
						||
 | 
						||
  ; On met dans EBX la distance entre deux lignes d'image
 | 
						||
  xor  ebx,ebx
 | 
						||
  mov  bx,Largeur_image
 | 
						||
 | 
						||
  APDLEZ_MCGA_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  cx,Loupe_Facteur
 | 
						||
 | 
						||
    APDLEZ_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      push cx
 | 
						||
      push dx
 | 
						||
      push Buffer     ; Ligne
 | 
						||
      push edi        ; Largeur*Facteur
 | 
						||
      push edx        ; Pos_Y
 | 
						||
      mov  ax,Principal_X_Zoom
 | 
						||
      push eax        ; Pos_X
 | 
						||
      call Afficher_une_ligne_a_l_ecran_MCGA
 | 
						||
      add  esp,16
 | 
						||
      pop  dx
 | 
						||
      pop  cx
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  dx                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  dx,Hauteur                         ;   pas arriv<69> <20> la ligne
 | 
						||
      je   APDLEZ_MCGA_Menu_Ordonnee_atteinte ;   terminale
 | 
						||
      dec  cx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  APDLEZ_MCGA_Pour_chaque_ligne      ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne image suivante
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  APDLEZ_MCGA_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  APDLEZ_MCGA_Menu_Ordonnee_atteinte:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_zoomee_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de l'image tel quel sur l'<27>cran
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Largeur:word,Hauteur:word,Largeur_image:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Principal_Decalage_Y*Largeur_image)+Principal_Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_image
 | 
						||
  mov  bx,Principal_Decalage_Y
 | 
						||
  mov  cx,Principal_Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h
 | 
						||
 | 
						||
  mov  edi,0A0000h
 | 
						||
  ; Et on passe dans la banque correspondante
 | 
						||
  xor  al,al
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On met dans EBX la distance qu'il y a entre le dernier pixel affich<63>
 | 
						||
  ; d'une ligne et le premier pixel affich<63> de la ligne suivante DANS L'IMAGE
 | 
						||
  ;
 | 
						||
  ; EBX = Largeur_image-Largeur
 | 
						||
 | 
						||
  mov  bx,Largeur_image
 | 
						||
  sub  bx,Largeur
 | 
						||
 | 
						||
  ; On met dans DX le nombre de lignes <20> traiter:
 | 
						||
 | 
						||
  mov  dx,Hauteur
 | 
						||
 | 
						||
  ; On nettoye la partie haute de ECX: (OPTIM.: VIRABLE CAR FAIT PLUS HAUT)
 | 
						||
 | 
						||
  xor  ecx,ecx
 | 
						||
 | 
						||
  APDLE_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
    ; On met dans ECX le nombre de pixels <20> traiter:
 | 
						||
 | 
						||
    mov  cx,Largeur
 | 
						||
 | 
						||
    ; On regarde si la ligne loge totalement dans la banque en cours
 | 
						||
    add  cx,di
 | 
						||
    jc   APDLE_VESA_Debordement_de_ligne
 | 
						||
 | 
						||
    ; Si c'est le cas:
 | 
						||
    mov  cx,Largeur     ; correction de CX <20> cause du test
 | 
						||
 | 
						||
    ; On effectue une copie 8/16/32 bits
 | 
						||
    shr  cx,1
 | 
						||
    jnc  APDLE_VESA_Nobreak_ECX_multiple_de_2
 | 
						||
    movsb
 | 
						||
    APDLE_VESA_Nobreak_ECX_multiple_de_2:
 | 
						||
    shr  cx,1
 | 
						||
    jnc  APDLE_VESA_Nobreak_ECX_multiple_de_4
 | 
						||
    movsw
 | 
						||
    APDLE_VESA_Nobreak_ECX_multiple_de_4:
 | 
						||
    rep  movsd
 | 
						||
 | 
						||
    jmp  APDLE_VESA_Fin_traitement_ligne
 | 
						||
 | 
						||
 | 
						||
    ; Si ce n'est pas le cas (d<>bordement de la ligne)
 | 
						||
    APDLE_VESA_Debordement_de_ligne:
 | 
						||
 | 
						||
    ; A ce stade, on sait que la ligne ne loge pas enti<74>rement sur l'<27>cran
 | 
						||
 | 
						||
    ; On m<>morise dans la pile ce qu'il restera <20> afficher <20> la droite de la
 | 
						||
    ; rupture:
 | 
						||
    push cx
 | 
						||
 | 
						||
    ; On met dans CX le nb de pixels affichables avant la rupture:
 | 
						||
    mov  cx,di
 | 
						||
    neg  cx
 | 
						||
 | 
						||
    ; On effectue une copie 8/16/32 bits de la partie gauche de la rupture:
 | 
						||
    shr  cx,1
 | 
						||
    jnc  APDLE_VESA_BreakLeft_ECX_multiple_de_2
 | 
						||
    movsb
 | 
						||
    APDLE_VESA_BreakLeft_ECX_multiple_de_2:
 | 
						||
    shr  cx,1
 | 
						||
    jnc  APDLE_VESA_BreakLeft_ECX_multiple_de_4
 | 
						||
    movsw
 | 
						||
    APDLE_VESA_BreakLeft_ECX_multiple_de_4:
 | 
						||
    rep  movsd
 | 
						||
 | 
						||
    ; On change de banque:
 | 
						||
    inc  al
 | 
						||
    call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
    ; On replace EDI en d<>but de banque
 | 
						||
    mov  edi,0A0000h
 | 
						||
 | 
						||
    ; On restaure le nb de pixels <20> afficher <20> droite de la rupture
 | 
						||
    pop  cx
 | 
						||
 | 
						||
    ; On effectue une copie 8/16/32 bits de la partie droite de la rupture:
 | 
						||
    shr  cx,1
 | 
						||
    jnc  APDLE_VESA_BreakRight_ECX_multiple_de_2
 | 
						||
    movsb
 | 
						||
    APDLE_VESA_BreakRight_ECX_multiple_de_2:
 | 
						||
    shr  cx,1
 | 
						||
    jnc  APDLE_VESA_BreakRight_ECX_multiple_de_4
 | 
						||
    movsw
 | 
						||
    APDLE_VESA_BreakRight_ECX_multiple_de_4:
 | 
						||
    rep  movsd
 | 
						||
 | 
						||
 | 
						||
    APDLE_VESA_Fin_traitement_ligne:
 | 
						||
    ; Le traitement de la ligne est termin<69>, on change de ligne:
 | 
						||
 | 
						||
    ; On passe <20> la ligne suivante en incr<63>mentant correctement ESI et (E)DI:
 | 
						||
    mov  cx,Largeur_ecran
 | 
						||
    add  esi,ebx
 | 
						||
    sub  cx,Largeur
 | 
						||
    add  di,cx
 | 
						||
    jnc  APDLE_VESA_Fin_traitement_ligne_Sans_cht_bnk
 | 
						||
 | 
						||
    ; Cas o<> le changement de ligne entra<72>ne un changement de banque:
 | 
						||
    inc  al
 | 
						||
    call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
    APDLE_VESA_Fin_traitement_ligne_Sans_cht_bnk:
 | 
						||
    ; On a fait le changement de ligne, on peut voir s'il reste des lignes <20>
 | 
						||
    ; traiter:
 | 
						||
 | 
						||
    dec  dx
 | 
						||
    jnz  APDLE_VESA_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_une_ligne_a_l_ecran_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
 | 
						||
  mov  esi,Ligne
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*Largeur_ecran)+Pos_X)
 | 
						||
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mul  Pos_Y
 | 
						||
  add  ax,Pos_X
 | 
						||
  adc  dx,0
 | 
						||
  mov  di,ax
 | 
						||
  ; Et on passe dans la banque correspondante
 | 
						||
  mov  al,dl
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On met dans ECX le nombre de pixels <20> traiter:
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  ; On regarde si la ligne loge totalement dans la banque en cours
 | 
						||
  add  cx,di
 | 
						||
  jc   AULALE_VESA_Debordement_de_ligne
 | 
						||
 | 
						||
  ; Si c'est le cas:
 | 
						||
  mov  cx,Largeur     ; correction de CX <20> cause du test
 | 
						||
 | 
						||
  ; On effectue une copie 8/16/32 bits
 | 
						||
  shr  cx,1
 | 
						||
  jnc  AULALE_VESA_Nobreak_ECX_multiple_de_2
 | 
						||
  movsb
 | 
						||
  AULALE_VESA_Nobreak_ECX_multiple_de_2:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  AULALE_VESA_Nobreak_ECX_multiple_de_4
 | 
						||
  movsw
 | 
						||
  AULALE_VESA_Nobreak_ECX_multiple_de_4:
 | 
						||
  rep  movsd
 | 
						||
 | 
						||
  jmp  AULALE_VESA_Fin_traitement_ligne
 | 
						||
 | 
						||
 | 
						||
  ; Si ce n'est pas le cas (d<>bordement de la ligne)
 | 
						||
  AULALE_VESA_Debordement_de_ligne:
 | 
						||
 | 
						||
  ; A ce stade, on sait que la ligne ne loge pas enti<74>rement sur l'<27>cran
 | 
						||
 | 
						||
  ; On m<>morise dans la pile ce qu'il restera <20> afficher <20> la droite de la
 | 
						||
  ; rupture:
 | 
						||
  push cx
 | 
						||
 | 
						||
  ; On met dans CX le nb de pixels affichables avant la rupture:
 | 
						||
  mov  cx,di
 | 
						||
  neg  cx
 | 
						||
 | 
						||
  ; On effectue une copie 8/16/32 bits de la partie gauche de la rupture:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  AULALE_VESA_BreakLeft_ECX_multiple_de_2
 | 
						||
  movsb
 | 
						||
  AULALE_VESA_BreakLeft_ECX_multiple_de_2:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  AULALE_VESA_BreakLeft_ECX_multiple_de_4
 | 
						||
  movsw
 | 
						||
  AULALE_VESA_BreakLeft_ECX_multiple_de_4:
 | 
						||
  rep  movsd
 | 
						||
 | 
						||
  ; On change de banque:
 | 
						||
  inc  al
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On replace EDI en d<>but de banque
 | 
						||
  mov  edi,0A0000h
 | 
						||
 | 
						||
  ; On restaure le nb de pixels <20> afficher <20> droite de la rupture
 | 
						||
  pop  cx
 | 
						||
 | 
						||
  ; On effectue une copie 8/16/32 bits de la partie droite de la rupture:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  AULALE_VESA_BreakRight_ECX_multiple_de_2
 | 
						||
  movsb
 | 
						||
  AULALE_VESA_BreakRight_ECX_multiple_de_2:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  AULALE_VESA_BreakRight_ECX_multiple_de_4
 | 
						||
  movsw
 | 
						||
  AULALE_VESA_BreakRight_ECX_multiple_de_4:
 | 
						||
  rep  movsd
 | 
						||
 | 
						||
 | 
						||
  AULALE_VESA_Fin_traitement_ligne:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_a_l_ecran_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Lire une ligne <20> l'<27>cran et la stocker dans un buffer
 | 
						||
 | 
						||
Lire_une_ligne_a_l_ecran_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans EDI l'adresse de la ligne <20> lire:
 | 
						||
 | 
						||
  mov  edi,Ligne
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*Largeur_ecran)+Pos_X)
 | 
						||
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  mov  esi,0A0000h
 | 
						||
  mul  Pos_Y
 | 
						||
  add  ax,Pos_X
 | 
						||
  adc  dx,0
 | 
						||
  mov  si,ax
 | 
						||
  ; Et on passe dans la banque correspondante
 | 
						||
  mov  al,dl
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On met dans ECX le nombre de pixels <20> traiter:
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  ; On regarde si la ligne loge totalement dans la banque en cours
 | 
						||
  add  cx,si
 | 
						||
  jc   LULALE_VESA_Debordement_de_ligne
 | 
						||
 | 
						||
  ; Si c'est le cas:
 | 
						||
  mov  cx,Largeur     ; correction de CX <20> cause du test
 | 
						||
 | 
						||
  ; On effectue une copie 8/16/32 bits
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LULALE_VESA_Nobreak_ECX_multiple_de_2
 | 
						||
  movsb
 | 
						||
  LULALE_VESA_Nobreak_ECX_multiple_de_2:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LULALE_VESA_Nobreak_ECX_multiple_de_4
 | 
						||
  movsw
 | 
						||
  LULALE_VESA_Nobreak_ECX_multiple_de_4:
 | 
						||
  rep  movsd
 | 
						||
 | 
						||
  jmp  LULALE_VESA_Fin_traitement_ligne
 | 
						||
 | 
						||
 | 
						||
  ; Si ce n'est pas le cas (d<>bordement de la ligne)
 | 
						||
  LULALE_VESA_Debordement_de_ligne:
 | 
						||
 | 
						||
  ; A ce stade, on sait que la ligne ne loge pas enti<74>rement sur l'<27>cran
 | 
						||
 | 
						||
  ; On m<>morise dans la pile ce qu'il restera <20> afficher <20> la droite de la
 | 
						||
  ; rupture:
 | 
						||
  push cx
 | 
						||
 | 
						||
  ; On met dans CX le nb de pixels affichables avant la rupture:
 | 
						||
  mov  cx,si
 | 
						||
  neg  cx
 | 
						||
 | 
						||
  ; On effectue une copie 8/16/32 bits de la partie gauche de la rupture:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LULALE_VESA_BreakLeft_ECX_multiple_de_2
 | 
						||
  movsb
 | 
						||
  LULALE_VESA_BreakLeft_ECX_multiple_de_2:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LULALE_VESA_BreakLeft_ECX_multiple_de_4
 | 
						||
  movsw
 | 
						||
  LULALE_VESA_BreakLeft_ECX_multiple_de_4:
 | 
						||
  rep  movsd
 | 
						||
 | 
						||
  ; On change de banque:
 | 
						||
  inc  al
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On replace ESI en d<>but de banque
 | 
						||
  mov  esi,0A0000h
 | 
						||
 | 
						||
  ; On restaure le nb de pixels <20> afficher <20> droite de la rupture
 | 
						||
  pop  cx
 | 
						||
 | 
						||
  ; On effectue une copie 8/16/32 bits de la partie droite de la rupture:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LULALE_VESA_BreakRight_ECX_multiple_de_2
 | 
						||
  movsb
 | 
						||
  LULALE_VESA_BreakRight_ECX_multiple_de_2:
 | 
						||
  shr  cx,1
 | 
						||
  jnc  LULALE_VESA_BreakRight_ECX_multiple_de_4
 | 
						||
  movsw
 | 
						||
  LULALE_VESA_BreakRight_ECX_multiple_de_4:
 | 
						||
  rep  movsd
 | 
						||
 | 
						||
 | 
						||
  LULALE_VESA_Fin_traitement_ligne:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Lire_une_ligne_a_l_ecran_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de l'image zoom<6F>e <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_zoomee_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Largeur:word,Hauteur:word,Largeur_image:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
  ; Hauteur = Hauteur zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Loupe_Decalage_Y*Largeur_image)+Loupe_Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_image
 | 
						||
  mov  bx,Loupe_Decalage_Y
 | 
						||
  mov  cx,Loupe_Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans EDX la ligne en cours de traitement:
 | 
						||
  xor  edx,edx
 | 
						||
 | 
						||
  ; On met dans EBX la distance entre deux lignes d'image
 | 
						||
  xor  ebx,ebx
 | 
						||
  mov  bx,Largeur_image
 | 
						||
 | 
						||
  APDLEZ_VESA_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  cx,Loupe_Facteur
 | 
						||
 | 
						||
    APDLEZ_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      push cx
 | 
						||
      push dx
 | 
						||
      push Buffer     ; Ligne
 | 
						||
      push edi        ; Largeur*Facteur
 | 
						||
      push edx        ; Pos_Y
 | 
						||
      mov  ax,Principal_X_Zoom
 | 
						||
      push eax        ; Pos_X
 | 
						||
      call Afficher_une_ligne_a_l_ecran_VESA
 | 
						||
      add  esp,16
 | 
						||
      pop  dx
 | 
						||
      pop  cx
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  dx                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  dx,Hauteur                         ;   pas arriv<69> <20> la ligne
 | 
						||
      je   APDLEZ_VESA_Menu_Ordonnee_atteinte ;   terminale
 | 
						||
      dec  cx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  APDLEZ_VESA_Pour_chaque_ligne      ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne image suivante
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  APDLEZ_VESA_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  APDLEZ_VESA_Menu_Ordonnee_atteinte:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_zoomee_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de l'image tel quel sur l'<27>cran
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Largeur:word,Hauteur:word,Largeur_image:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Principal_Decalage_Y*Largeur_image)+Principal_Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Principal_Decalage_Y
 | 
						||
  mov  bx,Largeur_image
 | 
						||
  mov  cx,Principal_Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans EBX la distance qu'il y a entre la fin d'une ligne et le
 | 
						||
  ; d<>but de la ligne suivante <20> l'<27>cran:
 | 
						||
  ; = DEJA FAIT
 | 
						||
 | 
						||
  ; On met dans CX le n<> du 1er plan trait<69>:
 | 
						||
  mov  ecx,3
 | 
						||
 | 
						||
  APDLE_mode_X_Pour_chaque_plan:
 | 
						||
 | 
						||
    ; On passe dans le plan en question:
 | 
						||
    mov  dx,3C4h
 | 
						||
    mov  ax,102h
 | 
						||
    shl  ah,cl
 | 
						||
    out  dx,ax
 | 
						||
    push esi
 | 
						||
    push cx
 | 
						||
 | 
						||
    ; On fait pointer les ESI et EDI vers leurs bonnes positions:
 | 
						||
    add  esi,ecx
 | 
						||
    mov  edi,0A0000h
 | 
						||
    ; Et on la garde bien au chaud dans un coin
 | 
						||
    mov  MODE_X_Valeur_initiale_de_esi,esi
 | 
						||
    mov  MODE_X_Valeur_initiale_de_edi,edi
 | 
						||
 | 
						||
    ; On lit le nombre de lignes <20> traiter:
 | 
						||
    mov  dx,Hauteur
 | 
						||
 | 
						||
    APDLE_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On restaure la valeur de CX
 | 
						||
      pop  cx
 | 
						||
      push cx
 | 
						||
 | 
						||
      APDLE_mode_X_Pour_chaque_pixel:
 | 
						||
 | 
						||
	; On copie un pixel sur 4
 | 
						||
 | 
						||
	mov  eax,[esi]
 | 
						||
	mov  [edi],al
 | 
						||
	add  esi,4
 | 
						||
	inc  edi
 | 
						||
 | 
						||
	add  cx,4
 | 
						||
	cmp  cx,Largeur
 | 
						||
	jb   APDLE_mode_X_Pour_chaque_pixel
 | 
						||
 | 
						||
      ; On saute la partie non visible de l'<27>cran:
 | 
						||
      mov  esi,MODE_X_Valeur_initiale_de_esi
 | 
						||
      mov  edi,MODE_X_Valeur_initiale_de_edi
 | 
						||
      add  esi,ebx
 | 
						||
      add  di,MODE_X_Largeur_de_ligne
 | 
						||
      mov  MODE_X_Valeur_initiale_de_esi,esi
 | 
						||
      mov  MODE_X_Valeur_initiale_de_edi,edi
 | 
						||
 | 
						||
      dec  dx
 | 
						||
      jnz  APDLE_mode_X_Pour_chaque_ligne
 | 
						||
 | 
						||
 | 
						||
    pop  cx ; CX = n<> du plan
 | 
						||
    pop  esi
 | 
						||
    dec  cx
 | 
						||
    jns  APDLE_mode_X_Pour_chaque_plan
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_une_ligne_a_l_ecran_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI et le plan de d<>part dans CL:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*320)+Pos_X)
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ecx,ecx
 | 
						||
  xor  edx,edx
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  mov  dx,Pos_Y
 | 
						||
  mov  cx,Pos_X
 | 
						||
  mul  edx
 | 
						||
  mov  edi,0A0000h
 | 
						||
  add  eax,ecx
 | 
						||
  shr  eax,2
 | 
						||
  and  cx,3
 | 
						||
  mov  di,ax
 | 
						||
  mov  MODE_X_Valeur_initiale_de_edi,edi
 | 
						||
 | 
						||
  ; On met dans BX le n<> d'ordre du plan trait<69> (pas le n<> de plan):
 | 
						||
  xor  ebx,ebx
 | 
						||
 | 
						||
  AULALE_mode_X_Pour_chacun_des_plans:
 | 
						||
 | 
						||
    ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
    mov  esi,Ligne
 | 
						||
    add  esi,ebx
 | 
						||
 | 
						||
    ; Et dans EDI l'adresse o<> recopier
 | 
						||
    mov  edi,MODE_X_Valeur_initiale_de_edi
 | 
						||
 | 
						||
    ; On passe dans le plan en question:
 | 
						||
    mov  dx,3C4h
 | 
						||
    mov  ax,102h
 | 
						||
    shl  ah,cl
 | 
						||
    out  dx,ax
 | 
						||
    push cx
 | 
						||
 | 
						||
    ; On met dans CX la largeur d<>j<EFBFBD> trait<69>e:
 | 
						||
    mov  cx,bx
 | 
						||
 | 
						||
    AULALE_mode_X_Pour_chaque_pixel_du_plan:
 | 
						||
 | 
						||
      ; On v<>rifie qu'on ait pas d<>bord<72>:
 | 
						||
      cmp  cx,Largeur
 | 
						||
      jae  AULALE_mode_X_Fin_du_traitement_du_plan
 | 
						||
 | 
						||
      ; On copie un pixel:
 | 
						||
      mov  eax,[esi]
 | 
						||
      mov  [edi],al
 | 
						||
      add  esi,4
 | 
						||
      inc  edi
 | 
						||
      add  cx,4
 | 
						||
      jmp  AULALE_mode_X_Pour_chaque_pixel_du_plan
 | 
						||
 | 
						||
    AULALE_mode_X_Fin_du_traitement_du_plan:
 | 
						||
 | 
						||
    ; On passe au plan suivant:
 | 
						||
    pop  cx                                       ; -> Mise <20> jour de la
 | 
						||
    inc  cx                                       ;    valeur du plan
 | 
						||
    and  cx,3                                     ;
 | 
						||
    jnz  AULALE_mode_X_Pas_de_changement_de_plan  ;
 | 
						||
      inc  MODE_X_Valeur_initiale_de_edi          ;
 | 
						||
    AULALE_mode_X_Pas_de_changement_de_plan:      ;
 | 
						||
    inc  bx                                   ; -> Mise <20> jour du n<> d'ordre
 | 
						||
    cmp  bx,4                                 ;    du plan trait<69>
 | 
						||
    jne  AULALE_mode_X_Pour_chacun_des_plans  ;
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_a_l_ecran_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Lire une ligne <20> l'<27>cran et la stocker dans un buffer
 | 
						||
 | 
						||
Lire_une_ligne_a_l_ecran_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI et le plan de d<>part dans CL:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*Largeur_ecran)+Pos_X)
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ecx,ecx
 | 
						||
  xor  edx,edx
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  mov  dx,Pos_Y
 | 
						||
  mov  cx,Pos_X
 | 
						||
  mul  edx
 | 
						||
  mov  esi,0A0000h
 | 
						||
  add  eax,ecx
 | 
						||
  shr  eax,2
 | 
						||
  and  cx,3
 | 
						||
  mov  si,ax
 | 
						||
  mov  MODE_X_Valeur_initiale_de_esi,esi
 | 
						||
 | 
						||
  ; On met dans BX le n<> d'ordre du plan trait<69> (pas le n<> de plan):
 | 
						||
  xor  ebx,ebx
 | 
						||
 | 
						||
  LULALE_mode_X_Pour_chacun_des_plans:
 | 
						||
 | 
						||
    ; On met dans EDI l'adresse de la ligne o<> copier:
 | 
						||
    mov  edi,Ligne
 | 
						||
    add  edi,ebx
 | 
						||
 | 
						||
    ; Et dans ESI l'adresse <20> recopier
 | 
						||
    mov  esi,MODE_X_Valeur_initiale_de_esi
 | 
						||
 | 
						||
    ; On passe dans le plan en question:
 | 
						||
    mov  dx,3CEh                          ; DX = Port du TS (enfin, je crois)
 | 
						||
    mov  ah,cl
 | 
						||
    mov  al,04h
 | 
						||
    out  dx,ax
 | 
						||
    push cx
 | 
						||
 | 
						||
    ; On met dans CX la largeur d<>j<EFBFBD> trait<69>e:
 | 
						||
    mov  cx,bx
 | 
						||
 | 
						||
    LULALE_mode_X_Pour_chaque_pixel_du_plan:
 | 
						||
 | 
						||
      ; On v<>rifie qu'on ait pas d<>bord<72>:
 | 
						||
      cmp  cx,Largeur
 | 
						||
      jae  LULALE_mode_X_Fin_du_traitement_du_plan
 | 
						||
 | 
						||
      ; On copie un pixel:
 | 
						||
      mov  al,[esi]
 | 
						||
      mov  [edi],al
 | 
						||
      inc  esi
 | 
						||
      add  edi,4
 | 
						||
      add  cx,4
 | 
						||
      jmp  LULALE_mode_X_Pour_chaque_pixel_du_plan
 | 
						||
 | 
						||
    LULALE_mode_X_Fin_du_traitement_du_plan:
 | 
						||
 | 
						||
    ; On passe au plan suivant:
 | 
						||
    pop  cx                                       ; -> Mise <20> jour de la
 | 
						||
    inc  cx                                       ;    valeur du plan
 | 
						||
    and  cx,3                                     ;
 | 
						||
    jnz  LULALE_mode_X_Pas_de_changement_de_plan  ;
 | 
						||
      inc  MODE_X_Valeur_initiale_de_esi          ;
 | 
						||
    LULALE_mode_X_Pas_de_changement_de_plan:      ;
 | 
						||
    inc  bx                                   ; -> Mise <20> jour du n<> d'ordre
 | 
						||
    cmp  bx,4                                 ;    du plan trait<69>
 | 
						||
    jne  LULALE_mode_X_Pour_chacun_des_plans  ;
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Lire_une_ligne_a_l_ecran_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de l'image zoom<6F>e <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_zoomee_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Largeur:word,Hauteur:word,Largeur_image:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
  ; Hauteur = Hauteur zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Loupe_Decalage_Y*Largeur_image)+Loupe_Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_image
 | 
						||
  mov  bx,Loupe_Decalage_Y
 | 
						||
  mov  cx,Loupe_Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans EDX la ligne en cours de traitement:
 | 
						||
  xor  edx,edx
 | 
						||
 | 
						||
  ; On met dans EBX la distance entre deux lignes d'image
 | 
						||
  xor  ebx,ebx
 | 
						||
  mov  bx,Largeur_image
 | 
						||
 | 
						||
  APDLEZ_mode_X_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  cx,Loupe_Facteur
 | 
						||
 | 
						||
    APDLEZ_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      push cx
 | 
						||
      push dx
 | 
						||
      push Buffer     ; Ligne
 | 
						||
      push edi        ; Largeur*Facteur
 | 
						||
      push edx        ; Pos_Y
 | 
						||
      mov  ax,Principal_X_Zoom
 | 
						||
      push eax        ; Pos_X
 | 
						||
      call Afficher_une_ligne_a_l_ecran_mode_X
 | 
						||
      add  esp,16
 | 
						||
      pop  dx
 | 
						||
      pop  cx
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  dx                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  dx,Hauteur                         ;   pas arriv<69> <20> la ligne
 | 
						||
      je   APDLEZ_mode_X_Menu_Ordonnee_atteinte ;   terminale
 | 
						||
      dec  cx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  APDLEZ_mode_X_Pour_chaque_ligne      ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne image suivante
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  APDLEZ_mode_X_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  APDLEZ_mode_X_Menu_Ordonnee_atteinte:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_partie_de_l_ecran_zoomee_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne transparente en MCGA
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_a_l_ecran_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword,Couleur_transparence:byte
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
  mov  esi,Ligne
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*320)+Pos_X)
 | 
						||
  mov  ax,320
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mul  Pos_Y
 | 
						||
  add  ax,Pos_X
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans AH la couleur de transparence:
 | 
						||
  mov  ah,Couleur_transparence
 | 
						||
 | 
						||
  ; On met dans CX le nombre de pixels <20> traiter:
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  ; Pour chaque pixel de la ligne
 | 
						||
  AULTALE_Pour_chaque_pixel:
 | 
						||
 | 
						||
    ; On lit la source
 | 
						||
    mov  al,[esi]
 | 
						||
    inc  esi                                 ; MAJ du Pointeur de source
 | 
						||
 | 
						||
    ; On v<>rifie qu'elle soit <> de la couleur de transparence
 | 
						||
    cmp  al,ah
 | 
						||
    je   AULTALE_Pas_de_copie
 | 
						||
 | 
						||
      ; Et on la copie dans la destination
 | 
						||
      mov  [edi],al
 | 
						||
    AULTALE_Pas_de_copie:
 | 
						||
    inc  edi                                 ; MAJ du Pointeur de destination
 | 
						||
 | 
						||
    ; Hop! et un de moins
 | 
						||
    dec  cx
 | 
						||
    jnz  AULTALE_Pour_chaque_pixel
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_a_l_ecran_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne transparente en MCGA
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_mono_a_l_ecran_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword,Couleur_transparence:byte,Couleur:byte
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
  mov  esi,Ligne
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*320)+Pos_X)
 | 
						||
  mov  ax,320
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mul  Pos_Y
 | 
						||
  add  ax,Pos_X
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans AL la couleur de transparence:
 | 
						||
  mov  al,Couleur_transparence
 | 
						||
 | 
						||
  ; On met dans DL la couleur <20> utiliser:
 | 
						||
  mov  dl,Couleur
 | 
						||
 | 
						||
  ; On met dans CX le nombre de pixels <20> traiter:
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  ; Pour chaque pixel de la ligne
 | 
						||
  AULTMALE_Pour_chaque_pixel:
 | 
						||
 | 
						||
    ; On v<>rifie que la source soit <> de la couleur de transparence
 | 
						||
    cmp  al,[esi]
 | 
						||
    je   AULTMALE_Pas_de_copie
 | 
						||
 | 
						||
      ; Et on copie la couleur dans la destination
 | 
						||
      mov  [edi],dl
 | 
						||
    AULTMALE_Pas_de_copie:
 | 
						||
    inc  esi                                 ; MAJ du Pointeur de source
 | 
						||
    inc  edi                                 ; MAJ du Pointeur de destination
 | 
						||
 | 
						||
    ; Hop! et un de moins
 | 
						||
    dec  cx
 | 
						||
    jnz  AULTMALE_Pour_chaque_pixel
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_mono_a_l_ecran_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne transparente <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_a_l_ecran_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword,Couleur_transparence:byte
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
 | 
						||
  mov  esi,Ligne
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*Largeur_ecran)+Pos_X)
 | 
						||
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mul  Pos_Y
 | 
						||
  add  ax,Pos_X
 | 
						||
  adc  dx,0
 | 
						||
  mov  di,ax
 | 
						||
  ; Et on passe dans la banque correspondante
 | 
						||
  mov  al,dl
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On met dans ECX le nombre de pixels <20> traiter:
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  ; On regarde si la ligne loge totalement dans la banque en cours
 | 
						||
  add  cx,di
 | 
						||
  jc   AULTALE_VESA_Debordement_de_ligne
 | 
						||
 | 
						||
  ; Si c'est le cas:
 | 
						||
  mov  cx,Largeur     ; correction de CX <20> cause du test
 | 
						||
 | 
						||
  ; On effectue une copie de CX octets avec gestion de transparence
 | 
						||
  mov  dh,Couleur_transparence
 | 
						||
  AULTALE_VESA_No_break_Pour_chaque_pixel:
 | 
						||
    mov  dl,[esi]
 | 
						||
    cmp  dl,dh
 | 
						||
    je   AULTALE_VESA_No_break_Pas_de_copie
 | 
						||
      mov  [edi],dl
 | 
						||
    AULTALE_VESA_No_break_Pas_de_copie:
 | 
						||
    inc  esi
 | 
						||
    inc  edi
 | 
						||
    dec  cx
 | 
						||
    jnz  AULTALE_VESA_No_break_Pour_chaque_pixel
 | 
						||
 | 
						||
  jmp  AULTALE_VESA_Fin_traitement_ligne
 | 
						||
 | 
						||
 | 
						||
  ; Si ce n'est pas le cas (d<>bordement de la ligne)
 | 
						||
  AULTALE_VESA_Debordement_de_ligne:
 | 
						||
 | 
						||
  ; A ce stade, on sait que la ligne ne loge pas enti<74>rement sur l'<27>cran
 | 
						||
 | 
						||
  ; On m<>morise dans la pile ce qu'il restera <20> afficher <20> la droite de la
 | 
						||
  ; rupture:
 | 
						||
  push cx
 | 
						||
 | 
						||
  ; On met dans CX le nb de pixels affichables avant la rupture:
 | 
						||
  mov  cx,di
 | 
						||
  neg  cx
 | 
						||
 | 
						||
  ; On effectue une copie de CX octets avec gestion de transparence
 | 
						||
  mov  dh,Couleur_transparence
 | 
						||
  AULTALE_VESA_BreakLeft_Pour_chaque_pixel:
 | 
						||
    mov  dl,[esi]
 | 
						||
    cmp  dl,dh
 | 
						||
    je   AULTALE_VESA_BreakLeft_Pas_de_copie
 | 
						||
      mov  [edi],dl
 | 
						||
    AULTALE_VESA_BreakLeft_Pas_de_copie:
 | 
						||
    inc  esi
 | 
						||
    inc  edi
 | 
						||
    dec  cx
 | 
						||
    jnz  AULTALE_VESA_BreakLeft_Pour_chaque_pixel
 | 
						||
 | 
						||
  ; On change de banque:
 | 
						||
  inc  al
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On replace EDI en d<>but de banque
 | 
						||
  mov  edi,0A0000h
 | 
						||
 | 
						||
  ; On restaure le nb de pixels <20> afficher <20> droite de la rupture
 | 
						||
  pop  cx
 | 
						||
  or   cx,cx
 | 
						||
  jz   AULTALE_VESA_Fin_traitement_ligne
 | 
						||
 | 
						||
  ; On effectue une copie de CX octets avec gestion de transparence
 | 
						||
;  mov  dh,Couleur_transparence  ; LIGNE ECRITE PLUS HAUT, DH INCHANGE
 | 
						||
  AULTALE_VESA_BreakRight_Pour_chaque_pixel:
 | 
						||
    mov  dl,[esi]
 | 
						||
    cmp  dl,dh
 | 
						||
    je   AULTALE_VESA_BreakRight_Pas_de_copie
 | 
						||
      mov  [edi],dl
 | 
						||
    AULTALE_VESA_BreakRight_Pas_de_copie:
 | 
						||
    inc  esi
 | 
						||
    inc  edi
 | 
						||
    dec  cx
 | 
						||
    jnz  AULTALE_VESA_BreakRight_Pour_chaque_pixel
 | 
						||
 | 
						||
 | 
						||
  AULTALE_VESA_Fin_traitement_ligne:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_a_l_ecran_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne transparente mono <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_mono_a_l_ecran_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword,Couleur_transparence:byte,Couleur:byte
 | 
						||
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
 | 
						||
  mov  esi,Ligne
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*Largeur_ecran)+Pos_X)
 | 
						||
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  mov  edi,0A0000h
 | 
						||
  mul  Pos_Y
 | 
						||
  add  ax,Pos_X
 | 
						||
  adc  dx,0
 | 
						||
  mov  di,ax
 | 
						||
  ; Et on passe dans la banque correspondante
 | 
						||
  mov  al,dl
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On met dans ECX le nombre de pixels <20> traiter:
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  cx,Largeur
 | 
						||
 | 
						||
  ; On regarde si la ligne loge totalement dans la banque en cours
 | 
						||
  add  cx,di
 | 
						||
  jc   AULTMALE_VESA_Debordement_de_ligne
 | 
						||
 | 
						||
  ; Si c'est le cas:
 | 
						||
  mov  cx,Largeur     ; correction de CX <20> cause du test
 | 
						||
 | 
						||
  ; On effectue une copie de CX octets avec gestion de transparence
 | 
						||
  mov  dl,Couleur_transparence
 | 
						||
  mov  dh,Couleur
 | 
						||
  AULTMALE_VESA_No_break_Pour_chaque_pixel:
 | 
						||
    cmp  dl,[esi]
 | 
						||
    je   AULTMALE_VESA_No_break_Pas_de_copie
 | 
						||
      mov  [edi],dh
 | 
						||
    AULTMALE_VESA_No_break_Pas_de_copie:
 | 
						||
    inc  esi
 | 
						||
    inc  edi
 | 
						||
    dec  cx
 | 
						||
    jnz  AULTMALE_VESA_No_break_Pour_chaque_pixel
 | 
						||
 | 
						||
  jmp  AULTMALE_VESA_Fin_traitement_ligne
 | 
						||
 | 
						||
 | 
						||
  ; Si ce n'est pas le cas (d<>bordement de la ligne)
 | 
						||
  AULTMALE_VESA_Debordement_de_ligne:
 | 
						||
 | 
						||
  ; A ce stade, on sait que la ligne ne loge pas enti<74>rement sur l'<27>cran
 | 
						||
 | 
						||
  ; On m<>morise dans la pile ce qu'il restera <20> afficher <20> la droite de la
 | 
						||
  ; rupture:
 | 
						||
  push cx
 | 
						||
 | 
						||
  ; On met dans CX le nb de pixels affichables avant la rupture:
 | 
						||
  mov  cx,di
 | 
						||
  neg  cx
 | 
						||
 | 
						||
  ; On effectue une copie de CX octets avec gestion de transparence
 | 
						||
  mov  dl,Couleur_transparence
 | 
						||
  mov  dh,Couleur
 | 
						||
  AULTMALE_VESA_BreakLeft_Pour_chaque_pixel:
 | 
						||
    cmp  dl,[esi]
 | 
						||
    je   AULTMALE_VESA_BreakLeft_Pas_de_copie
 | 
						||
      mov  [edi],dh
 | 
						||
    AULTMALE_VESA_BreakLeft_Pas_de_copie:
 | 
						||
    inc  esi
 | 
						||
    inc  edi
 | 
						||
    dec  cx
 | 
						||
    jnz  AULTMALE_VESA_BreakLeft_Pour_chaque_pixel
 | 
						||
 | 
						||
  ; On change de banque:
 | 
						||
  inc  al
 | 
						||
  call [VESA_Change_banque_ecriture]
 | 
						||
 | 
						||
  ; On replace EDI en d<>but de banque
 | 
						||
  mov  edi,0A0000h
 | 
						||
 | 
						||
  ; On restaure le nb de pixels <20> afficher <20> droite de la rupture
 | 
						||
  pop  cx
 | 
						||
  or   cx,cx
 | 
						||
  jz   AULTMALE_VESA_Fin_traitement_ligne
 | 
						||
 | 
						||
  ; On effectue une copie de CX octets avec gestion de transparence
 | 
						||
;  mov  dl,Couleur_transparence  ; LIGNE ECRITE PLUS HAUT, DL INCHANGE
 | 
						||
;  mov  dh,Couleur               ; LIGNE ECRITE PLUS HAUT, DH INCHANGE
 | 
						||
  AULTMALE_VESA_BreakRight_Pour_chaque_pixel:
 | 
						||
    cmp  dl,[esi]
 | 
						||
    je   AULTMALE_VESA_BreakRight_Pas_de_copie
 | 
						||
      mov  [edi],dh
 | 
						||
    AULTMALE_VESA_BreakRight_Pas_de_copie:
 | 
						||
    inc  esi
 | 
						||
    inc  edi
 | 
						||
    dec  cx
 | 
						||
    jnz  AULTMALE_VESA_BreakRight_Pour_chaque_pixel
 | 
						||
 | 
						||
 | 
						||
  AULTMALE_VESA_Fin_traitement_ligne:
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_mono_a_l_ecran_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne transparente <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_a_l_ecran_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword,Couleur_transparence:byte
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI et le plan de d<>part dans CL:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*320)+Pos_X)
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ecx,ecx
 | 
						||
  xor  edx,edx
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  mov  dx,Pos_Y
 | 
						||
  mov  cx,Pos_X
 | 
						||
  mul  edx
 | 
						||
  mov  edi,0A0000h
 | 
						||
  add  eax,ecx
 | 
						||
  shr  eax,2
 | 
						||
  and  cx,3
 | 
						||
  mov  di,ax
 | 
						||
  mov  MODE_X_Valeur_initiale_de_edi,edi
 | 
						||
 | 
						||
  ; On met dans BX le n<> d'ordre du plan trait<69> (pas le n<> de plan):
 | 
						||
  xor  ebx,ebx
 | 
						||
 | 
						||
  AULTALE_mode_X_Pour_chacun_des_plans:
 | 
						||
 | 
						||
    ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
    mov  esi,Ligne
 | 
						||
    add  esi,ebx
 | 
						||
 | 
						||
    ; Et dans EDI l'adresse o<> recopier
 | 
						||
    mov  edi,MODE_X_Valeur_initiale_de_edi
 | 
						||
 | 
						||
    ; On passe dans le plan en question:
 | 
						||
    mov  dx,3C4h
 | 
						||
    mov  ax,102h
 | 
						||
    shl  ah,cl
 | 
						||
    out  dx,ax
 | 
						||
    push cx
 | 
						||
 | 
						||
    ; On met dans CX la largeur d<>j<EFBFBD> trait<69>e:
 | 
						||
    mov  cx,bx
 | 
						||
 | 
						||
    ; On met dans AH la couleur de transparence
 | 
						||
    mov  ah,Couleur_transparence
 | 
						||
 | 
						||
    AULTALE_mode_X_Pour_chaque_pixel_du_plan:
 | 
						||
 | 
						||
      ; On v<>rifie qu'on ai pas d<>bord<72>:
 | 
						||
      cmp  cx,Largeur
 | 
						||
      jae  AULTALE_mode_X_Fin_du_traitement_du_plan
 | 
						||
 | 
						||
      ; On copie un pixel:
 | 
						||
      mov  al,[esi]
 | 
						||
      cmp  al,ah
 | 
						||
      je   AULTALE_mode_X_Pas_de_copie
 | 
						||
	mov  [edi],al
 | 
						||
      AULTALE_mode_X_Pas_de_copie:
 | 
						||
      add  esi,4
 | 
						||
      inc  edi
 | 
						||
      add  cx,4
 | 
						||
      jmp  AULTALE_mode_X_Pour_chaque_pixel_du_plan
 | 
						||
 | 
						||
    AULTALE_mode_X_Fin_du_traitement_du_plan:
 | 
						||
 | 
						||
    ; On passe au plan suivant:
 | 
						||
    pop  cx                                       ; -> Mise <20> jour de la
 | 
						||
    inc  cx                                       ;    valeur du plan
 | 
						||
    and  cx,3                                     ;
 | 
						||
    jnz  AULTALE_mode_X_Pas_de_changement_de_plan  ;
 | 
						||
      inc  MODE_X_Valeur_initiale_de_edi          ;
 | 
						||
    AULTALE_mode_X_Pas_de_changement_de_plan:      ;
 | 
						||
    inc  bx                                   ; -> Mise <20> jour du n<> d'ordre
 | 
						||
    cmp  bx,4                                 ;    du plan trait<69>
 | 
						||
    jne  AULTALE_mode_X_Pour_chacun_des_plans  ;
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_a_l_ecran_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une ligne transparente mono <20> l'<27>cran
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_mono_a_l_ecran_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg   Pos_X:word,Pos_Y:word,Largeur:word,Ligne:dword,Couleur_transparence:byte,Couleur:byte
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de EDI et le plan de d<>part dans CL:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=0A0000h+((Pos_Y*320)+Pos_X)
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ecx,ecx
 | 
						||
  xor  edx,edx
 | 
						||
  mov  ax,Largeur_ecran
 | 
						||
  mov  dx,Pos_Y
 | 
						||
  mov  cx,Pos_X
 | 
						||
  mul  edx
 | 
						||
  mov  edi,0A0000h
 | 
						||
  add  eax,ecx
 | 
						||
  shr  eax,2
 | 
						||
  and  cx,3
 | 
						||
  mov  di,ax
 | 
						||
  mov  MODE_X_Valeur_initiale_de_edi,edi
 | 
						||
 | 
						||
  ; On met dans BX le n<> d'ordre du plan trait<69> (pas le n<> de plan):
 | 
						||
  xor  ebx,ebx
 | 
						||
 | 
						||
  AULTMALE_mode_X_Pour_chacun_des_plans:
 | 
						||
 | 
						||
    ; On met dans ESI l'adresse de la ligne <20> copier:
 | 
						||
    mov  esi,Ligne
 | 
						||
    add  esi,ebx
 | 
						||
 | 
						||
    ; Et dans EDI l'adresse o<> recopier
 | 
						||
    mov  edi,MODE_X_Valeur_initiale_de_edi
 | 
						||
 | 
						||
    ; On passe dans le plan en question:
 | 
						||
    mov  dx,3C4h
 | 
						||
    mov  ax,102h
 | 
						||
    shl  ah,cl
 | 
						||
    out  dx,ax
 | 
						||
    push cx
 | 
						||
 | 
						||
    ; On met dans CX la largeur d<>j<EFBFBD> trait<69>e:
 | 
						||
    mov  cx,bx
 | 
						||
 | 
						||
    ; On met dans AL la couleur de transparence
 | 
						||
    mov  al,Couleur_transparence
 | 
						||
    ; Et la couleur de coloriage dans AH
 | 
						||
    mov  ah,Couleur
 | 
						||
 | 
						||
    AULTMALE_mode_X_Pour_chaque_pixel_du_plan:
 | 
						||
 | 
						||
      ; On v<>rifie qu'on ai pas d<>bord<72>:
 | 
						||
      cmp  cx,Largeur
 | 
						||
      jae  AULTMALE_mode_X_Fin_du_traitement_du_plan
 | 
						||
 | 
						||
      ; On copie un pixel:
 | 
						||
      cmp  al,[esi]
 | 
						||
      je   AULTMALE_mode_X_Pas_de_copie
 | 
						||
	mov  [edi],ah
 | 
						||
      AULTMALE_mode_X_Pas_de_copie:
 | 
						||
      add  esi,4
 | 
						||
      inc  edi
 | 
						||
      add  cx,4
 | 
						||
      jmp  AULTMALE_mode_X_Pour_chaque_pixel_du_plan
 | 
						||
 | 
						||
    AULTMALE_mode_X_Fin_du_traitement_du_plan:
 | 
						||
 | 
						||
    ; On passe au plan suivant:
 | 
						||
    pop  cx                                       ; -> Mise <20> jour de la
 | 
						||
    inc  cx                                       ;    valeur du plan
 | 
						||
    and  cx,3                                     ;
 | 
						||
    jnz  AULTMALE_mode_X_Pas_de_changement_de_plan  ;
 | 
						||
      inc  MODE_X_Valeur_initiale_de_edi          ;
 | 
						||
    AULTMALE_mode_X_Pas_de_changement_de_plan:      ;
 | 
						||
    inc  bx                                   ; -> Mise <20> jour du n<> d'ordre
 | 
						||
    cmp  bx,4                                 ;    du plan trait<69>
 | 
						||
    jne  AULTMALE_mode_X_Pour_chacun_des_plans  ;
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Afficher_une_ligne_transparente_mono_a_l_ecran_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse zoom<6F>e en couleur en MCGA
 | 
						||
 | 
						||
Display_brush_Color_Zoom_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Largeur_brosse:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Brosse+((Decalage_Y*Largeur_brosse)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_brosse
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Brosse
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  DBCZ_MCGA_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    mov  al,Couleur_de_transparence
 | 
						||
    push eax                                      ; Couleur de transparence
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    DBCZ_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_transparente_a_l_ecran_MCGA
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   DBCZ_MCGA_Hauteur_atteinte         ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  DBCZ_MCGA_Pour_chaque_ligne        ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,12     ; (Largeur*Facteur + Ligne + Couleur de transparence)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_brosse ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  DBCZ_MCGA_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  DBCZ_MCGA_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,16     ; (Largeur*Facteur + Ligne + Couleur de transparence + ESI)
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Color_Zoom_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse zoom<6F>e en monochrome en MCGA
 | 
						||
 | 
						||
Display_brush_Mono_Zoom_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Couleur:byte,Largeur_brosse:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Brosse+((Decalage_Y*Largeur_brosse)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_brosse
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Brosse
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  DBMZ_MCGA_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    mov  al,Couleur
 | 
						||
    mov  cl,Couleur_de_transparence
 | 
						||
    push eax                                      ; Couleur d'affichage
 | 
						||
    push ecx                                      ; Couleur de transparence
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    DBMZ_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_transparente_mono_a_l_ecran_MCGA
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   DBMZ_MCGA_Hauteur_atteinte         ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  DBMZ_MCGA_Pour_chaque_ligne        ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,16     ; (Largeur*Facteur + Ligne + Couleur de transparence + Couleur)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_brosse ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  DBMZ_MCGA_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  DBMZ_MCGA_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,20     ; (Largeur*Facteur + Ligne + Couleur de transparence + Couleur + ESI)
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Mono_Zoom_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Effacer une partie de la brosse zoom<6F>e en MCGA
 | 
						||
 | 
						||
Clear_brush_Zoom_MCGA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Largeur_image:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Decalage_Y*Largeur_image)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_image
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  CBZ_MCGA_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    CBZ_MCGA_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_a_l_ecran_MCGA
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   CBZ_MCGA_Hauteur_atteinte          ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  CBZ_MCGA_Pour_chaque_ligne         ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,8      ; (Largeur*Facteur + Ligne)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_image ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  CBZ_MCGA_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  CBZ_MCGA_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,12     ; (Largeur*Facteur + Ligne + ESI)
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Clear_brush_Zoom_MCGA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse zoom<6F>e en couleur en mode X
 | 
						||
 | 
						||
Display_brush_Color_Zoom_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Largeur_brosse:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Brosse+((Decalage_Y*Largeur_brosse)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_brosse
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Brosse
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  DBCZ_mode_X_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    mov  al,Couleur_de_transparence
 | 
						||
    push eax                                      ; Couleur de transparence
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    DBCZ_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_transparente_a_l_ecran_mode_X
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   DBCZ_mode_X_Hauteur_atteinte         ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  DBCZ_mode_X_Pour_chaque_ligne        ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,12     ; (Largeur*Facteur + Ligne + Couleur de transparence)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_brosse ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  DBCZ_mode_X_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  DBCZ_mode_X_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,16     ; (Largeur*Facteur + Ligne + Couleur de transparence + ESI)
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Color_Zoom_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse zoom<6F>e en monochrome en mode X
 | 
						||
 | 
						||
Display_brush_Mono_Zoom_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Couleur:byte,Largeur_brosse:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Brosse+((Decalage_Y*Largeur_brosse)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_brosse
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Brosse
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  DBMZ_mode_X_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    mov  al,Couleur
 | 
						||
    mov  cl,Couleur_de_transparence
 | 
						||
    push eax                                      ; Couleur d'affichage
 | 
						||
    push ecx                                      ; Couleur de transparence
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    DBMZ_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_transparente_mono_a_l_ecran_mode_X
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   DBMZ_mode_X_Hauteur_atteinte         ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  DBMZ_mode_X_Pour_chaque_ligne        ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,16     ; (Largeur*Facteur + Ligne + Couleur de transparence + Couleur)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_brosse ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  DBMZ_mode_X_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  DBMZ_mode_X_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,20     ; (Largeur*Facteur + Ligne + Couleur de transparence + Couleur + ESI)
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Mono_Zoom_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Effacer une partie de la brosse zoom<6F>e en mode X
 | 
						||
 | 
						||
Clear_brush_Zoom_mode_X proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Largeur_image:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Decalage_Y*Largeur_image)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_image
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  CBZ_mode_X_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    CBZ_mode_X_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_a_l_ecran_mode_X
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   CBZ_mode_X_Hauteur_atteinte          ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  CBZ_mode_X_Pour_chaque_ligne         ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,8      ; (Largeur*Facteur + Ligne)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_image ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  CBZ_mode_X_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  CBZ_mode_X_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,12     ; (Largeur*Facteur + Ligne + ESI)
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Clear_brush_Zoom_mode_X endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse zoom<6F>e en couleur en VESA
 | 
						||
 | 
						||
Display_brush_Color_Zoom_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Largeur_brosse:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Brosse+((Decalage_Y*Largeur_brosse)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_brosse
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Brosse
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  DBCZ_VESA_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    mov  al,Couleur_de_transparence
 | 
						||
    push eax                                      ; Couleur de transparence
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    DBCZ_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_transparente_a_l_ecran_VESA
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   DBCZ_VESA_Hauteur_atteinte         ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  DBCZ_VESA_Pour_chaque_ligne        ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,12     ; (Largeur*Facteur + Ligne + Couleur de transparence)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_brosse ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  DBCZ_VESA_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  DBCZ_VESA_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,16     ; (Largeur*Facteur + Ligne + Couleur de transparence + ESI)
 | 
						||
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Color_Zoom_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Afficher une partie de la brosse zoom<6F>e en monochrome en VESA
 | 
						||
 | 
						||
Display_brush_Mono_Zoom_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Couleur:byte,Largeur_brosse:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Brosse+((Decalage_Y*Largeur_brosse)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_brosse
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Brosse
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  DBMZ_VESA_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    mov  al,Couleur
 | 
						||
    mov  cl,Couleur_de_transparence
 | 
						||
    push eax                                      ; Couleur d'affichage
 | 
						||
    push ecx                                      ; Couleur de transparence
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    DBMZ_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_transparente_mono_a_l_ecran_VESA
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   DBMZ_VESA_Hauteur_atteinte         ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  DBMZ_VESA_Pour_chaque_ligne        ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,16     ; (Largeur*Facteur + Ligne + Couleur de transparence + Couleur)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_brosse ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  DBMZ_VESA_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  DBMZ_VESA_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,20     ; (Largeur*Facteur + Ligne + Couleur de transparence + Couleur + ESI)
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Display_brush_Mono_Zoom_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
; Effacer une partie de la brosse zoom<6F>e en VESA
 | 
						||
 | 
						||
Clear_brush_Zoom_VESA proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Pos_X:word,Pos_Y:word,Decalage_X:word,Decalage_Y:word,Largeur:word,Pos_Y_Fin:word,Couleur_de_transparence:byte,Largeur_image:word,Buffer:dword
 | 
						||
 | 
						||
  ; Largeur_brosse=Largeur r<>elle de la brosse
 | 
						||
  ; Largeur = Largeur non zoom<6F>e
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
 | 
						||
  ; On calcule la valeur initiale de ESI:
 | 
						||
  ;
 | 
						||
  ; Valeur initiale=Principal_Ecran+((Decalage_Y*Largeur_image)+Decalage_X)
 | 
						||
 | 
						||
  xor  eax,eax
 | 
						||
  xor  ebx,ebx
 | 
						||
  xor  ecx,ecx
 | 
						||
  mov  ax,Largeur_image
 | 
						||
  mov  bx,Decalage_Y
 | 
						||
  mov  cx,Decalage_X
 | 
						||
  mul  ebx
 | 
						||
  mov  esi,Principal_Ecran
 | 
						||
  add  eax,ecx
 | 
						||
  add  esi,eax
 | 
						||
 | 
						||
  ; On met dans DI la valeur Largeur*Facteur
 | 
						||
  mov  ax,Largeur
 | 
						||
  mul  Loupe_Facteur
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  ; On met dans DX la ligne en cours de traitement:
 | 
						||
  xor  dx,Pos_Y
 | 
						||
 | 
						||
  CBZ_VESA_Pour_chaque_ligne_a_zoomer:
 | 
						||
 | 
						||
    ; On eclate la ligne <20> zoomer:
 | 
						||
    push dx
 | 
						||
    mov  ax,Loupe_Facteur
 | 
						||
    mov  cx,Largeur
 | 
						||
    push ecx         ; Largeur
 | 
						||
    push eax         ; Facteur
 | 
						||
    push Buffer      ; Ligne zoom<6F>e
 | 
						||
    push esi         ; Ligne originale
 | 
						||
    call Zoomer_une_ligne
 | 
						||
    add  esp,16
 | 
						||
    pop  dx
 | 
						||
 | 
						||
    ; On sauve l'ancienne valeur de ESI:
 | 
						||
    push esi
 | 
						||
 | 
						||
    ; On place dans ESI la position courante en Y
 | 
						||
    mov  esi,edx
 | 
						||
 | 
						||
    ; On empile <20> l'avance les derniers param<61>tres qui ne changent jamais le
 | 
						||
    ; long de la m<>me ligne zoom<6F>e:
 | 
						||
    push Buffer                                   ; Ligne
 | 
						||
    push edi                                      ; Largeur*Facteur
 | 
						||
 | 
						||
    ; On l'affiche Facteur fois <20> l'<27>cran (sur des lignes cons<6E>cutives):
 | 
						||
    mov  bx,Loupe_Facteur ; BX n'est pas foutu en l'air par la routine appel<65>e
 | 
						||
 | 
						||
    CBZ_VESA_Pour_chaque_ligne:
 | 
						||
 | 
						||
      ; On affiche la ligne zoom<6F>e
 | 
						||
      mov  ax,Pos_X
 | 
						||
      push esi                                      ; Pos_Y
 | 
						||
      push eax                                      ; Pos_X
 | 
						||
      call Afficher_une_ligne_a_l_ecran_VESA
 | 
						||
      add  esp,8    ; (Pos_X+Pos_Y)
 | 
						||
 | 
						||
      ; On passe <20> la ligne suivante
 | 
						||
      inc  si                                 ; -> On v<>rifie qu'on ne soit
 | 
						||
      cmp  si,Pos_Y_Fin                       ;   pas arriv<69> <20> la ligne
 | 
						||
      je   CBZ_VESA_Hauteur_atteinte          ;   terminale
 | 
						||
      dec  bx                                 ; -> ou que l'on ai termin<69> de
 | 
						||
      jnz  CBZ_VESA_Pour_chaque_ligne         ;   traiter la ligne <20> zoomer
 | 
						||
 | 
						||
    ; On passe <20> la ligne <20> zoomer suivante:
 | 
						||
    ; sans oublier de passer <20> la ligne brosse suivante
 | 
						||
 | 
						||
    ; On commence par retirer les param<61>tres pr<70>c<EFBFBD>demment pass<73>s
 | 
						||
    add  esp,8      ; (Largeur*Facteur + Ligne)
 | 
						||
 | 
						||
    ; On sauve la ligne courante dans DX:
 | 
						||
    mov  edx,esi
 | 
						||
 | 
						||
    ; On restaure l'ancienne valeur de ESI:
 | 
						||
    pop  esi
 | 
						||
 | 
						||
    mov  bx,Largeur_image ; En th<74>orie, la partie haute de EBX est propre
 | 
						||
    add  esi,ebx
 | 
						||
    jmp  CBZ_VESA_Pour_chaque_ligne_a_zoomer
 | 
						||
 | 
						||
  CBZ_VESA_Hauteur_atteinte:
 | 
						||
 | 
						||
  ; On ram<61>ne la pile dans un <20>tat normal
 | 
						||
  add  esp,12     ; (Largeur*Facteur + Ligne + ESI)
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Clear_brush_Zoom_VESA endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
_TEXT ENDS
 | 
						||
END
 | 
						||
 |