Win3x.Org

Windows & DOS Community

[propose]DOS : Disquette de l'ouvrage « Guide Microsoft de la programmation des cartes graphiques »

Règles du forum

Ce forum sert à contribuer au site ou faire une demande de contribution. Pour proposer un programme, suivez simplement le guide en trois étapes !
Les présentations des différents programmes ne sont pas figées : si vous pensez pouvoir les améliorer, n'hésitez pas à proposer votre version !

Répondre   Page 1 sur 1  [ 6 messages ]
Auteur Message
gm86
Sujet du message : [propose]DOS : Disquette de l'ouvrage « Guide Microsoft de la programmation des cartes graphiques »
Publié : 28 juil. 2019 22:31
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 630
Inscription : 01 sept. 2008 19:07
 
Disquette 5"1/4 DD de l'ouvrage référencé ci-dessous :
- nom : Guide Microsoft de la programmation des cartes graphiques
- auteur : Richard Wilton
- éditeur : Sybex, Microsoft Press pour l'original
- parution : 1990, Sybex ; 1987, Microsoft Press
Sybex propose l'échange de la disquette 5"1/4 contre une 3"1/2.

http://dl.free.fr/qEPZY8Yeb

L'archive contient le catalogue dans INFO.TXT :
Contenu du disque " Guide Microsoft de la programmation des cartes graphiques "
-------------------------------------------------------------------------------


1-1.ASM  :	SetVmode
Fonction :	Appeler le BIOS en ROM pour lancer un mode vidéo.
Appelant :	Microsoft C

1-2.ASM  :	GetVmode
Fonction :	Appel du BIOS en ROM du PC IBM pour lire un mode vidéo.
Appelant :	Microsoft C

2-2.ASM  :	HRTimeout
Fonction :	Déterminer une valeur de timeout pour l'intervalle 
		de blanking horizontal.
Appelant :	Microsoft C

2-4.ASM  :	HercGraphMode
Fonction :	Placer une carte Hercules HGC, HGC+ ou InColor 
		en mode graphique 720x348.
Appelant :	Microsoft C

3-9.ASM  :	DisplayText
Fonction :	Afficher une chaîne de texte sans interférence avec une CGA.
Appelant :	Microsoft C

3-10.ASM :	DisplayText
Fonction :	Afficher une chaîne de texte sans interférence avec une CGA.
Appelant :	Microsoft C

4-1.ASM  :	PixelAddr04
Fonction :	Déterminer l'adresse dans le buffer d'un pixel en mode
		320x200, 4 couleurs.

4-2.ASM  :	PixelAddr06
Fonction :	Déterminer l'adresse dans le buffer d'un pixel
		en mode 640x200, 2 couleurs.

4-3.ASM  :	PixelAddrHGC
Fonction :	Déterminer l'adresse dans le buffer d'un pixel en
		mode graphique Hercules 720x348 monochrome.

4-4.ASM  :	PixelAddr10
Fonction :	Déterminer l'adresse d'un pixel en mode natif EGA et VGA :
		320x200 16 couleurs
		640x200 16 couleurs
		640x350 16 couleurs
		640x350 monochrome (4 couleurs)
		640x480 2 couleurs
		640x480 16 couleurs

4-5.ASM  :	PixelAddr13
Fonction :	Déterminer l'adresse d'un pixel dans le buffer en mode
		320x200, 256 couleurs.

5-2.ASM  :	ReadPixel06
Fonction :	Lire la valeur d'un pixel en mode 640x200, 2 couleurs.
Appelant :	Microsoft C

5-3.ASM  :	ReadPixel04
Fonction :	Lire la valeur d'un pixel en mode 320x200, 4 couleurs.
Appelant :	Microsoft C

5-4.ASM  :	ReadPixel10
Fonction :	Lire la valeur d'un pixel en mode graphique natif EGA.
Appelant :	Microsoft C

5-5.ASM  :	ReadPixel0F
Fonction :	Lire la valeur d'un pixel en mode monochrome 640x350.
Appelant :	Microsoft C

5-6.ASM  :	ReadPixel10
Fonction :	Lire la valeur d'un pixel dans les modes 640x350 avec une
		carte EGA n'ayant que 64 Ko.

