title Gerade nach Bresenham-Algorithmus name ('BRESOPT') ; 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. .z80 aseg .phase 20e2h FALSE equ 0 TRUE equ 1 TPA equ 0100h ; ; Laufzeitroutinen ; RTL$IN1 equ 0364h ; Initialisierung der Geraete RTL$IN2 equ 04d4h ; Initialisierung des Speichers RTL$END equ 20d4h ; Programmende winkhalb equ 0ef40h ; winkelhalbierende : boolean ende equ 0ef41h ; ende : integer v.e equ 0ef45h ; e : integer v.b equ 0ef47h ; b : integer v.a equ 0ef49h ; a : integer dy equ 0ef4bh ; dy : integer dx equ 0ef4dh ; dx : integer v.y equ 0ef4fh ; y : integer v.x equ 0ef51h ; x : integer yl equ 0ef53h ; yl : integer xl equ 0ef55h ; xl : integer farbe equ 0ef5fh ; farbe : integer y2 equ 0ef61h ; y2 : integer x2 equ 0ef63h ; x2 : integer y1 equ 0ef65h ; y1 : integer x1 equ 0ef67h ; x1 : integer ; p.modus equ 0ef71h ; modus : integer p.y equ 0ef73h ; y : integer p.x equ 0ef75h ; x : integer ; TOP$MEM equ 0ef7fh ; BREAK equ 0ff00h ld sp,TPA ld hl,TOP$MEM ld bc,BREAK call RTL$IN1 ld hl,HEAP ld de,winkhalb ld bc,TOP$MEM+128 ld a,1 call RTL$IN2 jp MAIN ; ; procedure plot(x, y, modus: integer); DUMMY ; plot: pop iy pop hl ld (p.modus),hl pop hl ld (p.y),hl pop hl ld (p.x),hl push iy ret ; ; Procedure Line (x1, y1, x2, y2, farbe : integer); ; Line: pop iy pop hl ld (farbe),hl ; farbe pop hl ld (y2),hl ; y2 pop hl ld (x2),hl ; x2 pop hl ld (y1),hl ; y1 pop hl ld (x1),hl ; x1 push iy ld hl,1 ld (xl),hl ; Initialisierung xl ld (yl),hl ; Initialisierung yl ld hl,(x1) ; Laden x1 ld (v.x),hl ; Speichern x ld hl,(y1) ; Laden y1 ld (v.y),hl ; Speichern y ld hl,(x2) ; Laden x2 ld (ende),hl ; Speichern ende ld hl,(x2) ; Laden x2 ld de,(x1) ; Laden x1 or a sbc hl,de ld (dx),hl ; dx=x2-x1 ld hl,(y2) ; Laden y2 ld de,(y1) ; Laden y1 or a sbc hl,de ld (dy),hl ; dy=y2-y1 xor a ld (winkhalb),a ; winkelhalbierende=false ; ; Spiegelung an y-Achse ; ld de,(dx) ; Laden dx bit 7,d ; Test dx < 0 jr z,spiegelX ld hl,0 or a sbc hl,de ; Negieren dx ld (dx),hl ld hl,-1 ld (xl),hl ; Aendern xl ; ; Spiegelung an x-Achse ; spiegelX: ld de,(dy) ; Laden dy bit 7,d ; Test dy < 0 jr z,spiegel1 ; dy >= 0 ld hl,0 or a sbc hl,de ld (dy),hl ; Negieren dy ld hl,-1 ld (yl),hl ; Aendern yl ; ; 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 ; ld hl,(v.a) ; 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 rra jr nc,Gerade2 Gerade1: ld hl,(v.y) ; Laden y push hl ld hl,(v.x) ; Laden x push hl ld hl,(farbe) ; Laden farbe push hl 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 push hl ld hl,(v.y) ; Laden y push hl ld hl,(farbe) ; Laden farbe push hl 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 ; ; MAIN ; MAIN: ld hl,100 push hl ld hl,10 push hl ld hl,200 push hl ld hl,20 push hl ld hl,1 push hl call Line jp RTL$END HEAP: .dephase end