; LINE.ASM: Zieht eine Linie im Grafik-Bildschirm ; ; Autor: Frank Riemenschneider ; ; Eingabe: AX = X-Koordinate (0-239) des Startpunktes ; BX = Y-Koordinate (0-63) des Startpunktes ; CX = X-Koordinate (0-239) des Endpunktes ; DX = Y-Koordinate (0-63) des Endpunktes ; ; Ausgabe: keine DATASEG DeltaX dw ? ; Steigung in X-Richtung DeltaY dw ? ; Steigung in Y-Richtung SignX dw ? ; Vorzeichen X-Richtung SignY dw ? ; Vorzeichen Y-Richtung Inc1 dw ? ; Inkrement 1 Inc2 dw ? ; Inkrement 2 CODESEG PROC AsmLine push ax push bx push cx push dx push si push di push bp mov [DeltaX], cx ; Steigung in X-Richtung berechnen mov [SignX], 1 ; positives Vorzeichen annehmen sub [DeltaX], ax jz LineLab8 jg LineLab9 ; Steigung negativ? neg [DeltaX] ; Ja -> DeltaX komplementieren mov [SignX], -1 ; negatives Vorzeichen in X-Richtung jmp short LineLab9 LineLab8: mov [SignX], 0 ; waagerechte Linie => Vorzeichen = 0 LineLab9: mov [DeltaY], dx ; Steigung in Y-Richtung berechnen mov [SignY], 1 ; positives Vorzeichen annehmen sub [DeltaY], bx jz LineLab10 jg LineLab11 ; Steigung negativ? neg [DeltaY] ; Ja -> DeltaY komplementieren mov [SignY], -1 ; negatives Vorzeichen in Y-Richtung jmp short LineLab11 LineLab10: mov [SignY], 0 LineLab11: mov bp, 0 ; Richtungsflag l”schen push ax ; Koordinate retten, um das Register zum ; Arbeiten freizubekommen mov ax, [DeltaX] cmp ax, [DeltaY] ; Gr”áe der Steigungen in X- und Y-Richtung ; vergleichen jge LineLab12 ; Ja -> Steigungen nicht tauschen mov ax, [DeltaX] ; Steigungen vertauschen xchg [DeltaY], ax mov [DeltaX], ax mov bp, 1 ; Richtungsflag setzen LineLab12: mov ax, [DeltaY] ; Steigung Y-Richtung laden, shl ax, 1 ; mit 2 multiplizieren, sub ax, [DeltaX] ; davon Steigung X-Richtung abziehen mov si, ax ; Ergebnis ist der Startwert mov ax, [DeltaX] ; Inkrement 2 berechnen shl ax, 1 ; als Doppeltem der Steigung X-Richtung mov [Inc2], ax mov ax, [DeltaY] ; Inkrement 1 berechnen shl ax, 1 ; als Doppeltem der Steigung Y-Richtung mov [Inc1], ax pop ax ; X-Koordinate Startpunkt wiederherstellen call AsmPlot ; Punkt setzen LineWhileLoop: cmp ax, cx ; X-Koordinate Endpunkt erreicht? jne LineLab13 ; Nein -> weiter plotten cmp bx, dx ; Y-Koordinate Endpunkt erreicht? jne LineLab13 ; Nein -> weiter plotten jmp LineExit ; Ja -> Beenden LineLab13: cmp si, 0 ; Startwert >= 0? jl LineLab16 ; Nein -> weiter hinten cmp bp, 1 ; Flag = 1? jne LineLab14 add ax, [SignX] ; X-Koordinate erh”hen jmp short LineLab15 LineLab14: add bx, [SignY] ; Y-Koordinate erh”hen LineLab15: sub si, [Inc2] ; Startwert um Inkrement 2 erniedrigen LineLab16: cmp bp, 1 ; Flag = 1? jne LineLab17 ; Nein -> weiter hinten add bx, [SignY] ; Y-Koordinate erh”hen jmp short LineLab18 LineLab17: add ax, [SignX] ; X-Koordinate erh”hen LineLab18: add si, [Inc1] ; Startwert um Inkrement 1 erh”hen call AsmPlot ; Punkt setzen jmp LineWhileLoop ; Zurck zum Schleifenanfang LineExit: pop bp pop di ; Alle Register wieder von den B„umen, pop si ; „h, Stack herunterholen pop dx pop cx pop bx pop ax ret ; Back home ENDP ; LINE.ASM: Regelt die Parameterbernahme von Turbo Pascal aus fr ; die ASMLINE-Routine in Turbo Assembler ; ; Eingabe: Parameter der LINE-Funktion auf dem Stack ; Line( XAnf, YAnf, XEnde, YEnde:WORD ); ; Ausgabe: keine CODESEG PROC Line FAR XAnf:WORD, YAnf:WORD, XEnde:WORD, YEnde:WORD PUBLIC Line mov ax, [XAnf] ; Anfangs- und Endkoordinaten in die mov bx, [YAnf] ; entsprechenden Register bringen mov cx, [XEnde] mov dx, [YEnde] ; Koordinaten testen cmp ax, 0 ; XAnf < 0? jge LineLab1 xor ax, ax LineLab1: cmp ax, 239 ; XAnf > 239? jle LineLab2 mov ax, 239 LineLab2: cmp bx, 0 ; YAnf < 0? jge LineLab3 xor bx, bx LineLab3: cmp bx, 63 ; YAnf > 63? jle LineLab4 mov bx, 63 LineLab4: cmp cx, 0 ; XEnde < 0? jge LineLab5 xor cx, cx LineLab5: cmp cx, 239 ; XEnde > 239? jle LineLab6 mov cx, 239 LineLab6: cmp dx, 0 ; YEnde < 0? jge LineLab7 xor dx, dx LineLab7: cmp dx, 63 ; YEnde > 63? jle LineLab7a mov dx, 63 LineLab7a: call AsmLine ; Line-Routine aufrufen ret ; Back home ENDP