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 cycles

    push imm16 <=direct 3 cycles
    pop es <=vector 11 cycles
    ==>insgesamt 14 cycles

    Auf 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..


Anmelden zum Antworten