Mit assembler eine Linie zeichen

Hey,
ich würde gerne eine Linie zeichen(8086). Ich habe zwei Koordinatenpunkte und würde gerne eine Linie zwischen diesen beiden Punkten zeichen. Danke

Gruß kon

Auch Hey,

ich würde gerne eine Linie zeichen(8086). Ich habe zwei
Koordinatenpunkte und würde gerne eine Linie zwischen diesen
beiden Punkten zeichen. Danke

Siehe (google): bresenham algorithm assembly

z.B. Quelltext hier:
http://www.programmersheaven.com/zone10/cat458/15221…

Soll das reiner Assembler werden
oder ist das in eine Sprache
eingebettet.

Grüße

CMБ

Mahlzeit,

ich würde gerne eine Linie zeichen(8086).

Dann mach mal - wer hindert dich? :smile:

Ich habe zwei
Koordinatenpunkte und würde gerne eine Linie zwischen diesen
beiden Punkten zeichen.

Zunächst: deine Angaben reichen nicht aus. Der 8086 allein kann nicht zeichnen. Du mußt schon sagen, welche sonstigen Hard- und Softwarebedingungen herrschen. Wenn du z.B. von einem handelsüblichen PC ausgehst, dann gibt es im BIOS implementierte Routinen für die Grafikausgabe, die per Interruptaufruf bedienbar sind.

Ansonsten würde ich dir raten, dir den Bresenham-Algorithmus anzuschauen. Er kommt mit Integerarithmetik aus und ist deswegen sehr schnell. Auf die Schnelle hab ich im Netz eine ganz brauchbare Beschreibung gefunden: http://home.in.tum.de/~gagern/html-data/tgi/advpss00… (Suche in der PDF-Datei nach Bresenham, die erste Fundstelle erklärt den Algorithmus, die zweite hat schon Teile davon in 8086-Assembler implementiert).

Gruß

Sancho

Es ist ein reines Assemblerprogramm. Ich habe eine analoge Uhr, die auch schon fast funktioniert. Die Uhr läuft, es fehlen nur die Linien zwischen Mittelpunkt und dem Uhrzeitpunkt. Ich habe mir den Algorithmus angesehen, aber ich glaube, der bringt mich nicht weiter …

Hallo

Es ist ein reines Assemblerprogramm. Ich habe eine analoge
Uhr, die auch schon fast funktioniert. Die Uhr läuft, es
fehlen nur die Linien zwischen Mittelpunkt und dem
Uhrzeitpunkt. Ich habe mir den Algorithmus angesehen, aber ich
glaube, der bringt mich nicht weiter …

Folgender code zeichnet eine Linie
von x1=65,y1=20 zu x2=50,y2=200
über Bios int10h:
(Quelle: http://groups.google.de/group/comp.lang.asm.x86/brow…)
ist z.B. hier nochmal erklärt:
http://freespace.virgin.net/hugo.elias/graphics/x_li…

 segment stack stack
 resb 100
stacktop:
 segment data

 dex dw 0
 dy dw 0
 x\_add dw 0
 y\_add dw 0
 maxd dw 0
 act\_dx dw 0
 act\_dy dw 0
 c dw 0
 x1 dw 0
 y1 dw 0
 x2 dw 0
 y2 dw 0

 segment code
start:
 mov ax,data
 mov ds,ax
 mov ax,stack
 mov ss,ax
 mov sp,stacktop
 mov bp,stacktop

 ;init finished

 mov ah,0h
 mov al,13h
 int 10h

 ;screen set

 mov ax,word 200
 push ax ;y2
 mov ax,word 50
 push ax ;x2
 mov ax,word 20
 push ax ;y1
 mov ax,word 65
 push ax ;x1
 call line

 ;line(x1,y1,x2,y2)

 xor ax,ax
 int 16h

 ;wait key

 mov ah,0
 mov al,3
 int 10h

 ;go back to text mode

 mov ah,4ch
 int 21h

 ;end

line:
 push bp
 mov bp,sp
 mov ax,[bp+4] ;x2)

 mov ax,[y1]
 cmp ax,[y2]
 jl min2
 mov [y\_add],word -1
 jmp end2
min2: mov [y\_add],word 1
end2:
 ;if (y1\>y2)

 mov ax,[dy]
 cmp ax,[dex]
 jl min3
 mov ax,[dy]
 mov [maxd],ax
 jmp end3
min3: mov ax,[dex]
 mov [maxd],ax
end3:

 mov cx,[maxd]
here: mov ax,[dy]
 add [act\_dy],ax
 mov ax,[act\_dy]
 cmp ax,[maxd]
 jl next
 mov ax,[maxd]
 sub [act\_dy],ax
 mov ax,[y\_add]
 add [y1],ax
next: mov ax,[dex]
 add [act\_dx],ax
 mov ax,[act\_dx]
 cmp ax,[maxd]
 jl next2
 mov ax,[maxd]
 sub [act\_dx],ax
 mov ax,[x\_add]
 add [x1],ax
next2: call plot
 loop here
 mov sp,bp
 pop bp
 ret 8

plot:
 push ax
 push bx
 push cx
 push dx
 mov ah,0ch
 mov dx,[y1]
 mov cx,[x1]
 mov al,0d0h ;change this to change the point-color
 mov bh,0h
 int 10h
 pop dx
 pop cx
 pop bx
 pop ax
 ret 

Grüße

CMБ