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 wohlmov 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