terug.gif
;**********************************************************************;
;*                       D V A 1 6 . I N C                            *;
;*--------------------------------------------------------------------*;
;*    betreft        : verschillende routines voor het werken in      *;
;*                     EGA- en VGA-16 kleuren grafische modi          *;
;*                     Aangepast voor Atom-in-PC terminal v4          *;
;*--------------------------------------------------------------------*;
;*    auteur         : MICHAEL TISCHER                                *;
;*    aanpassingen   : Roland Leurs                                   *;
;*    ontwikkeld op  :  5.12.1990                                     *;
;*    laatste update : 19.01.1999                                     *;
;*--------------------------------------------------------------------*;
;*    assembleren    : Opnemen als include in ATOM.ASM                *;
;**********************************************************************;
;== constanten =========================================================
SC_INDEX       = 3c4h             ;indexregister van sequencer-ctrl.
SC_MAP_MASK    = 2                ;nummer van map-mask-register
SC_MEM_MODE    = 4                ;nummer van memory-mode-register
GC_INDEX       = 3ceh             ;indexregister van graphics-ctrl.
GC_FN_SELECT   = 3                ;nummer van functie-select-reg.
GC_READ_MAP    = 4                ;nummer van read-map-register
GC_GRAPH_MODE  = 5                ;nummer van graphics-mode-register
GC_MISCELL     = 6                ;nummer van miscellaneous-register
GC_BIT_MASK    = 8                ;nummer van bit-mask-register
CRTC_INDEX     = 3d4h             ;indexregister van Crt-controller
CC_MAX_SCAN    = 9                ;nummer van maximum-scan-line-reg.
CC_START_HI    = 0Ch              ;nummer van hi-start-register
CC_UNDERLINE   = 14h              ;nummer van underline-register
CC_MODE_CTRL   = 17h              ;nummer van mode-control-register
DAC_WRITE_ADR  = 3C8h             ;DAC-write-adres
DAC_READ_ADR   = 3C7h             ;DAC-read-adres
DAC_DATA       = 3C9h             ;DAC-gegevensregister
VERT_RETRACE   = 3DAh             ;Input status-register #1
PIXX           = 640              ;horizontale resolutie
;== gegevens ==============================================================
vio_seg    dw 0A000h              ;video-segment met huidige pagina
zbreite    dw 0                   ;breedte van een puntregel in bytes
pageofs    dw 0                   ;page-offset in het segmentadres
dva_x      dw ?                   ;x-coordinaat
dva_y      dw ?                   ;y-coordinaat
dva_k      db ?                   ;pixel kleur
;== programma ===========================================================
dvamode     dw _init320200     ; 320*200    clear 14 / FF00  ega/vga
            dw _init640200     ; 640*200    clear 15 / FF01  ega/vga
            dw _init640350     ; 640*350    clear 16 / FF02  ega/vga
            dw _init640480     ; 640*480    clear 17 / FF03  vga
;-----------------------------------------------------------------------
;-- INIT640350: initialiseert de 640*350 EGA-grafische modus bij 16 kleuren
;-- verklaring: void init640350( void );
_init640350 proc near
           mov   al,10h           ;modus 10h instellen
           mov   cx,28000 / 16      ;page-offset
init16:    mov   bx,640/8         ;regelbreedte
init2:     mov   zbreite,bx       ;regelbreedte opslaan
           mov   pageofs,cx       ;page-offset voor segmentadres vastleggen
           xor   ah,ah            ;functie 00h voor instellen van modus
           int   10h                ;oproepen
           ret                      ;terug naar aanwijzer
_init640350 endp                  ;einde van de procedure
;-----------------------------------------------------------------------
;-- INIT640480: initialiseert de 640*480 VGA-grafische modus bij 16 kleuren
;-- verklaring : void init640480( void );
_init640480 proc near
           mov   al,12h           ;modus 12h  instellen
           ;-- de page-offset is niet van belang, omdat slechts een pagina
           ;-- kan worden weergegeven
           jmp   init16
_init640480 endp                   ;einde van de procedure
;-----------------------------------------------------------------------
;-- INIT640200: initialiseert de 640*200 EGA-grafische modus bij 16 kleuren
;-- Deklaration : void init640200( void );
_init640200 proc near
           mov   al,0Eh           ;modus 0Eh  instellen
           mov   cx,( 64000 / 4 ) / 16 ;page-offset
           jmp   init16
