;**************************************** ; Elmar Kresse 19-INB-1 (2021) ; draw.asm ; file contains source code for ; drawing and maths for circle ; ; - draw_pixel MACRO x, y, c ; - circle_draw macro x, y, radius ; Reference Digital differential analyzer (graphics algorithm) ; https://en.wikipedia.org/wiki/Digital_differential_analyzer_(graphics_algorithm) ; ; - cross_draw MACRO x, y, d ; - rectangle_draw MACRO x, y, d ; - line_print_down PROC ; - line_print_straight PROC ; - paint_menu PROC FAR ; - prepare_display PROC ;**************************************** draw_pixel MACRO x, y, c push ax push bx push cx push dx MOV AH, 0Ch ;setzen der Konfig fürs schreiben MOV AL, c ; Farbe MOV BH, 00h ;Set Seitennummber MOV CX, x MOV DX, y INT 10h pop dx pop cx pop bx pop ax ENDM circle_draw macro x, y, radius push dx push cx push bx push ax ;Werte zurücksetzen mov balance, 0 mov ax, 0 mov bx, 0 ;Verschiebung Mitte add x, 60 add y, 60 mov bx, radius mov balance, radius neg balance zeichne_kreis_schleife: ;0 to 45 mov cx, x add cx, bx mov dx, y sub dx, ax draw_pixel cx, dx, 0Fh ;90 to 45 mov cx, x add cx, ax mov dx, y sub dx, bx draw_pixel cx, dx, 0Ch ;90 to 135 mov cx, x sub cx, ax mov dx, y sub dx, bx draw_pixel cx, dx, 04h ;180 to 135 mov cx, x sub cx, bx mov dx, y sub dx, ax draw_pixel cx, dx, 06h ;180 to 225 mov cx, x sub cx, bx mov dx, y add dx, ax draw_pixel cx, dx, 12h ;270 to 225 mov cx, x sub cx, ax mov dx, y add dx, bx draw_pixel cx, dx, 0Bh ;270 to 315 mov cx, x add cx, ax mov dx, y add dx, bx draw_pixel cx, dx, 01h ;360 to 315 mov cx, x add cx, bx mov dx, y add dx, ax draw_pixel cx, dx, 0Dh push dx mov dx, balance add dx, ax add dx, ax mov balance, dx pop dx cmp balance, 0 jl balance_negative ;balance_positive: dec bx push dx mov dx, balance sub dx, bx sub dx, bx mov balance, dx pop dx balance_negative: inc ax cmp ax, bx jg end_drawing jmp zeichne_kreis_schleife end_drawing: ; pause the screen for dos compatibility: pop ax pop bx pop cx pop dx endm cross_draw MACRO x, y, d push ax push bx push cx push dx ;Erste FOR Schleife nach rechts unten mov cx, x mov dx, y xor cx,cx ; cx-register is the counter, setn to 0 loop1: push cx mov cx, cx mov dx, y add dx, cx add cx, x draw_pixel cx, dx, 0Fh pop cx inc cx cmp cx, d ; cx vergleich mit der Größe (Dimension d) jle loop1 ; Loop while less or equal xor cx,cx ; cx-register is the counter, setn to 0 loop2: push cx mov cx, cx mov dx, y sub dx, cx add cx, x add dx, d draw_pixel cx, dx, 0Dh pop cx inc cx cmp cx, d ; cx vergleich mit der Größe (Dimension d) jle loop2 ; Loop while less or equal pop ax pop bx pop cx pop dx ENDM rectangle_draw MACRO x, y, d ;Verwaltet move und call mov cx, x mov dx, y mov x_wert, cx mov y_wert, dx mov d_wert, d call line_print_down call line_print_straight ENDM line_print_down PROC xor cx,cx ; cx-register is the counter, setn to 0 loop3: push cx mov cx, cx mov dx, y_wert add cx, x_wert draw_pixel cx, dx, 0Fh add dx, d_wert draw_pixel cx, dx, 0Fh pop cx inc cx cmp cx, d_wert ; cx vergleich mit der Größe (Dimension d) jle loop3 ; Loop while less or equal ret line_print_down endp line_print_straight PROC xor dx,dx ; cx-register is the counter, setn to 0 loop4: push dx mov dx, dx mov cx, x_wert add dx, y_wert draw_pixel cx, dx, 0Fh add cx, d_wert draw_pixel cx, dx, 0Fh pop dx inc dx cmp dx, d_wert ; cx vergleich mit der Größe (Dimension d) jle loop4 ; Loop while less or equal ret line_print_straight endp paint_menu PROC FAR push ax push bx push dx ;set pointer mov ah,2 mov dh,5 mov dl,14 mov bh,0 int 10h mov dx,offset title_str mov ah,9 int 21h ;set pointer mov ah,2 mov dh,6 mov dl,10 mov bh,0 int 10h mov dx,offset signature_str mov ah,9 int 21h ;set pointer mov ah,2 mov dh,7 mov dl,11 mov bh,0 int 10h cmp cx, 2 mov dx,offset cross_win je zeige_gewinner cmp cx, 3 mov dx,offset circle_win je zeige_gewinner cmp cx, 4 jne kein_gewinner mov ah,2 mov dh,7 mov dl,13 mov bh,0 int 10h mov dx,offset draw je zeige_gewinner zeige_gewinner: mov ah,9 int 21h kein_gewinner: ;set pointer mov ah,2 mov dh,9 mov dl,10 mov bh,0 int 10h mov dx,offset choose1_str mov ah,9 int 21h ;set pointer mov ah,2 mov dh,10 mov dl,10 mov bh,0 int 10h mov dx,offset choose2_str mov ah,9 int 21h pop ax pop bx pop dx ret paint_menu endp prepare_display PROC ;Videomode clear alles entfernen ;Spielfeld initialisieren rectangle_draw 80, 10, 405 ; Kreuz MACRO rectangle_draw 84, 14, 130 ; 1 rectangle_draw 218, 14, 130 ; 2 rectangle_draw 352, 14, 130 ; 3 rectangle_draw 84, 148, 130 ; 4 rectangle_draw 218, 148, 130 ; 5 rectangle_draw 352, 148, 130 ; 6 rectangle_draw 84, 282, 130 ; 7 rectangle_draw 218, 282, 130 ; 8 rectangle_draw 352, 282, 130 ; 9 ret prepare_display ENDP ;---------------------------------------- DRAW ENDE ---------------------------------------