The following code demonstration shows how GET and PUT can be used to place a sprite on a background image using a mask.
DIM Image(3000) AS INTEGER
SCREEN 9
PALETTE 'reset colors to normal visible ones
PALETTE 12, 26 'Set DAC which do not respond to OUT
PALETTE 10, 0 'set palette values for DAC attributes
'set palette values for attributes that respond to OUT
OUT &H3C8, 0: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, 12 'background: midnight blue
OUT &H3C8, 1: OUT &H3C9, 21: OUT &H3C9, 63: OUT &H3C9, 21 'green demo text
OUT &H3C8, 2: OUT &H3C9, 32: OUT &H3C9, 32: OUT &H3C9, 32 'medium ship gray
OUT &H3C8, 3: OUT &H3C9, 22: OUT &H3C9, 12: OUT &H3C9, 5 'meteor highlight brown
OUT &H3C8, 4: OUT &H3C9, 63: OUT &H3C9, 0: OUT &H3C9, 0 'bright red
OUT &H3C8, 5: OUT &H3C9, 52: OUT &H3C9, 52: OUT &H3C9, 52 'ship light gray
MaxWIDTH = 83 + 280: MaxDEPTH = 200 + 60: x = 280: y = 200
RESTORE ShipData
DO
READ Count, Colr 'read RLE compressed data field
FOR reps = 1 TO Count
PSET (x, y), Colr
x = x + 1
IF x > MaxWIDTH THEN x = 280: y = y + 1
NEXT reps
LOOP UNTIL y > MaxDEPTH 'y start + 60
Align 14, 2, "Working with Sprites and Masks"
COLOR 12: LOCATE 3, 4: PRINT "No matter how you create your sprite, you will need to GET it to an array"
LOCATE 4, 4: PRINT "so that you can place the image on the Active Page. The page is cleared"
LOCATE 5, 4: PRINT "and the image is placed at a slightly different position to give motion to"
LOCATE 6, 4: PRINT "the sprite. In a game a player can determine the motions also."
Align 12, 22, "The Sprite was produced using the compressed ShipData field."
Align 14, 23, "GET and PUT work much faster than redrawing an image every page!"
Press 13, 8, "Press a key to GET and PUT the ship!"
Align 12, 22, "PUT in default XOR mode has no problem with attribute 0 backgrounds!"
Align 12, 23, "However it will distort colors when PUT over other attribute colors."
GET (280, 200)-(83 + 280, 260), Image(0)
PUT(100, 200), Image(0)
COLOR 14: LOCATE 20, 15: PRINT "SPRITE";
_DELAY 3
Align 14, 8, "Creating a Mask to use with Backgrounds"
COLOR 12: LOCATE 9, 4: PRINT "Below I have created a sprite from the Chapter Introduction's DATA field."
LOCATE 10, 4: PRINT "We create the mask to use the advantages of the PUT AND action verb later."
LOCATE 11, 4: PRINT "That property allows white to display any colored objects underneath it!"
LOCATE 12, 4: PRINT "Change attribute 0 to 15 and all others black using a POINT and PSET scan:"
Press 13, 24, "Press a key to Create the Mask"
Eraser 8, 12: Eraser 22, 23
COLOR 11: LOCATE 8, 4: PRINT " FOR xx = 0 TO 83 'scanned sprite was actually in top left corner"
LOCATE 9, 4: PRINT " FOR yy = 0 TO 60"
LOCATE 10, 4: PRINT " IF POINT(xx, yy) = 0 THEN PSET (xx, yy), 15 ELSE PSET (xx, yy), 0"
LOCATE 11, 4: PRINT " NEXT yy"
LOCATE 12, 4: PRINT " NEXT xx"
LOCATE 13, 4: PRINT " GET (0, 0)-(83, 60), Image(1500) 'mask indexed into array"
Align 13, 22, "Mask procedure slowed for demonstration purposes!"
FOR xx = 280 TO 83 + 280
_DELAY .03
FOR yy = 200 TO 260
IF POINT(xx, yy) = 0 THEN PSET (xx, yy), 15 ELSE PSET (xx, yy), 0
NEXT yy
NEXT xx
GET (280, 200)-(83 + 280, 260), Image(1500)
COLOR 14: LOCATE 20, 38: PRINT "MASK"
Align 12, 22, "Now we have created a black background for PUT XOR to place the Sprite!"
Align 12, 23, "For black colors in an image, set RGB = 0 values to a non-0 attribute."
Press 13, 24, "Press a key to PUT the Mask on a background!"
Eraser 8, 13
Align 14, 8, "Using PUT to place the Mask in AND mode"
COLOR 12: LOCATE 9, 4: PRINT "First we create a background that is not black and PUT the Mask at a new"
LOCATE 10, 4: PRINT "position. Then we PUT the Sprite over the mask at the same coordinates: "
CIRCLE (496, 230), 40, 14: PAINT STEP(0, 0), 14
CIRCLE (500, 230), 40, 3: PAINT STEP(0, 0), 3
_DELAY 3
Align 11, 12, "PUT(440, 200), Image(1500), AND 'mask "
PUT(440, 200), Image(1500), AND
Press 13, 24, "Press a key to PUT the Sprite over the Mask using XOR!"
PUT(440, 200), Image(0)
Align 11, 13, "PUT(440, 200), Image(0) 'sprite"
Eraser 22, 23
Align 12, 22, "The GET for the mask was array indexed 1500 from the Sprite's 0 index!"
Align 12, 23, "PUT in default XOR mode, only places the Sprite on the black portions."
END
ShipData: 'ship data and image created by Bob Sequin
DATA 34,0,1,5,73,0,7,5,4,7,1,15,73,0,6,5,1,7,77,0,6,5,1,7,77,0,6,5,1,7
DATA 77,0,5,5,2,7,77,0,4,5,3,7,77,0,3,5,5,7,76,0,8,7,76,0,9,7,75,0,10,7
DATA 74,0,11,7,73,0,12,7,69,0,2,5,1,2,7,7,3,5,3,7,3,5,2,7,61,0,1,8,3,5
DATA 1,2,6,7,1,5,3,7,1,5,3,7,10,5,55,0,1,8,2,7,2,2,6,7,1,2,3,7,1,2
DATA 4,7,7,5,2,2,1,15,54,0,1,8,2,7,2,2,6,7,1,2,3,7,1,2,5,7,6,5,2,2
DATA 1,15,54,0,1,8,1,7,3,2,7,7,3,2,12,7,2,2,1,5,46,0,1,8,7,5,1,8,4,2
DATA 22,7,2,2,1,5,46,0,1,8,7,5,1,8,4,2,22,7,2,2,47,0,1,8,12,5,22,7,44,0
DATA 4,4,2,8,6,7,8,5,2,7,11,2,7,7,1,5,41,0,2,4,4,14,2,8,6,7,6,2,3,5
DATA 1,7,1,2,9,7,1,2,8,7,1,5,39,0,1,4,2,14,4,15,2,8,6,7,9,2,1,5,1,2
DATA 9,7,1,2,8,7,2,5,37,0,1,4,1,14,6,15,2,8,6,7,21,2,7,7,5,5,2,9,1,15
DATA 1,4,1,15,2,9,1,7,1,5,27,0,1,4,2,14,4,15,2,8,6,7,13,2,13,7,10,5,8,7
DATA 1,15,25,0,2,4,4,14,2,8,7,7,15,2,9,7,13,5,6,7,1,5,27,0,4,4,2,8,25,2
DATA 36,5,21,0,2,8,10,2,36,5,2,10,4,9,1,15,2,9,2,7,6,5,1,15,18,0,2,8,8,7
DATA 2,2,36,7,4,10,2,9,1,5,4,9,1,5,6,12,1,5,17,0,2,8,8,7,2,2,36,7,4,10
DATA 2,9,1,7,4,9,1,5,6,12,1,5,6,15,11,0,2,8,8,7,2,2,36,7,4,10,2,9,1,7
DATA 4,9,1,5,6,12,1,5,17,0,2,8,8,5,38,2,2,10,4,9,1,2,2,9,8,7,1,5,14,0
DATA 4,4,2,8,25,5,36,2,15,0,2,4,4,14,2,8,7,7,15,5,12,7,10,5,6,7,1,5,24,0
DATA 1,4,2,14,4,15,2,8,6,7,13,5,13,7,10,5,8,7,1,15,23,0,1,4,1,14,6,15,2,8
DATA 5,7,1,2,11,5,10,2,2,7,10,5,2,9,1,15,1,4,1,15,2,9,1,7,1,5,27,0,1,4
DATA 2,14,4,15,2,8,4,7,2,2,9,5,2,2,9,7,1,2,1,7,9,5,39,0,2,4,4,14,2,8
DATA 3,7,3,2,6,5,3,2,1,7,1,2,9,7,1,2,9,5,42,0,4,4,2,8,2,7,12,2,2,7
DATA 11,2,8,5,48,0,1,8,14,2,8,7,12,5,49,0,1,8,7,2,1,8,3,5,1,2,9,7,15,5
DATA 47,0,1,8,7,2,1,8,3,5,1,2,8,7,10,5,1,7,3,5,2,2,1,15,54,0,1,8,3,5
DATA 1,2,6,7,1,5,1,7,2,15,7,5,1,7,4,5,2,2,1,15,54,0,1,8,8,7,2,5,1,7
DATA 3,5,1,15,5,5,2,7,4,5,2,2,1,5,54,0,1,8,2,7,2,2,4,7,2,5,1,7,3,5
DATA 1,7,4,5,2,7,5,5,2,2,1,5,54,0,1,8,1,7,3,2,3,7,3,5,1,7,3,5,1,7
DATA 3,5,3,7,5,5,2,2,57,0,3,2,3,7,4,5,3,7,3,5,5,2,66,0,4,7,8,5,72,0
DATA 6,7,5,5,73,0,5,7,5,5,74,0,5,7,4,5,75,0,5,7,3,5,76,0,6,7,2,5,76,0
DATA 7,7,77,0,7,7,77,0,7,7,77,0,7,7,77,0,7,7,76,0,11,7,1,15,82,0,1,5,49,0
DATA 16,0,6,4,3,0,3,4,5,14,2,0,2,4,2,14,5,15,1,0,2,4,1,14,7,15,2,0,2,4
DATA 2,14,5,15,3,0,3,4,5,14,5,0,6,4,60,0,6,4,3,0,3,4,5,14,2,0,2,4,2,14
DATA 5,15,1,0,2,4,1,14,7,15,2,0,2,4,2,14,5,15,3,0,3,4,5,14,5,0,6,4,11,0
'sub programs are for demonstration text only
SUB Align (Tclr, Trow, txt$)
Tcol = 41 - (LEN(txt$) \ 2)
COLOR Tclr: LOCATE Trow, Tcol: PRINT txt$;
END SUB
SUB Press (Tclr, Trow, Text$)
DO: LOOP UNTIL INKEY$ = ""
Align Tclr, Trow, Text$
DO: SLEEP: LOOP UNTIL INKEY$ <> ""
Align Tclr, Trow, SPACE$(LEN(Text$))
END SUB
SUB Eraser (Srow, Erow)
FOR R = Srow TO Erow
LOCATE R, 4: PRINT SPACE$(75)
NEXT
END SUB
Code by Bob Seguin and Ted Weissgerber
Note: The DATA is read as the number of pixels to color and the color attribute in the compressed the data field.