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 10hda 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