cc65/libsrc/tgi/tgi_outcode.s

99 lines
2.0 KiB
ArmAsm

;
; Ullrich von Bassewitz, 2009-10-25
;
; Generates clipping outcodes for Cohen Sutherland and others.
;
.include "tgi-kernel.inc"
.include "zeropage.inc"
;----------------------------------------------------------------------------
; Data
.bss
; Clipping coordinates. They must be in this order!
tgi_clip_x1: .res 2
tgi_clip_y1: .res 2
tgi_clip_x2: .res 2
tgi_clip_y2: .res 2
;----------------------------------------------------------------------------
; Generate a Cohen Sutherland outcode
;
; void outcode ()
; {
; unsigned char o = 0;
; if (Y < 0) {
; o = TGI_CLIP_BOTTOM;
; } else if (Y >= yres) {
; o = TGI_CLIP_TOP;
; }
; if (X < 0) {
; o |= TGI_CLIP_LEFT;
; } else if (X >= xres) {
; o |= TGI_CLIP_RIGHT;
; }
; return o;
; }
;
; The function return the outcode in A and the flags for the outcode are
; correctly set.
;
.code
.proc tgi_outcode
lda #TGI_CLIP_NONE
sta tmp1
; Check Y coordinate
lda tgi_clip_y1+1,y ; High byte of Y1
bmi L2 ; Jump if bottom clip
ldx tgi_clip_y1,y ; Low byte of Y1
cpx _tgi_yres
sbc _tgi_yres+1
bvs L1
eor #$80
L1: bpl L4
lda #TGI_CLIP_TOP ; Top clipping necessary
bne L3
L2: lda #TGI_CLIP_BOTTOM
L3: sta tmp1 ; Save temp outcode
; Check X coordinate
L4: lda tgi_clip_x1+1,y ; High byte of X1
bmi L7 ; Jump if left clip
ldx tgi_clip_x1,y ; Low byte of X1
cpx _tgi_xres
sbc _tgi_xres+1
bvs L5
eor #$80
L5: bmi L6
; No right or left clipping necessary
lda tmp1
rts
; Need right clipping
L6: lda #TGI_CLIP_RIGHT
ora tmp1
rts
; Need left clipping
L7: lda #TGI_CLIP_LEFT
ora tmp1
rts
.endproc