5-7.ASM  :	ReadPixelInC
Fonction :	Lire la valeur d'un pixel en mode 720x348, 16 couleurs
		d'une carte InColor.
Appelant :	Microsoft C

5-8.ASM  :	ReadPixel11
Fonction :	Lire la valeur d'un pixel en mode 640x480, 
		2 couleurs (MCGA ou VGA).
Appelant :	Microsoft C

5-9.ASM  :	ReadPixel13
Fonction :	Lire la valeur d'un pixel en mode 320x200, 
		256 couleurs (MCGA et VGA).
Appelant :	Microsoft C

5-10.ASM :	SetPixel06
Fonction :	Modifier la valeur d'un pixel en mode 640x200, 2 couleurs.
Appelant :	Microsoft C

5-11.ASM :	SetPixel04
Fonction :	Modifier la valeur d'un pixel en mode 320x200, 4 couleurs.
Appelant :	Microsoft C

5-12.ASM :	SetPixel10
Fonction :	Modifier la valeur d'un pixel en mode graphique natif EGA.
		*** Mode d'Ecriture 0, Set/Reset ***
Appelant :	Microsoft C

5-13.ASM :	SetPixel10
Fonction :	Modifier la valeur d'un pixel en mode graphique natif EGA.
		*** Mode d'Ecriture 0, utilisation du séquenceur ***
Appelant :	Microsoft C

5-14.ASM :	SetPixel10
Fonction :	Modifier la valeur d'un pixel en mode graphique natif EGA.
		*** Mode d'Ecriture 2 ***
Appelant :	Microsoft C

5-15.ASM :	SetPixelInC
Fonction :	Modifier la valeur d'un pixel en mode 720x348, 16 couleurs.
Appelant :	Microsoft C

5-16.ASM :	SetPixel11
Fonction :	Modifier la valeur d'un  pixel en mode 640x480, 2 couleurs
		(MCGA or VGA).
Appelant :	Microsoft C

5-17.ASM :	SetPixel13
Fonction :	Modifier la valeur d'un pixel en mode VGA 320x200 256 couleurs.
Appelant :	Microsoft C

6-4.ASM  :	Line06
Fonction :	Tracer une droite en mode 640x200, 2 couleurs.
Appelant :	Microsoft C

6-5.ASM  :	Line04
Fonction :	Tracer une droite en mode 320x200, 4 couleurs.
Appelant :	Microsoft C

6-6.ASM  :	LineHGC
Fonction :	Tracer une droite en mode graphique HGC ou HGC+ 720x348.
Appelant :	Microsoft C

6-7.ASM  :	Line10
Fonction :	Tracer une droite dans les modes graphiques EGA et VGA :
		200 lignes, 16 couleurs
		350 lignes
		640x480 16 couleurs
Appelant :	Microsoft C

6-8.ASM  :	Line11
Fonction :	Tracer une droite en mode 640x480, 2 couleurs (MCGA, VGA).
Appelant :	Microsoft C

6-9.ASM  :	Line13
Fonction :	Tracer une droite en mode MCGA/VGA 320x200, 256 couleurs.
Appelant :	Microsoft C

6-10.ASM :	LineInC
Fonction :	Tracer une droite en mode Hercules InColor 720x348, 16 couleurs.
Appelant :	Microsoft C

7-4.ASM  :	Ellipse10
Fonction :	Tracer une ellipse en mode graphique natif EGA/VGA.
Appelant :	Microsoft C

8-5.ASM  :	ScanRight10
Fonction :	Rechercher un pixel de valeur donnée en mode graphique
		16 couleurs EGA/VGA.
Appelant :	Microsoft C

9-2.ASM  :	DisplayChar06
Fonction :	Afficher un caractère en mode 640x200, 2 couleurs.
Appelant :	Microsoft C

9-3.ASM  :	DisplayChar04
Fonction :	Afficher un caractère en mode graphique 320x200, 4 couleurs.
Appelant :	Microsoft C

9-4.ASM  :	DisplayCharHGC
Fonction :	Afficher un caractère en mode graphique monochrome
		Hercules 720x348.
Appelant :	Microsoft C

9-5.ASM  :	DisplayChar13
Fonction :	Afficher un caractère en mode MCGA/VGA 320x200, 256 couleurs.
Appelant :	Microsoft C

