Forum: Mikrocontroller und Digitale Elektronik Assambler Video-Offset berechnen


von tobias (Gast)


Lesenswert?

Hallo,

ich brauche mal kurz jemanden der mir weiterhelfen kann.
Undzwar suche ich eine kurze 8086 Befehlsfolge die zu einenm gewünschten 
Bildschirmkoordinatenpaar (Zeilenwert/Spaltenwert) den dazugehörigen 
Video-Offset berechnet. Der Bildschirm hat die Auflösung 80 Spalten x 25 
Zeilen.
Zu Beginn soll Al den Zeilenwert und Bl den Spaltenwert enthalten. 
Ergebnis soll im AX Register liegen.

Das habe ich:

.data

 spalte  DB  0
 zeile   DB  0
 Spaltenzahl equ 80

; Video-Offset berechnen
    mov     ah, zeile
    mov     al, Spalte
    push    ax
    call    VGA_Offset
    add     sp, 2


VGA_Offset:
    push    bp
    mov     bp, sp
    mov ah,0
    mov al,[bp+5]     ;Zeile in Register
    mov bh,0
    mov bl,[bp+4]     ;Spalte in Register
    mov di,80
    mul di
    add ax,bx
    mov di,2
    mul di
    pop     bp
    ret

Kann mir jemand sagen ob das richtig ist oder wie ich es ändern muss?

Vielen Dank schonmal,

Gruß Tobias

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der Algorithmus ist doch recht einfach:

   Offset = x + y * 80

wenn x den Wertebereich 0..79 und y den Wertebereich 0..24 hat.

Wird bei 1 begonnen zu zählen, sind x und y eben um 1 zu verringern.

Das Umsetzen dieses Algorithmus in Ass_e_mbler sollte dann nicht schwer 
sein.

von Karl H. (kbuchegg)


Lesenswert?

... Wobei ich mich allerdings auch frage, warum du da so kompliziert mit 
der Argumentübergabe am Stack hantierst und ob es rechtens ist, dass du 
bx und di veränderst. Aber das musst du wissen.

von spess53 (Gast)


Lesenswert?

Hi

Lang ist es her.

VGA_Offset:
    push    bp
    mov     bp, sp
    mov ah,0         ->ist unnötig
    mov al,[bp+5]    ;Zeile in Register
    mov bh,0
    mov bl,[bp+4]    ;Spalte in Register

    mov di,80        -> damit machst du eine 16Bit x 16 
Bit-Multiplikation
    mul di           -> mit Ergebnis in DX:AX

würde ich ersetzen durch:

    mov ah,80
    mul ah           -> Ergebnis in AX

    add ax,bx

    mov di,2         -> Hat das einen besonderen Grund?
    mul di
    pop     bp
    ret

Evtl. solltest du noch BX und DI sichern.

MfG Spess

von Rolf Magnus (Gast)


Lesenswert?

spess53 schrieb:
> mov di,2         -> Hat das einen besonderen Grund?
>     mul di

Wenn ich mich recht erinnere, ist jedes Zeichen zwei Bytes breit, eins 
für den Zeichencode und eins für die Farbe.

von spess53 (Gast)


Lesenswert?

Hi

>Wenn ich mich recht erinnere, ist jedes Zeichen zwei Bytes breit, eins
>für den Zeichencode und eins für die Farbe.

Da könntest du Recht haben. Ich sagte ja 'Lang ist es her'.

MfG Spess

von Phantomix X. (phantomix)


Lesenswert?

definitiv, ein byte Zeichencode und ein Byte Darstellungsinfo. Dazu 
gehört

5 Bit: Vordergrund: 0...15, dazu noch ein bit ob's blinken soll.
3 Bit: Hintergrund: 0...7

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.