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