9-6.ASM  :	DisplayChar10
Fonction :	Afficher un caractère en modes graphiques natifs EGA et VGA.
Appelant :	Microsoft C

9-7.ASM  :	DisplayCharInC
Fonction :	Afficher un caractère en mode InColor 720x348, 16 couleurs.
Appelant :	Microsoft C

10-12.ASM:	AlphaModeSet
Fonction :	Programmer le CRTC en mode alphanumérique EGA 80 colonnes.
Appelant :	Microsoft C

10-13.ASM:	AlphaModeSet
Fonction :	Programmer le CRTC en modes alphanumérique 80-colonnes VGA.
Appelant :	Microsoft C

10-14.ASM:	AlphaModeSet
Fonction :	Programmer le CRTC en mode alphanumérique pour HGC+ ou InColor.
Appelant :	Microsoft C

10-1A.ASM:	CGenModeSet
Fonction :	Accès direct au générateur de caractères en RAM des cartes
		EGA et VGA.
Appelant :	Microsoft C

10-1B.ASM:	CGenModeClear
Fonction :	Restaure le mode alphanumérique EGA ou VGA après
		avoir accédé au générateur de caractères en RAM.
Appelant :	Microsoft C

10-2A.ASM:	CGenRead1
Fonction :	Lire 256 définitions de caractère dans le générateur de
		caractères en RAM (EGA ou VGA).
Appelant :	Microsoft C

10-3A.ASM:	CGenRead2
Fonction :	Lire 256 définitions de caractère dans le générateur de
		caractères en RAM (EGA ou VGA) en utilisant le BIOS vidéo.
Appelant :	Microsoft C

10-5.ASM :	SetFontPages
Fonction :	Changer les valeurs des fontes de page pour le MCGA.
Appelant :	Microsoft C

11-1.ASM :	GetBitBlock06
Fonction :	Copier un bloc de bits du buffer vidéo vers la RAM système
		en mode 640x200, 2 couleurs.
Appelant :	Microsoft C

11-2.ASM :	StoreBitBlock06
Fonction :	Copier un bloc de bits de la RAM système vers le buffer vidéo
		en mode 640x200, 2 couleurs.
Appelant :	Microsoft C

11-3.ASM :	GetBitBlock10
Fonction :	Copier un bloc de bits du buffer vidéo vers la RAM système
		en mode natif graphique EGA et VGA.
Appelant :	Microsoft C

11-4.ASM :	StoreBitBlock10
Fonction :	Copier un bloc de bits à partir de la RAM système vers
		le buffer vidéo en mode graphique natif EGA et VGA.
Appelant :	Microsoft C

12-1.ASM :	VREGA
Fonction :	Routine d'interruption verticale pour EGA et VGA.
Appelant :	Microsoft C

12-3.ASM :	VRMCGA
Fonction :	Handler d'interruption verticale pour l'adaptateur MCGA.
Appelant :	Microsoft C

12-4.ASM :	ScreenOrigin
Fonction :	Modifier l'origine de l'écran pour une EGA ou une VGA.
Appelant :	Microsoft C

12-6A.ASM:	BufferDims
Fonction :	Modifier les dimensions du buffer vidéo en EGA.
Appelant :	Microsoft C

12-7A.ASM:	SplitScreen
Fonction :	Partage horizontal d'écran avec une carte EGA.
Appelant :	Microsoft C

12-7B.ASM:	SplitScreen
Fonction :	Partage horizontal d'écran avec une carte VGA.
Appelant :	Microsoft C

12-9A.ASM:	GetLightPen
Fonction :	Obtenir la position du photostyle (Light Pen).
Appelant :	Microsoft C

12-10.ASM:	GetHercMode
Fonction :	Déterminer le mode vidéo sur un adaptateur Hercules en
		estimant la taille de la portion affichée du buffer.
Appelant :	Microsoft C

13-1A.ASM:	SetPixel
Fonction :	Modifier la valeur d'un pixel en mode graphique natif EGA.
Appelant :	Microsoft C (modèle de mémoire "small")

13-2A.ASM:	SETPEL
Fonction :	Modifier la valeur d'un pixel en mode graphique natif EGA.
Appelant :	FORTRAN Microsoft

