]> git.sur5r.net Git - cc65/commitdiff
Added clipping
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 22 Jun 2002 11:17:06 +0000 (11:17 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 22 Jun 2002 11:17:06 +0000 (11:17 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1320 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/tgi/tgi_bar.s

index 3f0050f647c42772a15d2518b4f120ecce82b517..439aa9d6960c94f8a401c2f655f14ec2805d6cad 100644 (file)
 
         .include        "tgi-kernel.inc"
 
-        .import         popax
         .importzp       ptr1, ptr2, ptr3, ptr4
+        .import         popax
+        .import         _tgi_getmaxx, _tgi_getmaxy
         .export         _tgi_bar
 
 _tgi_bar:
-        sta     ptr4            ; Get the coordinates
+        sta     ptr4            ; Y2
         stx     ptr4+1
+
         jsr     popax
-        sta     ptr3
+        sta     ptr3            ; X2
         stx     ptr3+1
+
         jsr     popax
-        sta     ptr2
+        sta     ptr2            ; Y1
         stx     ptr2+1
+
         jsr     popax
-        sta     ptr1
+        sta     ptr1            ; X1
         stx     ptr1+1
 
-        jmp     tgi_line        ; Call the driver
+; Make sure X1 is less than X2. Swap both if not.
+
+        lda     ptr3
+        cmp     ptr1
+        lda     ptr3+1
+        sbc     ptr1+1
+        bpl     @L1
+        lda     ptr3
+        ldy     ptr1
+        sta     ptr1
+        sty     ptr3
+        lda     ptr3+1
+        ldy     ptr1+1
+        sta     ptr1+1
+        sty     ptr3+1
+
+; Make sure Y1 is less than Y2. Swap both if not.
+
+@L1:    lda     ptr4
+        cmp     ptr2
+        lda     ptr4+1
+        sbc     ptr2+1
+        bpl     @L2
+        lda     ptr4
+        ldy     ptr2
+        sta     ptr2
+        sty     ptr4
+        lda     ptr4+1
+        ldy     ptr2+1
+        sta     ptr2+1
+        sty     ptr4+1
+
+; Check if X2 or Y2 are negative. If so, the bar is completely out of screen.
+
+@L2:    lda     ptr4+1
+        ora     ptr3+1
+        bmi     @L9             ; Bail out
+
+; Check if X1 is negative. If so, clip it to the left border (zero).
+
+        lda     #$00
+        bit     ptr1+1
+        bpl     @L3
+        sta     ptr1
+        sta     ptr1+1
+
+; Dito for Y1
+
+@L3:    bit     ptr2+1
+        bpl     @L4
+        sta     ptr2
+        sta     ptr2+1
+
+; Check if X2 is larger than the maximum x coord. If so, clip it.
+
+@L4:    lda     ptr3
+        cmp     _tgi_xres
+        lda     ptr3+1
+        sbc     _tgi_xres+1
+        bcs     @L5
+        jsr     _tgi_getmaxx
+        sta     ptr3
+        stx     ptr3+1
+
+; Check if Y2 is larger than the maximum y coord. If so, clip it.
+
+@L5:    lda     ptr4
+        cmp     _tgi_yres
+        lda     ptr4+1
+        sbc     _tgi_yres+1
+        bcs     @L6
+        jsr     _tgi_getmaxy
+        sta     ptr4
+        stx     ptr4+1
+
+; The coordinates are now valid. Call the driver.
+
+@L6:    jmp     tgi_bar
+
+; Error exit
+
+@L9:    rts