;**********************************************************************;
;* 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 ===============================================================