13-3A.ASM:	SETPEL
Fonction :	Modifier la valeur d'un pixel en mode graphique natif EGA.
Appelant :	Turbo Pascal 3

13-4A.ASM:	SETPEL
Fonction :	Modifier la valeur d'un pixel en mode 320x200, 4 couleurs.
Appelant :	BASICA IBM ou GWBASIC Microsoft

13-5.ASM :	SetPixel
Fonction :	Modifier la valeur d'un pixel en mode natif graphique EGA.
Appelant :	Routine résidente en mémoire appelée par une Int 60h

13-7.ASM :	dgisrect
Fonction :	Dessiner un rectangle plein avec DGIS.

A-1.ASM  :	EstablishPSA
Fonction :	Créer une zone de sauvegarde de paramètres pour un BIOS vidéo
		EGA ou VGA dans laquelle seront situées les images des valeurs
		courantes des registres de palette du contrôleur d'attributs
		et du registre de sur-balayage (overscan).
Appelant :	Microsoft C

A-2.ASM  :	EstablishUPP
Fonction :	Créer une zone de sauvegarde pour une palette-type
		(BIOS vidéo VGA) qui remplacera les valeurs habituelles de
		palette par défaut pour une liste de modes vidéo spécifiés.
Appelant :	Microsoft C

B-1.ASM  :	ScreenDumpCGA
Fonction :	Dump d'écran pour CGA 640x200 2 couleurs et 320x200 4 couleurs.
Appelant :	(non défini)

B-2.ASM  :	ScreenDumpEGA
Fonction :	Dump d'écran pour EGA en mode 640x350, 16 couleurs.
Appelant :	(non défini)

B-3.ASM  :	ScreenDumpAlpha
Fonction :	Dump d'écran pour EGA en mode alphanumérique avec une
		résolution de 350 lignes.
Appelant :	(non défini)

C-1.ASM  :	VideoID
Fonction :	Détecte la présence de sous-systèmes vidéo variés et
		des moniteurs associés.
Appelant :	Microsoft C


1-3.C   : Programme C basé sur SetVmode().

1-4.C   : Programme C basé sur GetVmode().

1-5.C   : Utilisation de la fonction du C Microsoft int86().

6-1.C   : Tracé d'une droite à partir de son équation.

6-2.C   : Implémentation en langage de haut niveau de l'algorithme de Bresenham.

6-3.C   : Programme traçant des horizontales.

6-11.C  : Implémentation en langage C de l'algorithme de Cohen-Sutherland.

7-1.C   : Tracé d'une ellipse à partir de son équation.

7-2.C   : Implémentation en langage C de l'algorithme du point médian.

7-3.C   : Version modifiée de Set4Pixels évitant d'écrire 2X le même pixel.

7-5.C   : Mise à l'échelle des coordonnées pour afficher un cercle en 640x350.

8-1.C   : Remplissage d'un rectangle avec des horizontales.

8-2.C   : Remplissage récursif simple (risque de "stack overflow").

8-3.C   : Programme de remplissage par des droites adjacentes.

8-4.C   : Programme de remplissage de région par suivi de contour.

10-2B.C : Appel de CGenRead1 à partir d'un programme en langage C.

10-3B.C : Appel de CGenRead2 à partir d'un programme en langage C.

10-15.C : Création d'une fenêtre pseudo-graphique "mosaïque" avec l'EGA/VGA.

10-16.C : Fonction SetPixel() pour y modifier la valeur des pixels via MCGA.

11-5.C  : Application d'un opérateur XOR à un cercle dans le buffer vidéo.

11-6.C  : Application d'un opérateur XOR à un rectangle dans le buffer vidéo.

11-7.C  : Application d'un opérateur XOR à une droite dans le buffer vidéo.

12-2.C  : Utilisation d'une interruption "verticale" dans un programme C.

12-5.C  : Programme pour effectuer un panoramique en douceur avec une EGA/VGA.

12-6B.C : Création d'un mode alphanumérique 160x102.

12-9B.C : Utilisation de GetLightPen() dans un programme C.

13-?B.* : Appel de SetPixel() à partir d'un programme C/FORTRAN/TP v.3/BASICA.

