VGA Funzt net richtig...



  • hi,
    also ich habe seit ein paar tage ein problem mit den vga mode...um genauer zu sein 13h ... *hehe* sprich 320 * 200 und 256 Farben...also ich habe da jetzt mal selbst versucht was zu machen und wollte mit meiner pallete einfach nur ne blauen hintergrund machen aber die farben kommen ganz anders...und an rand gibt es auch obwohl ich alles in cx hatte....arghh...hier einfach mal mein code :

    mac.inc:

    ;####################################################################
    ;##### CUT_MEMORY ###################################################
    ;####################################################################
    cut_memory		MACRO
    			mov ax, es
    			mov bx, ss
    			sub bx, ax
    			mov ax, sp
    			shr bx, 4
    			inc ax
    			add bx, ax
    			mov ah, 4Ah
    			int 21h
    			ENDM
    
    ;####################################################################
    ;##### ALLOC_MEMORY #################################################
    ;####################################################################
    alloc_memory		MACRO		SIZE
    			mov bx, SIZE
    			mov ah, 48h
    			int 21h
    			ENDM
    
    ;####################################################################
    ;##### WAIT4RET #####################################################
    ;####################################################################
    wait4ret		MACRO
    LOCAL			lab1, lab2
    			push ax
    			push dx
    
    			mov dx, 03DAh
    
    lab1 :			in al, dx
    			test al, 1000b
    			jne lab1
    
    lab2 :			in al, dx
    			test al, 1000b
    			jne lab2
    			pop dx
    			pop ax		
    			ENDM
    
    ;####################################################################
    ;##### PAL_GOES_OUT #################################################
    ;####################################################################
    pal_goes_out		MACRO		PALNAME
    			mov si, OFFSET PALNAME
    			mov cx, 768
    			mov dx, 03C8h
    			xor al, al
    			cli
    			out dx, al
    			cld
    			inc dx
    			rep outsb
    			sti
    			ENDM
    

    vga.asm

    INCLUDE mac.inc
    
    xsize		EQU		320
    ysize		EQU		200
    
    .MODEL Small
    .486
    .STACK 100h
    
    .DATA
    		INCLUDE pal.dat				;PALETTE!
    		msg_outro		DB		"THA FIRST VGA DEMO BY CAMAL __| Mr.Cakar |__ Cakar ...", 10, 13, "$"
    .CODE
    		Start :		cut_memory		;MEMORY KUEZEN!
    				alloc_memory 0FFFh	;NEUER SPEICHER!
    
    				mov es, ax		;SEGMENTADRESSE DES PUFFERS NACH ES
    				mov fs, ax		;UND NACH FS!
    
    				xor eax, eax		;EAX = 0
    				xor di, di		;DI = 0
    				mov cx, 0FFF0h / 4	;ANZAHL DER WORDS DES PUFFERS NACH CX
    				rep stosd		;ALLES NE 0!
    
    				mov ax, 0A000h
    				mov es, ax
    
    				mov ah, 00h
    				mov al, 13h
    				int 10h
    
    				pal_goes_out pal
    
    				push fs
    				pop ds
    
    				mov si, xsize * ysize
    				mov cx, xsize * 200
    
    		da_loop :	mov byte ptr [si], 255
    				dec si
    				dec cx
    				jnz da_loop
    
    				call draw_it
    
    				mov ah, 07h
    				int 21h
    
    				push ds
    				pop es
    
    				mov ah, 49h
    				int 21h
    
    				xor ah, ah
    				mov al, 3
    				int 10h
    
    				mov ax, @data
    				mov ds, ax
    
    				mov ah, 09h
    				mov dx, OFFSET msg_outro
    				int 21h
    
    				mov ah, 07h
    				int 21h
    
    				mov ah, 4Ch
    				int 21h
    
    		draw_it		PROC		NEAR
    				push si
    				push di
    
    				xor si, si
    				xor di, di
    
    				mov cx, (xsize * ysize) / 4
    
    				rep movsd
    
    				pop di
    				pop si
    				ret	
    		draw_it		ENDP
    		END		Start
    

    wisst ihr den fehler... ?



  • Hi.

    Dieser Grafikmodus hat normalerweise nunmal einen "Rand".
    Dieser Rand hat normalerweise die Farbe des 0. Paletteneintrags.
    Diese Zuordnung kannst du notfalls aendern, es ist jedoch IMHO einfacher, darauf zu achten, dass der 0. Paletteneintrag schwarz bleibt - dann faellt der Rand nicht so auf. 😉

    Ansonsten ist an deinem Code AFAIK nicht wirklich was falsch, nur der Code bei den Macros "Cut_memory" und "wait4ret" kommt mir ein wenig sehr eigenartig vor:

    cut_memory        MACRO
                mov ax, es
                mov bx, ss
                sub bx, ax ;ok, Differenz zwischen PSP und Ende in Form vom Stack in Paras in bx - bis hierhin durchaus nachvollziehbar.
                mov ax, sp
                shr bx, 4 ;wozu das jetzt???
                inc ax ;und wozu das?
                add bx, ax ;...???
    ;was der komische Wert in bx jetzt soll, kann ich nicht mehr ganz nachvollziehen...
    
    wait4ret        MACRO
    LOCAL            lab1, lab2
                push ax
                push dx
    
                mov dx, 03DAh
    
    lab1 :            in al, dx
                test al, 1000b
                jne lab1 ;jetzt so lange warten, bis nicht mehr im VRetrace?
    
    lab2 :            in al, dx
                test al, 1000b
                jne lab2 ;und nun den ganzen Unfug nochmal???
    
                pop dx
                pop ax        
                ENDM
    

    BTW: 320*200 ist 64000 oder FA00 und nicht FFF0, von daher: woher dieser Wert?



  • grob angeschaut:
    du hast vor der verwendung des pal_goes_out macros DS nicht initialisiert. der befehl outsb holt sich den string aus DS:SI deshalb wirst du wohl die falschen farben auf dem bildschirm sehen.



  • thx erstmal, wasiliy dein vorschlag hat gefunzt..es geht es..aber eine frage wie geht ihr den in den vga mode ? weil mein code ist ne beispiel aus meinem buch....mhhh bitte mal posten was ihr anders machen würdet....



  • Ich wuerde den richtigen modus mittels eines interupts ausloesen.
    D.h. ich setze den entsprechenden Ram bereich und danach wird der Interupt ausgefuehrt,der den Modus setzt.
    Liegt bei mir laenger zurueck und ich hab grad kein Codebsp hier.
    Aber so hab ich das gemacht.

    msgbeep



  • ich nehm immer:
    mov ax,13h
    int 10h

    da brauchst du nicht extra AH vorher zu löschen, da es bei MOV AX,13h automatisch gelöscht wird.
    was ich nicht verstehe ist warum du beim setzen der palette die interrupts ausschaltest.
    und Nobuo T hat schon angemerkt dass deine waitretrace routine wenig sinn macht.
    es sollte heissen JE lab1 und JNE lab2


Anmelden zum Antworten