; Routines Assembleur appelables depuis C en modèles tiny/small/medium ; pour: ; * Initialiser le mode 360x480 en 256 couleurs du VGA ; * Afficher un point dans le mode 360x480 en 256 couleurs du VGA ; * Lire la couleur d'un point dans le mode 360x480 en 256 couleurs du VGA ; ; Assemblé avec TASM 4.0 ; Testé avec Jim Mischel 11/21/94 ; ; Le code et les paramètres d'initalisation du mode 360x480 en 256 couleurs sont ; de John Bridges, qui les a mis dans le domaine public . ; VGA_SEGMENT equ 0a000h ;segment de la mémoire vidéo SC_INDEX equ 3c4h ;registre Index Sequence Controller GC_INDEX equ 3ceh ;registre Index Graphics Controller MAP_MASK equ 2 ;index du registre Map Mask dans SC READ_MAP equ 4 ;index du registre Read Map dans GC SCREEN_WIDTH equ 360 ;nombre de pixel à travers l'écran WORD_OUTS_OK equ 1 ;à 0 pour assembler les ; ordinateurs qui ne peuvent pas traiter les ; les outs de mot dans les registres indexés du VGA ; _DATA segment public byte 'DATA' ; ; Paramètres du registre CRT Controller en mode 360x480 256 couleurs. ; (Avec l'aimable autorisation de John Bridges.) ; vptbl dw 06b00h ; horz total dw 05901h ; horz affiché dw 05a02h ; début d'effacement horz dw 08e03h ; fin d'effacement horz dw 05e04h ; début de h sync dw 08a05h ; fin de h sync dw 00d06h ; vertical total dw 03e07h ; overflow dw 04009h ; hauteur de cellule dw 0ea10h ; début de v sync dw 0ac11h ; fin de v sync dw 0df12h ; vertical affiché dw 02d13h ; offset dw 00014h ; désactive le mode double long dw 0e715h ; début d'effacement v dw 00616h ; fin d'effacement v dw 0e317h ; active le mode octet vpend label word _DATA ends ; ; Macro pour diriger une valeur 16 bits sur un port. ; OUT_WORD macro if WORD_OUTS_OK out dx,ax else out dx,al inc dx xchg ah,al out dx,al dec dx xchg ah,al endif endm ; _TEXT segment byte public 'CODE' assume cs:_TEXT, ds:_DATA ; ; Configure le mode 360x480 en 256 couleurs. ; (Avec l'aimable autorisation de John Bridges.) ; ; Appelable comme suit: void Set360By480Mode() ; ; Retourne: rien ; public _Set360x480Mode _Set360x480Mode proc near push si ;préserve les variables registre C push di mov ax,12h ; commence avec le mode 12h int 10h ; laisse le BIOS effacer la mémoire ; vidéo mov ax,13h ; commence avec le mode 13h standard int 10h ; laisse le BIOS initialiser le mode mov dx,3c4h ; altère les registres Sequencer mov ax,0604h ; désactive la chaîne 4 out dx,ax mov ax,0100h ; réinitialisation synchrone out dx,ax ; imposée mov dx,3c2h ; misc output mov al,0e7h ; sélectionne l'horloge out dx,al ; la re-sélectionne mov dx,3c4h ; séquenceur mov ax,0300h ; réinitialise le lancement out dx,ax ; du séquenceur mov dx,3d4h ; altère les registres crtc mov al,11h ; cr11 out dx,al ; valeur courante inc dx ; pointe sur les données in al,dx ; récupère la valeur cr11 and al,7fh ; passe cr0 -> cr7 out dx,al ; protection d'écriture dec dx ; pointe sur l'index cld mov si,offset vptbl mov cx,((offset vpend)-(offset vptbl)) shr 1 @b: lodsw out dx,ax loop @b pop di ;restaure les variables registre C pop si ret _Set360x480Mode endp ; ; Affiche un pixel dans la couleur spécifiée à l'emplacement ; spécifié dans le mode 360x480 en 256 couleurs. ; ; Call as: void Draw360x480Dot(int X, int Y, int Color) ; ; Retourne: rien ; DParms struc dw ? ;BP empilé dw ? ;adresse de retour DrawX dw ? ;coordonnée X à laquelle afficher DrawY dw ? ;coordonnée Y à laquelle afficher Color dw ? ;couleur dans laquelle afficher (dans ;la plage 0-255 octet supérieur est ignoré) DParms ends ; public _Draw360x480Dot _Draw360x480Dot proc near push bp ;préserve BP de l'appelant mov bp,sp ;pointe sur la stack frame push si ;préserve les variables registre C push di mov ax,VGA_SEGMENT mov es,ax ;pointe sur la mémoire vidéo mov ax,SCREEN_WIDTH/4 ;il y a 4 pixels à chaque adresse, aussi ;chaque rangée de 360 pixels est large ;de 90 octets dans chaque plan mul [bp+DrawY] ;pointe sur le début de la rangée à ; afficher mov di,[bp+DrawX] ;récupère la coordonnée X shr di,1 ;il y a 4 pixels à chaque adresse shr di,1 ; aussi divisons la coordonnée X ;par 4 add di,ax ;pointe sur l'adresse du pixel mov cl,byte ptr [bp+DrawX] ;re-récupère la ;coordonnée X and cl,3 ;récupère le numéro du plan du pixel ; mov ah,1 shl ah,cl ;paramètre le bit correspondant ;au plan ; dans lequel est le pixel mov al,MAP_MASK mov dx,SC_INDEX OUT_WORD ;paramètre l'écriture sur le plan correct ; pour le pixel mov al,byte ptr [bp+Color] ;récupère la couleur stosb ;affiche le pixel pop di ;restaure les variables registre C pop si pop bp ;restaure BP de l'appelant ret _Draw360x480Dot endp ; ; Lit la couleur du pixel à l'emplacement ; spécifié dans le mode 360x480 256 couleurs. ; ; Appelle comme suit: int Read360x480Dot(int X, int Y) ; ; Retourne: la couleur du pixel ; RParms struc dw ? ;BP empilé dw ? ;adresse de retour ReadX dw ? ;coordonnée X à partir de laquelle ;lire ReadY dw ? ;coordonnée Y à partir de laquelle ;lire RParms ends ; public _Read360x480Dot _Read360x480Dot proc near push bp ;préserve BP de l'appelant mov bp,sp ;pointe sur la stack frame push si ;préserve les variables registre C push di mov ax,VGA_SEGMENT mov es,ax ;pointe sur la mémoire vidéo mov ax,SCREEN_WIDTH/4 ;il y a 4 pixels à chaque adresse, aussi ;chaque rangée de 360 pixels est large de 90 octets ;dans chaque plan mul [bp+DrawY] ;pointe sur le début de la rangée ;désirée mov si,[bp+DrawX] ;récupère la coordonnée X shr si,1 ;il y a 4 pixels à chaque adresse shr si,1 ;aussi divisons la coordonnée X ;par 4 add si,ax ;pointe sur l'adresse du pixel mov ah,byte ptr [bp+DrawX] ;re-récupère la coordonnée X and ah,3 ;récupère le numéro du plan du pixel mov al,READ_MAP mov dx,GC_INDEX OUT_WORD ;paramètre la lecture à partir du plan correct ; pour le pixel lods byte ptr es:[si] ;lit le pixel sub ah,ah ;fait la valeur de retour un mot C pop di ;restaure les variables registre C pop si pop bp ;restaure BP de l'appelant ret _Read360x480Dot endp _TEXT ends end