13-6.C  : Tracer un rectangle plein en C.

13-8.C  : Utilisation de Windows 1.03 (MS) pour dessiner un rectangle plein.

C-2.C   : Appel de VideoID à partir d'un programme C.

DEMO.*  : Programme C, projet et fichier MAKE de la démo.



Remarque : le livre cite un article qui est joint à l'archive. On y trouvera un
algorithme pour tracer des ellipses dont les axes ne sont pas parallèles à x&y.

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
Vorro
Sujet du message : Re: [propose]DOS : Disquette de l'ouvrage « Guide Microsoft de la programmation des cartes graphiques »
Publié : 04 août 2019 13:05
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 2423
Inscription : 20 juin 2006 22:54
PC Rétro : Compaq Contura Aero 4/33C !
 
Pourquoi pas ? Accepté !

_________________

[ img ]
:!: :arrow: :arrow: :arrow: Téléversez vos fichiers sur NWServeur (service fourni par Atnode)


Haut
Profil Citer
gm86
Sujet du message : Re: [propose]DOS : Disquette de l'ouvrage « Guide Microsoft de la programmation des cartes graphiques »
Publié : 06 août 2019 16:59
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 630
Inscription : 01 sept. 2008 19:07
 
On peut l'ajouter à la section « Documentations et tutoriels » comme ma précédente disquette. Elle aussi traite de programmation et accompagnait un livre.

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
gm86
Sujet du message : Re: [propose]DOS : Disquette de l'ouvrage « Guide Microsoft de la programmation des cartes graphiques »
Publié : 15 oct. 2019 12:02
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 630
Inscription : 01 sept. 2008 19:07
 
J'avais honteusement gardé l'image au chaud pendant des années. Vu qu'il y eut récemment le scan d'ouvrages ASM, je me suis dit qu'il y avait un intérêt pour les routines graphiques ici. Je me suis alors attelé à rechercher la documentation citée par le livre, puis à reprendre la description des fichiers de la disquette. La seule excuse que j'ai d'avoir tardé est de lier travail en déplacement et autres activités culturelles (sciences, randos, bricoles, apéros).

Petit effort en vain : tiré et oublié (comme les missiles).
Dois-je remettre l'image en ligne ?

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
Nintenloup
Sujet du message : Re: [propose]DOS : Disquette de l'ouvrage « Guide Microsoft de la programmation des cartes graphiques »
Publié : 15 oct. 2019 19:30
Modérateur
Avatar de l’utilisateur
En ligne
 
Messages : 2478
Inscription : 06 janv. 2013 05:02
PC Rétro : Tandy 1000 SX, V20, 640k, SB2.0, CGA/TGA, rll 33mo
 
Ah mais nous sommes intéressés par tout ici, c'est juste que l'assemblage ne regroupe pas des masses de gens :lol:

_________________

L’homme est un loup pour l’homme, ce qui, vous en conviendrez, n’est pas très gentil pour le loup.

Ma chaîne youtube française sur les vieux ordinateurs et autres vieilles technologies.


Haut
Profil Citer
gm86
Sujet du message : Re: [propose]DOS : Disquette de l'ouvrage « Guide Microsoft de la programmation des cartes graphiques »
Publié : 16 févr. 2020 21:27
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 630
Inscription : 01 sept. 2008 19:07
 
Dans ce cas, ne la perdez pas : lien auto-destructible.

Note : le programme d'interruption verticale s'attend à ce qu'on assigne l'IRQ 2 à la carte EGA/VGA (IRQ9 par redirection sur le PC/AT).


Dimanche 9 février 2000

J'ai corrigé le listing 12-1 en rapport avec cette interruption verticale. Comme dit dans l'ouvrage PC Graphics Handbook, il faut que le handler soit non-réentrant. Dorénavant, l'ISR ne doit plus planter.

D'ailleurs, il y a deux méthodes pour utiliser l'interruption verticale sur notre matériel moderne :
- forcer le port PCI sur l'IRQ 9 (les anciens BIOS partagent le premier port avec l'AGP) si aucune carte ISA PnP ne l'exploite (MIDI par ex.) ;
- modifier le listing pour exploiter l'IRQ selon qu'elle est 8 ou 16 bits.
Bien sûr, on suppose que la carte vidéo gère l'IRQ ou que le BIOS lui en attribue une (le programme ne marche qu'en mode DOS).


