A83: Pixel/Line/Rectangle Routines. =)
[Prev][Next][Index][Thread]
A83: Pixel/Line/Rectangle Routines. =)
Ok, I followed up on that Pixel Routine that I posted about earlier today,
with these Line and Rectangle Routines. I've tested them all, and they work
just fine, but I'd like everybody look at them and see if theres a better way
to do these. Maybe tell me how to speed them up much more, or if there's a few
shortcuts I can use to save bytes. I'm thinking about posting these routines
at 'ticalc.org', and I'll be sure to give credit where credit is due in the
text files, but help me to optimize these routines some more before then.
Thanks a lot everybody for ANY feedback... =)
--Jason K.
;-----------------------------------------------------------------------;
; Pixel Plotting Routine - By Jason Kovacs, with ZLIB's GetPix Routine. ;
;-----------------------------------------------------------------------;
; Input: D = X, E = Y, C = Pixel Color (0-Clear, 1-Plot, 2-XOR Pixel). ;
; Output: Pixel is Plotted to Graph Buffer according to Command in 'C'. ;
;-----------------------------------------------------------------------;
PIXEL:
push bc ; Save Loop Value and Color
push de ; Save the Coordinates
ld a, c ; Load this to check which Color
cp 0
call z, PIXEL_WHITE ; Execute PIXEL_WHITE if C=0
cp 1
call z, PIXEL_BLACK ; Execute PIXEL_BLACK if C=1
cp 2
call z, PIXEL_XORIT ; Execute PIXEL_XORIT if C=2
pop de ; Retrieve the Coords for Other Routines
pop bc ; Retrieve the Loop Value and Color
ret
PIXEL_WHITE:
ld a, d ; 'a' now has X Coordinate
call GETPIX ; Call the Pixel Routine from ZLIB
CPL ; Compliment 'a' for the correct Bit Mask
AND (hl) ; 'AND' to Clear the Pixel
ld (hl), a ; Write the new byte to Graph Buffer
ld a, 0 ; Reload this for use with the CPs above
ret
PIXEL_BLACK:
ld a, d ; 'a' now has X Coordinate
call GETPIX ; Call the Pixel Routine from ZLIB
OR (hl) ; 'OR' to Plot the Pixel
ld (hl), a ; Write the new byte to Graph Buffer
ld a, 1 ; Reload this for use with the CPs above
ret
PIXEL_XORIT:
ld a, d ; 'a' now has X Coordinate
call GETPIX ; Call the Pixel Routine from ZLIB
XOR (hl) ; 'XOR' to Toggle the Pixel
ld (hl), a ; Write the new byte to Graph Buffer
ret ; No need to reload A, done with CPs.
;-----------------------------------------------------------------------;
; Horizontal Line Routine - By Jason Kovacs - Used with PIXEL Routine. ;
;-----------------------------------------------------------------------;
; Input: DE = Starting (X,Y) B = Length of Line (Including first X). ;
; C = Color Of Line (0-White Line, 1-Black Line, 2-XOR Line). ;
; Output: Horizontal Line drawn to Graph Buffer according to the Color. ;
;-----------------------------------------------------------------------;
H_Line:
push de
push hl
H_Line_Loop:
call PIXEL
inc d
djnz H_Line_Loop
pop hl
pop de
ret
;-----------------------------------------------------------------------;
; Vertical Line Routine - By Jason Kovacs - Used with PIXEL Routine. ;
;-----------------------------------------------------------------------;
; Input: DE = Starting (X,Y) B = Length of Line (Including first Y). ;
; C = Color Of Line (0-White Line, 1-Black Line, 2-XOR Line). ;
; Output: Vertical Line drawn to Graph Buffer according to the Color. ;
;-----------------------------------------------------------------------;
V_Line:
push de
push hl
V_Line_Loop:
call PIXEL
inc e
djnz V_Line_Loop
pop hl
pop de
ret
;-----------------------------------------------------------------------;
; Rectangle Drawing Routine - By Jason K. - Uses H_Line and V_Line. ;
;-----------------------------------------------------------------------;
; Input: DE = Upper-Left Coordinates, HL = Lower-Right Coordinates. ;
; C = Color Of Lines (0-White Line, 1-Black Line, 2-XOR Line). ;
; Output: The Outline of a Rectangle is Drawn to the Graph Buffer. ;
;-----------------------------------------------------------------------;
RECT_OUTLINE:
call H_Distance
call H_Line
call V_Distance
call V_Line
push de
call V_Distance
ld d, h
call V_Line
pop de
push de
call H_Distance
ld e, l
call H_Line
pop de
ret
H_Distance:
ld a, h
sub d
inc a
ld b, a
ret
V_Distance:
ld a, l
sub e
inc a
ld b, a
ret
;-----------------------------------------------------------------------;
; Rectangle Filling Routine - By Jason K. - Uses H_Line & Dist.Routines ;
;-----------------------------------------------------------------------;
; Input: DE = Upper-Left Coordinates, HL = Lower-Right Coordinates. ;
; C = Color Of Lines (0-White Line, 1-Black Line, 2-XOR Line). ;
; Output: Rectangular Section of Graph Buffer is filled according to C. ;
;-----------------------------------------------------------------------;
RECT_FILL:
call H_Distance
ld h, b
call V_Distance
RECT_LOOP:
push bc
ld b, h
call H_Line
inc e
pop bc
djnz RECT_LOOP
ret
H_Distance:
ld a, h
sub d
inc a
ld b, a
ret
V_Distance:
ld a, l
sub e
inc a
ld b, a
ret
Follow-Ups: