title Gerade nach Bresenham-Algorithmus name ('BRESHAM') ; Berechnung einer Geraden nach dem Bresenham-Algorithmus ; Dies ist die diassemblierte Version eines TURBO-PASCAL Programms .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 .NE. equ 0692h ; Integer <> .GT. equ 06cch ; Integer > .LT. equ 06e0h ; Integer < .SHL. equ 074eh ; Shift left RTL$END equ 20d4h ; Programmende ; winkhalb equ 0ef40h ; winkelhalbierende : boolean ende equ 0ef41h ; ende : integer help equ 0ef43h ; help : 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 hl,1 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 push hl ld hl,(x1) ; Laden x1 pop de ex de,hl or a sbc hl,de ld (dx),hl ; dx=x2-x1 ld hl,(y2) ; Laden y2 push hl ld hl,(y1) ; Laden y1 pop de ex de,hl or a sbc hl,de ld (dy),hl ; dy=y2-y1 ld hl,FALSE ld a,l ld (winkhalb),a ; winkelhalbierende=false ; ; Spiegelung an y-Achse ; ld hl,(dx) ; Laden dx push hl ld hl,0 pop de call .LT. ; Test dx < 0 bit 0,l jp z,spiegelX ; dx >= 0 ld hl,(dx) ; Laden dx ld a,l cpl ld l,a ld a,h cpl ld h,a inc hl ld (dx),hl ; Negieren dx ld hl,-1 ld (xl),hl ; Aendern xl ; ; Spiegelung an x-Achse ; spiegelX: ld hl,(dy) ; Laden dy push hl ld hl,0 pop de call .LT. ; Test dy < 0 bit 0,l jp z,spiegel1 ; dy >= 0 ld hl,(dy) ; Laden dy ld a,l cpl ld l,a ld a,h cpl ld h,a inc hl 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 push hl ld hl,(dy) ; Laden dy pop de call .LT. ; Test dx < dy bit 0,l jp z,keintausch ; dx >= dy ; ; Austausch von Variablen ; ld hl,(v.x) ; Austausch x,y ld (help),hl ld hl,(v.y) ld (v.x),hl ld hl,(help) ld (v.y),hl ; ld hl,(dx) ; Austausch dx,dy ld (help),hl ld hl,(dy) ld (dx),hl ld hl,(help) ld (dy),hl ; ld hl,(xl) ; Austausch xl,yl ld (help),hl ld hl,(yl) ld (xl),hl ld hl,(help) ld (yl),hl ld hl,(y2) ld (ende),hl ; Aendern ende ld hl,TRUE ld a,l ld (winkhalb),a ; winkelhalbierende=true ; ; Hilfsvariablen ; keintausch: ld hl,(dy) ; Laden dy push hl ld hl,1 pop de call .SHL. ld (v.a),hl ; a=dy * 2 ; ld hl,(dx) ; Laden dx push hl ld hl,1 pop de call .SHL. push hl ld hl,(v.a) ; Laden a pop de ex de,hl or a sbc hl,de ld (v.b),hl ; b=dx * 2 - 1 ; ld hl,(v.a) ; Laden a push hl ld hl,(dx) ; Laden dx pop de ex de,hl or a sbc hl,de ld (v.e),hl ; e=a - dx ; ; Zeichnen der Geraden ; ld hl,(winkhalb) ; Laden winkelhalbierende ld h,0 bit 0,l jp z,Gerade2beg 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() Gerade1: ld hl,(v.x) ; Laden x push hl ld hl,(ende) ; Laden ende pop de call .NE. ; Test x <> ende bit 0,l jp z,_EndeGerade ; x = ende ld hl,(v.x) ; Laden x push hl ld hl,(xl) ; Laden xl pop de add hl,de ld (v.x),hl ; Speichern x ld hl,(v.e) ; Laden e push hl ld hl,0 pop de call .GT. ; Test e > 0 bit 0,l jp z,Gerade1add ; e <= 0 ld hl,(v.y) ; Laden y push hl ld hl,(yl) ; Laden yl pop de add hl,de ld (v.y),hl ; Speichern y ld hl,(v.e) ; Laden e push hl ld hl,(v.b) ; Laden b pop de ex de,hl or a sbc hl,de ld (v.e),hl ; Speichern e jp Gerade1e Gerade1add: ld hl,(v.e) ; Laden e push hl ld hl,(v.a) ; Laden a pop de add hl,de ld (v.e),hl ; Speichern e Gerade1e: 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() jp Gerade1 _EndeGerade: jp EndeGerade ; Gerade2beg: 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() Gerade2: ld hl,(v.x) ; Laden x push hl ld hl,(ende) ; Laden ende pop de call .NE. ; Test x <> ende bit 0,l jp z,EndeGerade ; x = ende ld hl,(v.x) ; Laden x push hl ld hl,(xl) ; Laden xl pop de add hl,de ld (v.x),hl ; Speichern x ld hl,(v.e) ; Laden e push hl ld hl,0 pop de call .GT. ; Test e > 0 bit 0,l jp z,Gerade2add ; e <= 0 ld hl,(v.y) ; Laden y push hl ld hl,(yl) ; Laden yl pop de add hl,de ld (v.y),hl ; Speichern y ld hl,(v.e) ; Laden e push hl ld hl,(v.b) ; Laden b pop de ex de,hl or a sbc hl,de ld (v.e),hl ; Speichern e jp Gerade2e Gerade2add: ld hl,(v.e) ; Laden e push hl ld hl,(v.a) ; Laden a pop de add hl,de ld (v.e),hl ; Speichern e Gerade2e: 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() jp Gerade2 EndeGerade: ret ; ; 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