Le dimanche d'après

J'ai ajouté un listing corrigé. Je vous propose donc une nouvelle archive à la place. 12-1.ASM est adaptable à présent :
	TITLE	'Listing 12.1'
	NAME	VREGA
	PAGE	55,132

;
; Nom :	VREGA
;
; Fonction:	Routine d'interruption verticale pour EGA et VGA
;
; Appelant:	Microsoft C:
;
;		int EnableISR0A ();	/* retourne 0 si bien installée */
;
;		void DisableISR0A ();
;

; Une carte VGA PnP peut se voir attribuer une ligne IRQ autre que 2/9 :
IRQ		EQU	2	; le PC/AT redirige la ligne IRQ2 sur 9.

if IRQ lt 2 or IRQ eq 6 or IRQ eq 8 or IRQ eq 13	; PIT/KBD/FDC/RTC/FPU
if1
%out Ligne IRQ réservée !
%out Assemblage interromptu.
endif
else

CRT_MODE	EQU	49h	; adresses de la zone des informations
ADDR_6845	EQU	63h	;   vidéo du BIOS

DGROUP	GROUP	_DATA

_TEXT	SEGMENT	byte public 'CODE'
	ASSUME	cs:_TEXT,ds:DGROUP

ISR0A	PROC	far	; handler d'interruption pour l'INT 0Ah

	push	ax	; préservation registres
	push	dx
	push	ds

	mov	ax,seg DGROUP
	mov	ds,ax	; DS -> DGROUP
if IRQ ge 8 and IRQ ne 9
	mov	al,20h
	out	0A0h,al	; EOI au PIC esclave du PC/AT
endif

; Voir si c'est bien une interruption verticale

	mov	dx,3C2h	; DX := port d'E/S pour le
			;   registre 0 d'état des entrées
	in	al,dx
	test	al,80h	; tester le bit 7 du reg. d'état
	jnz	L10	; saut si interruption verticale

; Ce n'est pas une interruption verticale. On chaîne donc le traitement
;   vers l'ancien handler

if IRQ lt 8 and IRQ ne 2
	mov	al,20h
	out	20h,al	; EOI au PIC maître du PC/AT
endif
	pushf		; simuler une INT
	call    ds:PrevISR0A    ;  vers l'ancien handler de l'Int 0Ah
	jmp	short Lexit

; Traiter une interruption verticale

