linie wir nicht ganz oben angezeigt
-
hi,
ja.. leidiges thema grafik..
die sehr einfache.. linie wird zwar ganz links dargestellt aber ncht ganz oben...model small .stack 100h .data var DW 0 .code main: mov ax, @data mov ds, ax mov ax, 4F02h ; Wechsle den Grafikmodus mov bx, 0103h ; int 10h ; mov ah, 1 int 21h push 0a000h ; Segmentadresse laden pop es ; Diese Version ist schneller als mov .. back: cmp var, 100 je go mov di, var mov ax, 3 ; die Pixelfarbe für Graka stosb ; den Wert von Color in die Grafikkarte schieben inc var jmp back go: mov ah, 1 int 21h mov ah, 00h ; mov al, 03h ; zurück zum text-modus int 10h ; mov ah, 4Ch int 21h end main
wie kann ich sonst nen pixel ganz links setzen und dann ne lineie ziehn?
-
hm...also nochmal konkret: ist das so richtig?
wenn nicht wie soll ich das sonst machen?
-
Hi.
Im Wesentlichen stimmt dein Code so.
Koennte sein, dass die Linie nicht ganz oben im Bildschirm ist, weil Du die Speicherbank nicht noch ausgewaehlt hast...
Dazu die Vesa-Funktion 5:
ax=4F05h
bh=00h
bl=Window A/B (=>0/1 -hier auf 0 setzen)
dx=neue Position (in granularity units; die gibt dir VESA-Funktion 01h zurueck - sind aber meist 64KB - in deinem Fall dx auch auf 0 setzen)Ansonsten fallen mir nur jede Menge Kleinigkeiten auf, die sich an deinem Code verbessern liessen:
push imm16 pop sreg
Ist schneller als
mov ax,imm16 mov sreg,ax
???
Auf AMD Athlon ist das Ergebnis ziemlich klar:
mov reg16,imm16 <= direct 1cycle
mov sreg,reg16 <=vector 10 cycles
==>insgesamt 11 cyclespush imm16 <=direct 3 cycles
pop es <=vector 11 cycles
==>insgesamt 14 cyclesAuf Pentium sind beide Methoden unter Optimalbedingungen etwa gleich schnell.
Next:
waere statt:back: cmp var, 100 je go mov di, var mov ax, 3 ; die Pixelfarbe für Graka stosb ; den Wert von Color in die Grafikkarte schieben inc var jmp back
nicht einfach
mov cx,100 mov di,var mov ax,3 rep stosb
guenstiger?
Und zuletzt erinnere ich nochmal daran, dass vor allem bei aelteren Karten einer bestimmten Modusnummer von Hersteller zu Hersteller verschiedene Bildschirmmodi zugeordnet sein koennen.
Daher besser vor einschalten eines Modus die Moduseigenschaften mit Funktion 01h abholen und nochmal ueberpruefen, ob diese Modusnummer auch Wirklich einen Bildschirmmodus mit der Farbtiefe und Aufloesung produziert, die von dir angedacht war.So. Hoffe das hilft dir weiter.
-
also erstmal danke
-> das mit dem schneller hab ich aus dem tutorial von Docjunior
so dann rep kenn ich leider nicht (desshalb hab ich es auch nicht benutzt...)
zu dem überprüfen:
in ralphs int liste hab ich was passendes gefunden:
Bitfields for VESA SuperVGA mode attributes: Bit(s) Description (Table 00080) 0 mode supported by present hardware configuration 1 optional information available (must be =1 for VBE v1.2+) 2 BIOS output supported 3 set if color, clear if monochrome 4 set if graphics mode, clear if text mode
nur wie soll ich das jetzt hinbekommen?! (bin noch anfänger
)
ich glaub das da was nicht stimmt weil als ich so:
mov ax, 800 mov bx, 400 mul ax add ax, 300 mov di, ax
nen pixel in die mitte setzten wollte war ganz weit oben links...
-
so ich hab jetzt getestet , getestet ...und und und
mein ergebnis:
bei 320x200 bei 256farben geht mein code
bei 800x600 bei 256farben geht er nicht (angepasst hab ich ihn natürlich..)
mein code sollte sowas malen:
_________________ | | | | |
bei 320 macht er das auch bei 800 kommt das hier raus:
______________ | | | | | | | |
könnstest du/ihr mir zeigen wie ich überprüfe ob der modus verfügbar ist
-> und wenn er nicht verfügbar ist was soll ich dann machen?
-
Edit: bei beiden ist die obere linie gleich (richtig) lang!
-
hm.. problem:
mal ganz logisch dneken:
800*600 = 480000
16bit (ax) = 65535
480000 > 65535
-> also ist es SO nicht möglich auf alle pixel zuzugreifen...
wie soll ich das sonst anstellen?
-
Hehe. Schon richtig angedacht. Die 64KB-Segmentgrenze ist genau das Problem im RealMode mit Hohen Grafikaufloesungen. So laesst sich nie der ganze Bildschirmbereich addressieren.
Das Problem wurde geloest, indem der gesamte Bildschirmspeicher in verschiedene Speicherbaenke unterteilt wurde.
Ueber oben bereits erwaehnte VESA-Funktion 05h kann man auswaehlen, welche Speicherbank in den RM-Speicherbereich bei A0000 eingeblendet wird.Zur weiteren Lektuere empfehle ich dieses VESA-Tutorial
-
THX!
mus sich mir mal durchlesen..