; ASMFILL.ASM: Fllt eine beliebige Fl„che aus ; ; Autor: Frank Riemenschneider ; ; Eingabe: AX = X-Koordinate Fllpunkt (0-239) ; BX = Y-Koordinate Fllpunkt (0-63) ; Ausgabe: keine DATASEG ; Ben”tigte Variable speicher21 dw ? speicher22 dw ? speicher31 dw ? speicher32 dw ? speicher41 dw ? speicher42 dw ? tcolor dw ? extrn farbe : word; extrn fillcolor : word CODESEG PROC ZieheLinie Near push di push si push dx push cx mov dx,bx Call AsmLine pop cx pop dx pop si pop di ret ENDP PROC TestPunkt Near push cx push dx push di push si Call AsmTest mov al,dl pop si pop di pop dx pop cx cmp al,[BYTE tcolor] ret ENDP PROC AsmFill mov dx,ax ;aktuelle Spalte mov bp,bx ;aktuelle Zeile call TestPunkt ;Startpunkt gesetzt ? jnz L1 jmp La1 ;Ja, dann Ende L1: dec bp ;Zeile vermindern mov ax,dx mov bx,bp call TestPunkt ;Punkt gesetzt ? jnz L1 ;Nein, weiter nach oben wandern inc bp ;Ja, ein Schritt nach rechts und inc dx ;nach unten machen mov ax, dx mov bx, bp ;Dieser Punkt auch gesetzt ? call TestPunkt jnz L1 ;Nein, weiter nach oben wandern mov ax,dx ;Ja, rechte, obere Ecke der Figur dec ax ;erreicht mov [speicher21],ax ;Diese Koordinaten merken mov [speicher22],bp L2: dec dx ;Solange nach links wandern, bis mov ax,dx ;gesetzter Punkt erreicht wird mov bx,bp call TestPunkt jnz L2 inc dx ;Koordinaten merken (in Si X und in Di Y) mov ax,dx mov si,ax mov bx,bp mov di,bx ;Linie von diesem Punkt zum rechten Punkt mov cx, [speicher21] ;zeichnen call ZieheLinie dec bp ;Eine Zeile nach oben wandern (auf obere mov dx,si ;Begrenzung der Figur) L3: cmp dx,[speicher21] ;rechte Begrenzung erreicht, dann ja L5 ;keine Lcke mehr nach oben mov ax,dx ;Punkt gesetzt ? mov bx,bp call TestPunkt ;Nein, d.h. Lcke nach oben jnz La40 inc dx ;n„chste Spalte bearbeiten jmp L3 La40: push si push di mov ax,[speicher21] push ax mov ax,[speicher22] push ax mov ax,[speicher31] push ax mov ax,[speicher32] push ax mov ax,[speicher41] push ax mov ax,[speicher42] push ax mov ax,dx push ax mov bx,bp push bx Call AsmFill ;Fill-Routine aufrufen pop bp pop dx pop ax mov [speicher42],ax pop ax ;Nach Fllung der Lcke Variablen wieder mov [speicher41],ax pop ax ;vom Stack holen mov [speicher32],ax pop ax mov [speicher31],ax pop ax mov [speicher22],ax pop ax mov [speicher21],ax pop di pop si jmp L3 L5: mov bx,di ;linken Ausgangspunkt der Zeile inc bx ;nehmen (X und Y) fr weiteres Vorgehen mov bp,bx mov ax,si mov dx,ax mov [speicher32],bx ;Zeile merken mov [speicher42],bx call TestPunkt ;Punkt gesetzt ? jnz La4 ;Nein L6: inc dx ;Ja : Spalte solange erh”hen, bis mov ax,dx mov bx,bp Call TestPunkt ;entweder gesetzter Punkt gefunden wurde jnz La5 mov ax,[speicher21] ;oder Spalte gr”áer als rechte Begrenzung cmp dx,ax jna L6 ;darberliegenden Zeile ist (d.h. rechte ja La5 ;untere Ecke der Figur gefunden !!!) La4: dec dx ;Wenn Ursprungspunkt nicht gesetzt, Spalte mov ax,dx mov bx,bp ;solange vermindern, bis gesetzter Punkt call TestPunkt jnz La4 ;gefunden wird. inc dx La5: mov [speicher31],dx ;Spalte merken als linker Eckpunkt der Linie mov ax,[speicher21] cmp dx,ax ;Falls gr”áer als rechter Eckpunkt der jna L8 ;darberliegenden Linie, rechte, untere Ecke jmp La1 ;der Figur gefunden ,d.h. Fill-Ende L8: inc dx ;wenn nicht gr”áer: Rechten Eckpunkt der Linie mov ax,dx mov bx,bp ;suchen, indem Spalte erh”ht wird call TestPunkt jnz L8 dec dx mov ax,[speicher31] ;Linie zeichnen mov bx,[speicher32] mov cx,dx call ZieheLinie mov [speicher41],dx ;Spalte des rechten Eckpunktes der Linie merken mov ax,si ;Beginnt Linie weiter links als die dec ax cmp ax,[speicher31] ;darberliegende ??? ja La22 ;Ja, Sonderfall 1 jmp La8 La22: mov dx,si ;Sonderfall 1 : Figurzipfel auf linker mov bp,di ;Seite muá gefllt werden L9: dec dx mov ax,dx ;Freier Punkt gefunden, dann fllen mov bx,bp call TestPunkt jz La81 push si push di mov ax,[speicher21] push ax mov ax,[speicher22] push ax mov ax,[speicher31] push ax mov ax,[speicher32] push ax mov ax,[speicher41] push ax mov ax,[speicher42] push ax mov ax,dx push ax mov bx,bp push bx Call AsmFill ;Fill-Routine aufrufen pop bp pop dx pop ax mov [speicher42],ax pop ax ;Nach Fllung der Lcke Variablen wieder mov [speicher41],ax pop ax ;vom Stack holen mov [speicher32],ax pop ax mov [speicher31],ax pop ax mov [speicher22],ax pop ax mov [speicher21],ax pop di pop si La81: cmp dx,[speicher31] ;Nur bis zum linken Ausgangspunkt jnz L9 ;der Linie prfen La8: mov ax,[speicher41] ;Endet Linie weiter rechts als die inc ax ;darberliegende ??? cmp [speicher21],ax ja La21 ;Ja, Sonderfall 2 jmp La9 La21: mov dx,[speicher41] ;Sonderfall 2 : Figurzipfel auf rechter mov bp,[speicher42] ;Seite muá gefllt werden L10: inc dx mov ax,dx ;Freier Punkt gefunden, dann fllen mov bx,bp call TestPunkt jz La91 push si push di mov ax,[speicher21] push ax mov ax,[speicher22] push ax mov ax,[speicher31] push ax mov ax,[speicher32] push ax mov ax,[speicher41] push ax mov ax,[speicher42] push ax mov ax,dx push ax mov bx,bp push bx Call AsmFill ;Fill-Routine aufrufen pop bp pop dx pop ax mov [speicher42],ax pop ax ;Nach Fllung der Lcke Variablen wieder mov [speicher41],ax pop ax ;vom Stack holen mov [speicher32],ax pop ax mov [speicher31],ax pop ax mov [speicher22],ax pop ax mov [speicher21],ax pop di pop si La91: cmp dx,[speicher21] ;Nur bis zum rechten Endpunkt der jnz L10 ;Linie prfen La9: mov ax,[speicher41] ;Endet Linie weiter links als die dec ax ;darberliegende ??? cmp ax,[speicher21] ja La20 ;Ja, Sonderfall 3 jmp La10 La20: mov dx,[speicher21] ;Sonderfall 3: Figurzipfel an unterer Seite mov bp,[speicher22] ;muá gefllt werden L11: inc dx mov ax,dx ;Freier Punkt gefunden, dann fllen mov bx,bp call TestPunkt jz La101 push si push di mov ax,[speicher21] push ax mov ax,[speicher22] push ax mov ax,[speicher31] push ax mov ax,[speicher32] push ax mov ax,[speicher41] push ax mov ax,[speicher42] push ax mov ax,dx push ax mov bx,bp push bx Call AsmFill ;Fill-Routine aufrufen pop bp pop dx pop ax mov [speicher42],ax pop ax ;Nach Fllung der Lcke Variablen wieder mov [speicher41],ax pop ax ;vom Stack holen mov [speicher32],ax pop ax mov [speicher31],ax pop ax mov [speicher22],ax pop ax mov [speicher21],ax pop di pop si La101: cmp dx,[speicher41] ;Nur bis zum linken Ausgangspunkt der jnz L11 ;Linie prfen La10: mov si,[speicher31] ;Darberliegende Linie = aktuelle Linie mov di,[speicher32] mov ax,[speicher41] mov [speicher21],ax mov ax,[speicher42] mov [speicher22],ax jmp L5 ;n„chste Linie bearbeiten La1: ret ENDP ; FILL.ASM: Regelt die Parameterbernahme von Turbo Pascal aus fr ; die ASMFILL-Routine in Turbo Assembler ; ; Autor: Frank Riemenschneider ; ; Eingabe: Parameter der FILL-Funktion auf dem Stack ; Fill( X, Y, Farbe:WORD ); ; Ausgabe: keine CODESEG PROC Fill FAR XMP:WORD, YMP:WORD, FARB:WORD PUBLIC Fill mov ax, [FARB] mov [tcolor],ax mov ax, [XMP] ; Mittelpunkt-Koordinaten mov bx, [YMP] cmp ax, 239 ; X-Koordinate > 239? jg FillExit cmp bx, 63 ; Y-Koordinate > 63? jg FillExit push cx push dx push si push di push bp mov dx,[farbe] push dx mov dx,[fillcolor] mov [farbe],dx call AsmFill pop dx mov [farbe],dx pop bp pop di pop si pop dx pop cx FillExit: ret ; Back home ENDP