title Gerade nach Bresenham-Algorithmus name ('BRESREL') .z80 ; Berechnung einer Geraden nach dem Bresenham-Algorithmus ; Dies ist die optimierte diassemblierte Version ; eines TURBO-PASCAL Programms. Die Run-Time Routinen ; sind in direkten Code uebertragen worden. ; Das Programm ist nun als Modul umgeschrien. ; Der Aufruf erfolgt ueber die Routine "Line". ; Die extern Routine "plot" ist die Plot-Routine ; und muss an die jeweilige Maschine angepasst werden. ; Anders als beim Original werden Parameter wie folgt uebergeben: ; (Im Original erfolgt die Uebergabe ueber den Stack ; x1 : HL ; y1 : DE ; x2 : HL' ; y2 : DE' ; farbe : Akku ; Fuer die externe Routine 'plot': ; x : HL ; y : DE ; modus : Akku entry Line ext plot FALSE equ 0 TRUE equ 1 ; ; Procedure Line (x1, y1, x2, y2, farbe : integer); ; Line: ld (farbe),a ; farbe ld (x1),hl ; x1 ld (y1),de ; y1 exx ld (x2),hl ; x2 ld (y2),de ; y2 ld (ende),hl ; Speichern ende ld ix,x1 call Richtung ld (xl),hl ; Initialisierung xl ld ix,y1 call Richtung ld (yl),hl ; Initialisierung yl xor a ld (winkhalb),a ; winkelhalbierende=false ; ; Spiegelung an Winkelhalbierender des 1. Quadranten ; spiegel1: ld hl,(dx) ; Laden dx ld de,(dy) ; Laden dy or a sbc hl,de ; Test dx < dy jr nc,keintausch ; dx >= dy ; ; Austausch von Variablen ; ld hl,(v.x) ; Austausch x,y exx ld hl,(v.y) ld (v.x),hl exx ld (v.y),hl ; ld hl,(dx) ; Austausch dx,dy exx ld hl,(dy) ld (dx),hl exx ld (dy),hl ; ld hl,(xl) ; Austausch xl,yl exx ld hl,(yl) ld (xl),hl exx ld (yl),hl ld hl,(y2) ld (ende),hl ; Aendern ende ld a,TRUE ld (winkhalb),a ; winkelhalbierende=true ; ; Hilfsvariablen ; keintausch: ld hl,(dy) ; Laden dy add hl,hl ld (v.a),hl ; a=dy * 2 ex de,hl ; ld hl,(dx) ; Laden dx add hl,hl or a sbc hl,de ld (v.b),hl ; b=dx * 2 - a ; ex de,hl ; Laden a ld de,(dx) ; Laden dx or a sbc hl,de ld (v.e),hl ; e=a - dx ; ; Zeichnen der Geraden ; ld a,(winkhalb) ; Laden winkelhalbierende or a jr z,Gerade2 Gerade1: ld hl,(v.y) ; Laden y ld de,(v.x) ; Laden x ld a,(farbe) ; Laden farbe call plot ; plot() ld hl,(v.x) ; Laden x ld de,(ende) ; Laden ende or a sbc hl,de ; Test x <> ende ret z ; x = ende ld hl,(v.x) ; Laden x ld de,(xl) ; Laden xl add hl,de ld (v.x),hl ; Speichern x ld hl,(v.e) ; Laden e dec hl rl h ; Test e > 0 jr c,Gerade1add ; e <= 0 ld hl,(v.y) ; Laden y ld de,(yl) ; Laden yl add hl,de ld (v.y),hl ; Speichern y ld hl,(v.e) ; Laden e ld de,(v.b) ; Laden b or a sbc hl,de jr Gerade1e ; Speichern e Gerade1add: ld hl,(v.e) ; Laden e ld de,(v.a) ; Laden a add hl,de Gerade1e: ld (v.e),hl ; Speichern e jr Gerade1 ; Gerade2: ld hl,(v.x) ; Laden x ld de,(v.y) ; Laden y ld a,(farbe) ; Laden farbe call plot ; plot() ld hl,(v.x) ; Laden x ld de,(ende) ; Laden ende or a sbc hl,de ; Test x <> ende ret z ; x = ende ld hl,(v.x) ; Laden x ld de,(xl) ; Laden xl add hl,de ld (v.x),hl ; Speichern x ld hl,(v.e) ; Laden e dec hl rl h ; Test e > 0 jr c,Gerade2add ; e <= 0 ld hl,(v.y) ; Laden y ld de,(yl) ; Laden yl add hl,de ld (v.y),hl ; Speichern y ld hl,(v.e) ; Laden e ld de,(v.b) ; Laden b or a sbc hl,de jr Gerade2e ; Speichern e Gerade2add: ld hl,(v.e) ; Laden e ld de,(v.a) ; Laden a add hl,de Gerade2e: ld (v.e),hl ; Speichern e jr Gerade2 ; ; Richtung fuer Gerade festlegen ; Richtung: ld e,(ix+0) ; Laden x1/y1 ld d,(ix+1) ld (ix+4),e ; Speichern x/y ld (ix+5),d ld l,(ix+2) ; Laden x2/y2 ld h,(ix+3) or a sbc hl,de ld (ix+6),l ; dx/dy=x2/y2-x1/y2 ld (ix+7),h ex de,hl ld hl,1 ret nc ; Delta > 0 ld hl,0 or a sbc hl,de ; Delta negieren ld (ix+6),l ld (ix+7),h ld hl,-1 ret dseg winkhalb: ds 1 ; winkelhalbierende : boolean ende: ds 2 ; ende : integer v.e: ds 2 ; e : integer v.b: ds 2 ; b : integer v.a: ds 2 ; a : integer yl: ds 2 ; yl : integer xl: ds 2 ; xl : integer farbe: ds 1 ; farbe : byte ; x1: ds 2 ; x1 : integer \ x2: ; | ds 2 ; x2 : integer | v.x: ; | ds 2 ; x : integer | dx: ; | ds 2 ; dx : integer / ; y1: ds 2 ; y1 : integer \ y2: ; | ds 2 ; y2 : integer | v.y: ; | ds 2 ; y : integer | dy: ; | ds 2 ; dy : integer / end