_init640200 endp                   ;einde van de procedure
;-----------------------------------------------------------------------
;-- INIT320200: initialiseert de 320*200 EGA-grafische modus bij 16 kleuren
;-- verklaring: void init320200( void );
_init320200 proc near
           mov   al,0Dh           ;modus 0Dh  instellen
           mov   bx,320/8         ;regelbreedte
           mov   cx,( 32000 / 4 ) / 16 ;page-offset
           jmp   init2
_init320200 endp                   ;einde van de procedure
;-- SETPIX: geeft een punt een bepaalde kleur -------------------------
;-- verklaring  : void setpix( int x, int y, unsigned char kleur );
_setpix    proc near
           mov   dva_x,cx          ;save coordinaten
           mov   dva_y,dx
           mov   dva_k,al          ;save kleur
           push  bx
           push  bp                ;adressering van de parameter over
           mov   bp,sp             ;het BP-register voorbereiden
           ;-- vervolgens offset in video-RAM en shift-waarde berekenen ---
           mov   ax,dva_y         ;Y-co”rdinaat laden
           mov   dx,zbreite       ;met regelbreedte vermenigvuldigen
           mul   dx
           mov   bx,dva_x         ;X-co”rdinaat laden
           mov   cl,bl            ;Lo-Byte voor shift-berekening vastleggen
           shr   bx,1             ;X-co”rdinaat door acht delen 
           shr   bx,1
           shr   bx,1
           add   bx,ax            ;daarbij offset uit vermenigvuldiging opt.
           and   cl,7             ;bit-masker uit X-co”rdinaat berekenen
           xor   cl,7
           mov   ah,1
           shl   ah,cl
           mov   dx,GC_INDEX      ;toegang tot graphics-controller
           mov   al,GC_BIT_MASK   ;bit-masker in het bit-masker-register
           out   dx,ax            ;schrijver
           mov   ax,(02h shl 8) + GC_GRAPH_MODE;Write-modus 2 & Read-
           out   dx,ax                         ;modus 0 instellen
           mov   ax,vio_seg       ;segmentadres van Video-RAM incl. 
           mov   es,ax            ;page na ES
           mov   al,es:[bx]               ;latch-register laden
           mov   al,byte ptr dva_k        ;kleurwaarde voor punt zetten
           mov   es:[bx],al               ;latch-reg. terugschrijven
           ;-- Defaultwaarde in de verschillende registers van graphics-
           ;-- controller die gewijzigd worden instellen 
           mov   ax,(0FFh shl 8 ) + GC_BIT_MASK
           out   dx,ax
           mov   ax,(00h shl 8) + GC_GRAPH_MODE
           out   dx,ax
           pop   bp
           pop   bx
           mov   cx,dva_x         ;herstel coordinaten
           mov   dx,dva_y
           ret                    ;terug naar aanwijzer
_setpix    endp                   ;einde van de procedure
;-- GETPIX: levert de kleur van een punt ----------------------------
_getpix    proc near
           mov   dva_x,cx         ;save coordinaten
           mov   dva_y,dx
           push  bp               ;adressering van de parameter over
           mov   bp,sp            ;het BP-register voorbereiden
           push  si
           push  bx
           ;-- vervolgens offset in video-RAM en shift-waarde berekenen --
           mov   ax,dva_y         ;Y-coördinaat laden
           mov   dx,zbreite       ;met regelbreedte vermenigvuldigen
           mul   dx
           mov   si,dva_x         ;X-coördinaat laden
           mov   cx,si            ;voor shift-berekening vastleggen
           shr   si,1             ;X-coördinaat door acht delen
           shr   si,1
           shr   si,1
           add   si,ax            ;daarbij offset uit vermenigvuldiging opt.
           and   cl,7             ;bit-masker uit X-coördinaat berekenen
           xor   cl,7
           mov   ch,1
           shl   ch,cl
           mov   ax,vio_seg       ;segmentadres van video-RAM inclu-
           mov   es,ax            ;sief page na ES
           mov   dx,GC_INDEX      ;toegang tot graphics-controller
           mov   ax,(3 shl 8)+ GC_READ_MAP    ;vervolgens niveau #3
           xor   bl,bl                        ;uitlezen
