Grafik aus einem String lesen und anzeigen



  • THX @ all

    Leide habe ich (tatsächlich) die Absicht, ein reines ASM-Programm zu schreiben 😉

    Ich hab den Code jetzt mal etwas umgeschrieben:

    ;PARAMS:
    ;    AX = BILDHÖHE
    ;    BX = BILDBREITE
    ;    DS:SI = ADRESSE DES GRAFIK-STRINGS
    ;--------------------------------------------------------------------------
    putCompressedBMPString:
         mov  cx, 0
         mov  dx,  0 
         jmp  .cBMP_loop
    
       .cBMP_NextLine
         inc  cx
         cmp  cx,  ax
         jz   .iputBMP_end
         mov  dx,  0
         jmp  .cBMP_loop
    
         ;MAIN-LOOP
       .cBMP_loop
    
         push ax
         push cx
         push bx
         push dx
         LODSB   
         mov  [Zahl],ax
         mov  bh,  10000000b
       .iBMPloop
         test ah,  bh
         jne  iputpixel
       .iLoopA
    
         SAL  bh,  1
         dec  word [Zahl]
         cmp  word [Zahl],0
         jz . iBMPloop
    
         pop  dx
         pop  bx 
         pop  cx
         pop  ax 
         cmp  dx,  bx
         jge  .cBMP_NextLine
         jmp  .cBMP_loop
    
       .iputBMP_end
    
    ret
    

    Aufrufen tu ich meine Funktion so:

    mov SI,compressedBMPString
    mov ax,105;HÖHE DES BILDES
    mov bx,144;BREITE DES BILDES
    call putCompressedBMPString
    

    Jedoch sehe ich bei dieser Version keinen einzigen Pixel auf dem Bildschirm.
    Außerdem scheint sich eine Endlosschleife aufgetan zu haben, da die Programmausführung
    nach der putCompressedBMPString Funktion nicht fortgesetzt wird...

    Vielen Dank schonmal!



  • innerhalb der "iBMPloop" willst du doch fuer jedes der 8 bits eines gelesenen bytes pruefen, ob es gesetzt ist oder nicht.
    dieses byte laedst du mit lodsb nach al, pruefst aber ah.
    dafuer benutzt du eine bitmaske die nach dem ersten sal bh,1 nur noch 0 enthaellt.
    der zaheler fuer diese schleife ist zahl. sollte da nicht 8 drinstehen? stattdessen setzt der sich aus 8 pixel-bits und dem high-byte der bildhoehe zusammen.
    da stimmt doch was nicht! 🙂

    edit: ich habe den algorithmus mal ungetestet "aufgeraeumt"
    vielleicht hilft dir das was...

    register:
    cx= breite
    dx= hoehe
    al= farbe der bitmap
    es:di= grafikspeicher-position (a000h:0= oben links)
    ds:si= adresse der bitmap
    putCompressedBMPString:
         mov  bx, 320       ; x-aufloesung mode 13
         sub  bx, cx    
         mov  pitch, bx     ; step vom ende einer scanline zum anfang der naechsten
         shr  cx, 3         ; breite /8
       .yloop
         push cx            ; breite retten
       .xloop
         mov  bh, 10000000b ; oberstes bit zuerst pruefen
         mov  bl, [ds:si]   ; 8bit laden
       .bitloop
         test bl,  bh       ; bit pruefen
         jz   skip          ; nicht gesetzt: keinen pixel zeichnen
         mov  [es:di], al   ; pixel setzen
       .skip
         inc  di            ; naechster pixel
         shr  bh,1          ; zu pruefendes bit um 1 verschieben
         jnc  bitloop       ; widerholen solang das pruefbit nicht weggeshiftet wurde
         inc  si            ; adresse vom naechsten bitmap-byte
         dec  cx            ; breite--
         jnz  xloop         ; wiederholen solange ungleich 0
         pop  cx            ; breite wiederherstellen
         add  di, pitch     ; zum anfang der naechsten zeile springen
         dec  dx            ; hoehe--
         jnz  yloop         ; wiederholen solange ungleich 0
    ret
    


  • Vielen Dank für deine Mühe!

    Leider muss ich sagen, dass es bei mir noch immer nicht funktioniert 😞
    Ich rufe deinen Code wie folgt auf:

    ...
         mov cx,144
         mov dx,105
         mov ax,0xa000
         mov [es:di],ax
         mov ax,compressedBMPString
         mov [ds:si],ax
         mov al,7
         call putCompressedBMPString
    
         CALL WaitBIOSKey
         ...
    

    Doch mein Bildschirm bleibt schwarz. Meine "Bitmap" sieht dabei so aus:

    compressedBMPString db 0000000b, 0000000b, 0000000b, 0000000b, 0000000b, 0000111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1110000b, 0000000b, 0000000b, 0000000b, 
    db 0000000b, 0000000b, 0000000b, 0000000b, 0000000b, 1111000b, 0000000b, 0111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111110b, 0000000b, 0001100b, 0000000b, 0000000b, 0000000b, 
    db 0000000b, 0000000b, 0000000b, 0000000b, 1111111b, 1111000b, 0000000b, 0000001b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111111b, 1100000b, 0000000b, 0001111b, 1111100b, 0000000b, 0000000b, 
    db 0000000b, 0000000b, 0000000b, 0001111b, 1111111b, 1111000b, 0000000b, 0000000b, 0011111b, 1111111b, 1111111b, 1111111b, 1111111b, 1111110b, 0000000b, 0000000b, 0001111b, 1111111b, 1100000b, 0000000b, 
    ...
    

    (erste 4 Zeilen)

    Hoffe, ich stress dich nicht zu sehr 😞



  • mov ax,0xa000
    mov [es:di],ax
    

    das schreibt den 16bit wert "0xa000" in die speicherstelle auf die es:di zeigt.
    richtiger waere wohl

    mov ax,0xa000
    mov es,ax
    mov di,0
    

    darueber hinaus solltest du nicht davon ausgehen, dass mein code-beispiel funktioniert, denn ich hatte wenig lust einen 16bit-assembler rauszuholen 😉



  • ich hatte wenig lust einen 16bit-assembler rauszuholen

    😃

    Es funzt zwar noch immer nicht, aber vielen Dank für deine Hilfe!

    P.S. Einer der Admins des Forums scheinen nicht mitbekommen zu haben,
    dass es nichts bringt, mich dauernd zu bannen. Einmal den Routerstecker
    gezogen, schon komm ich wieder rein.

    Aber da hab ich mal ne Frage: War dieser Beitrag wirklich SO schlimm?



  • @PS: Pannen passieren hier auch mal. Wenn du unbedingt registriert schreiben willst, und meinst zu unrecht gebannt worden zu sein, schlage ich vor mal eine Mail an Marc++us zu schreiben. 😉



  • Hallo!

    Ich stress schonwieder!
    Ich habs jetzt soweit hinbekommen, dass (was jetzt mal völlig neu ist) keine Endlosschleife oder ein Sprung ins nichts entsteht.

    Die Pixelreihen werden wie gewünscht durchlaufen, aber: Es werden keine entsprechenden Pixel gesetzt 😕

    putCompressedBMPString:
    
        ;PARAMS:::::::::::::::::::
         mov    ax,   105;HÖHE DES BILDES
         mov    bx,   137;BREITE DES BILDES
         mov    si,   compressedBMPString
        ;PARAMS:::::::::::::::::::
    
         mov    [XMax],bx
         mov    [YMax],ax
         mov    ax,    0
    
         mov    word [XPos],0
         mov    word [YPos],0
    
        .pCBS_loop
         LODSB                                ;AL = Zeichen im String (8 Bit)
         mov    cl,  0
    .pCBS_Bitloop
         inc    word  [XPos]
         push   bx
         mov    bx,   [XPos]
         cmp    bx,  word [XMax]
         jge    .pCBS_NextLine 
    .pCBS_ret1
         pop    bx
    
         test   al,   bl                      ;Vergleiche
         jnz    .pCBS_PutPixel
    .pCBS_ret2
         shr    bl,   1
         inc    cl
         cmp    cl,   7
         jz     .pCBS_loop
         jmp    .pCBS_Bitloop
    
    .pCBS_NextLine
         push   bx
         mov    word [XPos],0
         inc    word [YPos]
         mov    bx,   word [YPos]
         cmp    bx,   word [YMax]
         pop    bx
         jge    .pCBS_End
         jmp    .pCBS_ret1
    
    .pCBS_PutPixel
         push   ax
         push   cx
         push   dx
         mov    al,7
         mov    cx,   word [YPos]
         mov    dx,   word [XPos]
         call   putpixel
         pop    dx
         pop    cx
         pop    ax
         jmp    .pCBS_ret2
    
    .pCBS_End    
    pop bx
    ret
    

    Wenn ich statt compressedBMPString einen anderen String angebe, werden irgendwelche Punkte gesetzt (was ja normal ist), wenn ich aber compressedBMPString angebe, wird entweder alles weiß, oder alles schwarz gelassen-.- (ja nach jnz oder jz .pCBS_PutPixel).

    Ich versteh nicht warum 😕



  • ja, ganz recht! Ich bins wieder. Ich habs jetzt hinbekommen. (Hat ja auch lang genug gedauert.)

    Gefehlt hat diese Befehlszeile:

    mov    bl,  10000000b
    

    unter

    .pCBS_loop
    


  • schwere geburt 😉



  • hellihjb schrieb:

    schwere geburt 😉

    In der Tat 🙂


Anmelden zum Antworten