L10:	mov	dx,Port3x4	; DX := 3B4h or 3D4h

	in	al,dx	; AL := valeur du reg. adresse du CRTC
	push	ax	; la sauvegarder

	mov	ax,DefaultVREnd	; AH := valeur par défaut pour reg. VR End
			; AL := 11h (numéro du registre)
	and	ah,11101111b	; AH bit 4 := 0 (RAZ latch d'interruption)
	out	dx,ax	; modifier le registre VR End
	jmp	$+2	; laisser un peu de temps au CRTC
	sti		; activer les interruptions

; Faire quelque chose d'utile...

	inc	word ptr _VRcount	; incrémenter un compteur

; Envoyer un signal de fin d'interruption au PIC Intel 8259A pour 
;   autoriser les interruptions sur IRQ2 suivantes

	cli		; désactiver les interruptions
	mov	al,20h	; port du 8259A
	out	20h,al	; envoyer un EOI non spécifique au 8259A
	jmp	$+2	; attendre sa réponse

; Permettre au CRTC de produire d'autres interruptions

	mov	ax,DefaultVREnd	; AH := valeur par défaut pour le reg. VR End
			; AL := 11h (numéro du registre)
	and	ah,11011111b	; AH bit 5 := 0 (autoriser int. verticale)
	or	ah,00010000b	; AH bit 4 := 1 (activer le latch
	out	dx,ax	;   d'interruption)
	jmp	$+2

	pop	ax
	out	dx,al	; restaurer précédente adresse registre

Lexit:	pop	ds	; restauration registres et retour
	pop	dx
	pop	ax
	iret

ISR0A	ENDP


;
; EnableISR0A -- Activer un handler d'Interruption
;
		PUBLIC	_EnableISR0A
_EnableISR0A	PROC	near

	push	bp	; préservation registres
	mov	bp,sp
	push	si
	push	di

	mov	ax,40h
	mov	es,ax	; ES -> zone des infos vidéo du BIOS

; Sauver les valeurs des registres du CRTC

	mov	dx,es:[ADDR_6845]	; DX := adresse du port CRTC
	mov	Port3x4,dx	; sauvegarder l'adresse

	mov	ax,1A00h	; AH := 1AH (numéro fonction INT 10H)
			; AL := 0 (lire combinaison d'affichage)
	int	10h	; AL := 1AH si fonction 1AH supportée
			; BL := sous-système vidéo actif
	cmp	al,1Ah
	jne	L20	; saut si pas VGA

	cmp	bl,7
	je	L21	; saut si VGA

	cmp	bl,8
	je	L21	; saut si VGA

	mov	ax,0FFFFh	; renvoyer 0FFFFh si ni EGA ni VGA
	jmp	short L23

; Obtenir la valeur par défaut pour le registre EGA Vertical Retrace End

L20:	mov	al,es:[CRT_MODE]  ; AL := numéro du mode video du BIOS
	mov	bx,offset DGROUP:EGADefaultVals
	xlat			; AL := valeur par défaut pour le reg. VR End
	jmp	short L22
 
; Obtenir la valeur par défaut pour le registre VGA Vertical Retrace End

L21:	mov	al,VREndReg	; AL := numéro du registre VR End
	out	dx,al
	inc	dx		; DX := 3B5H or 3D5H
	in	al,dx		; AL := valeur courante de ce registre

L22:	mov	VREndValue,al	; la sauvegarder

; Sauvegarder l'ancien vecteur d'interruption 0Ah

if IRQ eq 9
	mov	ax,350Ah	; AH := 35H (numéro de la fonction INT 21h)
				; AL := 0AH (numéro de l'interruption)
else
if IRQ ge 8
	mov	ax,3570h+IRQ-8
else
	mov	ax,3508h+IRQ
endif
endif
	int	21h		; ES:BX := précédent vecteur de l'Int 0AH

	mov	word ptr PrevISR0A,bx
	mov	word ptr PrevISR0A+2,es	; le sauvegarder

; Modifier le vecteur d'interruption avec l'adresse du présent handler

	push	ds		; préserver DS
	mov	dx,offset ISR0A
	push	cs
	pop	ds		; DS:DX -> ISR0A
if IRQ eq 9
	mov	ax,250Ah	; AH := 25H (numéro de fonction de l'Int 21H)
				; AL := 0AH (numéro interruption)
else
if IRQ ge 8
	mov	ax,2570h+IRQ-8
else
	mov	ax,2508h+IRQ
endif
endif
	int	21h		; modifier le vecteur d'interruption Int 0AH
	pop	ds		; restaurer DS

; Réactiver IRQ2 en mettant à 0 le bit 2 du registre de masque du 8259A

	cli			; verrouiller les interruptions
if IRQ eq 9
	mov	dx,21h		; DX := registre de masque du 8259A
	in	al,dx		; AL := valeur présente
	and	al,11111011b	; RAZ bit 2
else
if IRQ ge 8
	mov	dx,0A1h
	in	al,dx
	and	al,not(1 shl (IRQ-8))
else
	mov	dx,21h
	in	al,dx
	and	al,not(1 shl IRQ)
endif
endif
	out	dx,al

; Réactiver les interruptions verticales

	mov	dx,Port3x4	; DX := 3B4H or 3D4H
	mov	ax,DefaultVREnd

	and	ah,11001111b
	out	dx,ax		; RAZ bits 4 et 5 du registre VR End
	jmp	$+2		; laisser le temps au CRTC
	or	ah,00010000b
	out	dx,ax		; mise à 1 du bit 4
	jmp	$+2
	sti			; réactiver les interruptions

	xor	ax,ax		; AX := 0 (valeur de retour)

L23:	pop	di		; restauration registres et retour
	pop	si
	mov	sp,bp
	pop	bp
	ret

_EnableISR0A	ENDP


;
; DisableISR0A -- Désactiver le handler d'interruptions verticales
;
	PUBLIC	_DisableISR0A
_DisableISR0A	PROC	near

	push	bp
	mov	bp,sp
	push	si
	push	di
	push	ds

; Désactiver les interruptions verticales

	cli			; verrouiller les interruptions
	mov	dx,Port3x4
	mov	ax,DefaultVREnd
	out	dx,ax		; restaurer le reg. Vertical Retrace End
	jmp	$+2
	sti			; réactiver les interruptions

; Restaurer le précédent handler du vecteur d'interruption 0Ah

	lds	dx,PrevISR0A	; DS:DX := précédent vecteur Int 0AH
if IRQ eq 9
	mov	ax,250Ah	; AH := 25H (numéro fonction INT 21H)
				; AL := 0AH (numéro interruption)
else
if IRQ ge 8
	mov	ax,2570h+IRQ-8
else
	mov	ax,2508h+IRQ
endif
endif
	int	21h

	pop	ds		; restauration registres et retour
	pop	di
	pop	si
	mov	sp,bp
	pop	bp
	ret

_DisableISR0A	ENDP

_TEXT	ENDS


_DATA	SEGMENT	word public 'DATA'

	EXTRN	_VRcount:word	; déclaré dans le pgm C qui appelle

PrevISR0A	DD	?	; zone de sauvegarde pour l'ancien 
				;   vecteur d'interruption 0Ah
Port3x4		DW	?	; 3B4h ou 3D4h

DefaultVREnd	LABEL	word
VREndReg	DB	11h	; numéro registre Vertical Retrace End
VREndValue	DB	?	; valeur par défaut pour reg.VR End

EGADefaultVals	DB	2Bh,2Bh,2Bh,2Bh,24h,24h,23h,2Eh	; valeur par défaut
		DB	00h,00h,00h,00h,00h,24h,23h,2Eh ;   pour registre EGA
		DB	2Bh				;   EGA VR End

_DATA	ENDS

endif

	END


Jeudi 20

Petite modification du fichier 12-2.C pour éviter le retour à la ligne en mode 40 caractères :
/* Listing 12.2 */

int VRcount = 0;	/* compteur d'interruptions verticales */

void main ()
{
  if (EnableISR0A ())
  {
    printf ("\nImpossible d'activer le handler d'interruptions verticales\n");
    exit (1);
  }

  while (VRcount < 600)
  printf ("\015Nombre d'interruptions verticales : %d", VRcount);

  DisableISR0A ();
}


Voici une procédure pour quiconque puisse tester :
  • Installer QuickC 2.51 (with QuickAssembler).
  • Sélectionner comme courant le répertoire contenant les fichiers 12-2.C et 12-1.ASM ensemble.
  • Taper c:\qc25\bin\new-vars et lancer c:\qc25\bin\qc 12-1.asm via l'invite de commande DOS.
  • Modifier, si nécessaire, la ligne IRQ affichée avec le numéro qu'attribue le BIOS à la carte VGA (display adapter).
  • Activer Options/Full Menus.
  • Choisir Make/Set Program List.
  • Entrer VREGA, puis confirmer par Yes.
  • Choisir 12-1.ASM dans File List puis entrer 12-2.C dans File Name.
  • Enregister avec Save List.
  • Confirmer l'enregistrement de 12-1.ASM par Yes.
  • Choisir Make/Build Program pour compiler 12-2.C, assembler 12-1.ASM et les lier.
  • Hors Windows, lancer l'exécutable VREGA.EXE obtenu.
  • Ne pas interromptre par ^C ou Break !
Samedi 29

Ajout du 13ème point portant malheur à la stabilité du système...
Le programme désinhibe puis réinhibe les interruptions avant l'envoi d'un EOI au PIC (maître sur PC/AT).

Vendredi 20 mars

Ne soyez pas trop cons d'assembler avec la première version d'ASM ou MASM d'IBM : la pseudo-opérateur SHL sera plus qu'une pseudo-instruction avec mon code...

Dernière remontée par gm86 le 16 févr. 2020 21:27.

_________________

C:\ONGRTLNS.W95


Haut
Profil
Afficher : Trier par : Ordre :
Répondre   Page 1 sur 1  [ 6 messages ]
Revenir à « Contributions »
Aller :