gp1:       out   dx,ax            ;het te lezen bit-niveau aangeven
           mov   bh,es:[si]       ;waarde uit latch-register laden
           and   bh,ch            ;alleen de gewenste pixel laten staan
           neg   bh               ;bit 7 volgens de pixel zetten
           rol   bx,1             ;bit 7 uit BH na bit 1 in BL rood
           dec   ah               ;volgende bit-niveau bewerken
           jge   gp1              ;groter of gelijk nul? ---> verder
           mov   al,bl            ;functieresultaat na AL
           pop   bx
           pop   si
           pop   bp
           mov   cx,dva_x         ;herstel coordinaten
           mov   dx,dva_y
           ret                    ;terug naar aanwijzer
_getpix    endp                 ;einde van de procedure
;;-- SETPAGE: selecteert de pagina, waar bij functieoproepen van ------
;;--          setpix en getpix heen wordt gegegaan
;
;_setpage   proc near
;
;           mul   pageofs          ;paginannummer met page-offset vermenigv.
;           add   ax,0A000h        ;daarbij het basis-segmentadres optellen
;           mov   vio_seg,ax       ;nieuw segmentadres vastleggen
;           ret                    ;terug naar aanwijzer, argument werd
;                                  ;al van de stack verwijderd
;
;_setpage   endp                   ;einde van de procedure
;
;;-- SHOWPAGE: brengt een van de twee beeldschermpagina's in beeld  --------
;;-- verklaring  : void showpage( int page );
;
;_showpage  proc near
;
;           mul   pageofs          ;paginannummer met page-offset vermenigv.
;           mov   cl,4             ;alles nog eens met 16 vermenigvuldigen
;           shl   ax,cl
;
;           mov   bl,al            ;Lo-byte vastleggen
;
;           mov   dx,CRTC_INDEX    ;CRT-controller adresseren
;           mov   al,CC_START_HI   ;vervolgens hi-byte uitgeven
;           out   dx,ax
;           inc   al               ;nu lo-byte uitgeven
;           mov   ah,bl
;           out   dx,ax
;
;     ;-- weer wachten op het begin van een beeldschermopbouw -----
;
;     mov   dx,VERT_RETRACE  ;vervolgens op het einde van de verticale
;sp3:       in    al,dx            ;terugloop wachten
;           test  al,8
;           jne   sp3
;
;sp4:       in    al,dx            ;dan naar de start van de terugloop
;           test  al,8
;           je    sp4
;
;           ret                    ;terug naar de aanwijzer
;
;_showpage  endp                   ;einde van de procedure
;;-- _INT10: vervanging van INT 10h instructie. Kleur in AL, coord. in CX,DX
PUTPIX          PROC    NEAR
                CMP     DVA_ACTIVE,0    ; IS DIRECT VIDEO ACCESS ACTIEF
                JE      DVANACTIVE      ; NEE, DAN SPRING
                CALL    _setpix         ; SCHRIJF PIXEL
                JMP     SHORT PUTPIXEND ; SPRING NAAR EINDE ROUTINE
DVANACTIVE:     MOV     AH,0CH          ; LAADT AH MET PLOT FUNCTIE
                XOR     BH,BH           ; SCHERMPAGINA 0
                INT     10H             ; VOER FUNCTIE UIT
PUTPIXEND:      RET                     ; EINDE ROUTINE
PUTPIX          ENDP
GETPIX          PROC    NEAR
                CMP     DVA_ACTIVE,0    ; IS DIRECT VIDEO ACCESS ACTIEF
                JE      DVAINACTIVE     ; NEE, DAN SPRING
                CALL    _getpix         ; LEES PIXEL
                JMP     SHORT GETPIXEND ; SPRING NAAR EINDE ROUTINE
DVAINACTIVE:    MOV     AH,0DH          ; LAADT AH MET PLOT FUNCTIE
                XOR     BH,BH           ; SCHERMPAGINA 0
                INT     10H             ; VOER FUNCTIE UIT
GETPIXEND:      RET                     ; EINDE ROUTINE
GETPIX          ENDP
;== einde ===============================================================
terug.gif