home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / ports / modexlib.asm < prev    next >
Assembly Source File  |  1994-10-28  |  15KB  |  431 lines

  1. .286
  2.   w equ word ptr
  3.   b equ byte ptr
  4. data segment public
  5.   extrn vscreen:dword
  6.   extrn vpage:word
  7.   extrn palette:dataptr
  8. data ends
  9.  
  10.  
  11. code segment public
  12. assume cs:code,ds:data
  13. public init_modex, p13_2_modex, squeeze, copyscreen, double
  14. public clrx, split, setpal, getpal, switch, setstart, enter400
  15. public waitretrace, fade_out, fade_to, copy_block, pal_rot
  16.  
  17. switch proc far                 ;bascule entre les deux pages d'écran
  18.   mov bx,vpage                  ;charger adresse de départ
  19.   mov dx,3d4h
  20.   mov al,0ch                    ;partager entre le régistre CRTC 0dh/0ch
  21.   mov ah,bh
  22.   out dx,ax                     ;positionner Highbyte  (régistre 0dh)
  23.   inc al
  24.   mov ah,bl
  25.   out dx,ax                     ;positionner lowbyte (Register 0ch)
  26.   cmp bx,16000d                 ;bascule adresse de départ (0/16000)
  27.   je setze0
  28.   mov vpage,16000
  29.   ret
  30. setze0:
  31.   mov vpage,0
  32.   ret
  33. switch endp
  34.  
  35. Init_ModeX proc pascal far      ;active mode X 
  36.   mov ax,0013h                  ;positionne mode 13h 
  37.   int 10h
  38.  
  39.   mov dx,3c4h                   ;Timing Sequenzer
  40.   mov al,4                      ;régistre 4 (Memory Mode):
  41.   out dx,al                     ;effacer bit 3 -> Chain4 hors service 
  42.   inc dx
  43.   in al,dx
  44.   and al,0f7h
  45.   or al,4h                      ;positionne Bit 2 -> Odd/Even Mode hors service
  46.   out dx,al
  47.   dec dx
  48.  
  49.   mov ax,0f02h                  ;régistre 2 (Write Plane Mask):
  50.   out dx,ax                     ;0fh: tous les Planes lors de l'écriture en service
  51.   mov ax,0a000h                 ;effacer mémoire écran
  52.   mov es,ax
  53.   xor di,di
  54.   xor ax,ax
  55.   mov cx,0ffffh
  56.   cld
  57.   rep stosw
  58.  
  59.   mov dx,3d4h                   ;CRTC
  60.   mov al,14h                    ;régistre 14h  (Underline Row Adress):
  61.   out dx,al
  62.   inc dx
  63.   in al,dx                      ;effacer Bit 6  -> Doubleword adress. hors service
  64.   and al,0bfh
  65.   out dx,al
  66.   dec dx
  67.   mov al,17h                    ;Register 17h (CRTC Mode):
  68.   out dx,al                     ;positionner Bit 6 -> Byte Mode en service
  69.   inc dx
  70.   in al,dx
  71.   or al,40h
  72.   out dx,al
  73.   ret
  74. Endp
  75.  
  76. Enter400 proc pascal far        ;active le mode X (200 lignes)
  77.   mov dx,3d4h                   ;et l'étend sur 400 ligness
  78.   mov al,9                      ;Registre 9 de CRTC (Maximum Row Adress)
  79.   out dx,al                     ;sélectionne le registre
  80.   inc dx                        ;Lit le contenu
  81.   in al,dx
  82.   and al,01110000b              ;Met à 0 les bits 7 et 3
  83.   out dx,al                     ;renvoie la nouvelle valeur
  84.   ret
  85. Enter400 endp
  86.  
  87. plan_l: db 0
  88. plan_pos: dw 0
  89.  
  90. p13_2_modex proc pascal far start,pic_size:word
  91.     mov dx,03ceh                ;fixe Write Mode 0 
  92.     mov ax,4005h                ;sous le registre GDC 5 (GDC Mode)
  93.     out dx,ax
  94.  
  95.     mov b plan_l,1             ;mémorise le masque de plan
  96.     push ds
  97.     lds si,dword ptr ds:vscreen ;charge l'adresse source
  98.     mov w plan_pos,si          ;et la sauvegarde
  99.     mov ax,0a000h               ;fixe l'adresse de destination
  100.     mov es,ax
  101.     mov di,start
  102.     mov cx,pic_size             ;lit le nombre de pixels
  103. @lpplan:
  104.     mov al,02h                  ;dans le Registre 2 du TS (Write Plane Mask)
  105.     mov ah,b plan_l            ;masque le plan
  106.     mov dx,3c4h
  107.     out dx,ax
  108.  
  109.   @lp1:
  110.     movsb                       ;copie un byte
  111.     add si,3                    ;prochain byte source
  112.     loop @lp1
  113.  
  114.     mov di,start                ;relit l'adresse de destination
  115.     inc w plan_pos             ;nouvelle adresse source
  116.     mov si,w plan_pos
  117.     mov cx,pic_size             ;lit la taille
  118.     shl b plan_l,1             ;masque le plan suivant
  119.     cmp b plan_l,10h           ;les 4 plans sont copiés ?
  120.     jne @lpplan
  121.  
  122.     pop ds
  123.     ret
  124. Endp
  125.  
  126. Split proc pascal far row:byte  ;fractionne l'écran à la ligne row
  127.   mov bl,row
  128.   xor bh,bh
  129.   shl bx,1                      ;*2 à cause du dédoublement des lignes
  130.   mov cx,bx
  131.  
  132.   mov dx,3d4h                   ;CRTC
  133.   mov al,07h                    ;Registre 7 (Overflow low)
  134.   out dx,al
  135.   inc dx
  136.   in al,dx
  137.   and al,11101111b              ;met le Bit 8 de la ligne dans le bit 4
  138.   shr cx,4
  139.   and cl,16
  140.   or al,cl
  141.   out dx,al                     ;écriture
  142.  
  143.   dec dx
  144.   mov al,09h                    ;Registre 9 (Maximum Row Adress)
  145.   out dx,al
  146.   inc dx
  147.   in al,dx
  148.   and al,10111111b              ;charge le bit 6 avec le bit 9 de la ligne
  149.   shr bl,3
  150.   and bl,64
  151.   or al,bl
  152.   out dx,al                     ;écriture
  153.  
  154.   dec dx
  155.   mov al,18h                    ;Registre 18h (Line Compare/Split Screen)
  156.   mov ah,row                    ;fixe les 8 autres bits
  157.   shl ah,1
  158.   out dx,ax                     
  159.   ret
  160. Endp
  161.  
  162. SetStart proc pascal far t:word ;démarre l'écran à l'adresse indiqué
  163.   mov dx,3d4h                   ;CRTC
  164.   mov al,0ch                    ;régistre 0ch(Linear Starting Adress Middle)
  165.   mov ah,byte ptr t + 1         ;positionner bits 15:8
  166.   out dx,ax                     ;régistre 0dh(LSA Low)
  167.   mov al,0dh                    ;positionner bits 7:0 
  168.   mov ah,byte ptr t
  169.   out dx,ax
  170.   ret
  171. Endp
  172. WaitRetrace proc pascal far
  173.   mov dx,3dah                   ;régistre Input Status 1
  174. @wait1:
  175.   in al,dx                      ;Bit3 = 0 si le rayon est en train de
  176.   test al,08h                   ;dessiner l'image de l'écran
  177.   jnz @wait1
  178. @wait2:
  179.   in al,dx                      ;Bit3 = 1 si le rayon est en retour de 
  180.   test al,08h                   ;balayage
  181.   jz @wait2
  182.   ret                           ;le rayon est en bas de l'écran
  183. Endp
  184.  
  185. public squeeze
  186. squeeze proc pascal far         ;compose un écran à partir de deux moitiés
  187.   mov si,200*80                 ;première adresse de début
  188.   mov di,199                    ;première valeur de la ligne de fractionnement
  189. sqlp:                           ;boucle principale
  190.   call waitretrace              ;attend le retour de balayage
  191.   call split pascal, di         ;crée la moitié inférieure par fractionnement
  192.   call setstart pascal, si      ;crée la moitié supérieure par défilement
  193.   sub si,80                     ;une ligne vers le bas
  194.   dec di                        ;diminue la ligne de fractionnement
  195.   cmp di,99d                    ;ce qui remonte la moitié inférieure
  196.   jae sqlp                      ;fini ?
  197.   ret
  198. squeeze endp
  199.  
  200. clrx proc pascal far pmask:byte ;efface Mode X - pages
  201.   mov al,02h
  202.   mov ah,pmask
  203.   mov dx,3c4h
  204.   out dx,ax
  205.   mov ax,0a000h                 ;adresse de départ et longueur
  206.   mov es,ax
  207.   mov di,vpage
  208.   xor ax,ax
  209.   mov cx,8000
  210.   rep  stosw                    ;et effacer
  211.   ret
  212. clrx endp
  213. copyscreen proc pascal far ziel,quelle:word
  214.   mov dx,3c4h                                                                           ;alle Planes selektieren
  215.   mov ax,0f02h
  216.   out dx,ax
  217.   mov dx,3ceh                   ;Write-Mode 1 (copier)
  218.   mov ax,4105h
  219.   out dx,ax
  220.  
  221.   push ds
  222.   mov ax,0a000h                                                                 ;Quell- und Zielsegment im VGA
  223.   mov es,ax
  224.   mov ds,ax
  225.   mov si,quelle                 ;charger source et offset cible
  226.   mov di,ziel
  227.   mov cx,16000d                 ;copier 16000 Byte (=64000 Pixel) 
  228.   rep movsb
  229.   pop ds
  230.   mov dx,3ceh                   ;Write-Mode 0
  231.   mov ax,4005h
  232.   out dx,ax
  233.   ret
  234. copyscreen endp
  235. SetPal proc pascal far
  236.   push si
  237.   mov si,offset palette         ;chercher adresse
  238.   mov cx,256*3                  ;chercher nombre de couleurs
  239.   xor al,al
  240.   mov dx,03c8h                  ;Palette externe de la RAM, Pixel Write Adress
  241.   out dx,al                     ;positionner couleur 0 
  242.   inc dx                        ;Pixel Color Value
  243.  
  244.   rep outsb                     ;envoier tous les couleurs à la VGA
  245.   pop si
  246.   ret
  247. Endp
  248.  
  249. getpal proc pascal far
  250.   push di
  251.   mov di,offset palette         ;chercher Adresse
  252.   mov cx,256*3                  ;chercher nombre de couleurs
  253.   xor al,al
  254.   mov dx,03c7h                  ;palette externe RAM, Pixel Read Adress
  255.   out dx,al                     ;lire à partir de la couleur 0
  256.   mov dx,3c9h                   ;Pixel Color Value
  257.  
  258.   rep insb                      ;envoier tous les couleurs à la VGA 
  259.   pop di
  260.   ret                             
  261.   Endp
  262.  
  263. double proc pascal far
  264.   mov dx,3d4h                   ;registre 13h du CRTC (Row Offset)
  265.   mov ax,5013h                  ;positionné  à 80 (largeur double)
  266.   out dx,ax                     ;et écriture
  267.   ret
  268. double endp
  269.  
  270.  
  271. fade_out proc pascal far        ;fondu de fermeture, dépend du mode vidéo
  272. local maxcoul:word              ;couleur de valeur maximale
  273.   mov maxcoul,63
  274.   mov ax,ds                     ;charge le segment de segmentation
  275.   mov es,ax
  276. main_loop:                      ;boucle principale parcourue une fois par image
  277.   lea si,palette                ;source et destination sur palette
  278.   mov di,si
  279.   mov cx,768                    ;768 octets à modifier
  280. lp:
  281.   lodsb                         ;lit une couleur
  282.   dec al                        ;la décrémente
  283.   jns fixe                      ;si pas encore négative, la réinstalle
  284.   xor al,al                     ;sinon 0
  285. fixe:
  286.   stosb                         ;écrit la couleur
  287.  
  288.   dec cx                        ;compteur d'itérations
  289.   jne lp
  290.  
  291.   call waitretrace              ;synchronisation
  292.   call setpal                   ;prend en compte la palette calculée
  293.   dec maxcoul                   ;décrémente la boucle extérieure
  294.   jne main_loop                 ;Pas fini ? on continue
  295.  
  296.   ret
  297. fade_out endp
  298.  
  299.  
  300. fade_to proc pascal far destpal:dword, longueur:word, pas:byte
  301. ;transforme progressivement la palette "Palette" en "DestPal" transmis 
  302. ;par Pascal comme Array of Byte 
  303. local maxcoul:word
  304.   mov ax,63                     ;calcule le nombre d'itérations nécessaires
  305.   div pas                       ;pour atteindre 63
  306.   xor ah,ah
  307.   mov maxcoul,ax                ;mémorise le nombre d'itérations
  308. next_frame:
  309.   les di,destpal                ;cherche l'offset, Pascal transmet les tableaux en mode far
  310.   lea si,palette                ;cherche l'offset de "Palette"
  311.   mov cx,768                    ;768 octets à traiter
  312.  
  313. suite:
  314.   mov al,[si]                   ;lit une palette dans la palette courante
  315.   mov ah,[di]                   ;lit la couleur de destpal
  316.  
  317.   mov bl,ah
  318.   sub bl,al                     ;différence de plus
  319.   cmp bl,pas                    ;d'un pas ?
  320.   jg plus                       ;-> décrémente
  321.   neg bl                        ;Différence de plus d'un pas
  322.   cmp bl,pas                    ;en négatif ?
  323.   jg moins
  324.  
  325.   mov al,ah                     ;destination atteinte, on fixe la couleur
  326.  
  327. ecrire:
  328.   dec cx                        ;décrémente boucle des couleurs
  329.   je fini                       ;0 ? -> fini
  330.   mov [si],al                   ;écrit la couleur dans la palette
  331.   inc si                        ;couleur suivante
  332.   inc di
  333.   jmp suite                     ;on continue
  334. moins:
  335.   sub al,pas                    ;décrémentation
  336.   jmp ecrire
  337. plus:
  338.   add al,pas                    ;incrémentation
  339.   jmp ecrire
  340. fini:                           ;palette calculé
  341.   call waitretrace              ;synchronisation
  342.   call setpal                   ;réalise la palette 
  343.   dec maxcoul                   ;a-t-on fait 63 itérations  ?
  344.   jne next_frame                ;non -> suite
  345.  
  346.   ret
  347. fade_to endp
  348.  
  349. copy_block proc pascal far destination,source,largeur,hauteur:word
  350. local interligne:word
  351.   mov dx,3ceh                   ;GDC
  352.   mov ax,4105h                  ;Mode de lecture 0, Mode d'écriture 1
  353.   out dx,ax                     ;émis sur le registre 5 : GDC Mode
  354.   mov dx,3c4h                   ;TS
  355.   mov ax,0f02h                  ;active tous les plans
  356.   out dx,ax                     ;émis sur le registre 2 : Write Plane Mask
  357.  
  358.   push ds
  359.   mov ax,0a000h                 ;copier à l'intérieur de VGA
  360.   mov es,ax                     ;-> les deux segments à 0a000h
  361.   mov ds,ax
  362.   mov si,source                 ;données d'origine
  363.   mov di,destination            ;copiée en destination
  364.   mov dx,hauteur                ;copie "hauteur" ligne
  365.  
  366.   mov ax,80                     ;calcul l'intervalle entre deux lignes
  367.   sub ax,largeur                ;(= 80-largeur)
  368.   mov interligne,ax
  369.  
  370. line_lp:
  371.   mov cx,largeur                ;charge la largeur
  372.   rep movsb                     ;copie une ligne
  373.   add si,interligne
  374.   add di,interligne
  375.  
  376.   dec dx                        ;compteur de lignes
  377.   jne line_lp
  378.  
  379.   pop ds
  380.   ret
  381. copy_block endp
  382.  
  383. Pal_Rot proc pascal far Start,Ende:Word
  384. ;effectue une rotation sur une partie de la palette de Debut à Fin 
  385. ;avec décalage de 1
  386. ;si Debut < Fin : Rotation vers le bas
  387. ;si Debut > Fin : Rotation vers le haut
  388.  
  389.   mov ax,ds                     ;es doit pointer sur le segment de données
  390.   mov es,ax
  391.  
  392.   lea si,palette                ;charge l'offset de la palette
  393.   mov di,si                     ;en si et di
  394.  
  395.   mov ax,3                      ;"convertit Début en offset de palette
  396.   mul start
  397.   add si,ax                     ;ajoute à si
  398.   mov ax,3                      ;la même chose pour la fin
  399.   mul ende
  400.   add di,ax                     ;ajoute à di
  401.  
  402.   mov bx,[si]                   ;sauvegarde les octets de la couleur du début
  403.   mov dl,[si+2]
  404.  
  405.   mov cx,di                     ;la différence entre Debut et Fin
  406.   sub cx,si                     ;donne le nombre d'octets à copier
  407.  
  408.   mov di,si                     ;couleur de début comme offset de destination
  409.   add si,3                      ;une couleur plus loin comme offset source
  410.                 ;prêt pour la copie
  411.   cld                           ;a priori copie vers l'avant
  412.   or cx,cx                      ;si cx négatif (Debut > Fin)
  413.   jns enavant
  414.   std                           ;alors copir vers l'arrière
  415.   neg cx                        ;on corrige cx
  416.   sub si,4                      ;si sur le 2ème octet de l'avant dernière couleur
  417.   add di,2                      ;di sur le 2ème octet de la dernière couleur
  418.   add cx,2                      ;copie 2 octets supplémentaires
  419. enavant:                        ;pour que, après la boucle de copie, la position soit correcte
  420.  
  421.   rep movsb                     ;copie les couleurs
  422.   mov [di],bx                   ;les octets de l'ancienne couleur de Debut
  423.   mov [di+2],dl                 ;deviennent la dernière couleur
  424.  
  425.   cld                           ;remet à 0 l'indicateur de direction
  426.   ret
  427. Pal_Rot Endp
  428.  
  429. code ends
  430. end
  431.