DECLARE SUB paletteGet (array() AS INTEGER) DECLARE SUB paletteSet (array() AS INTEGER) DECLARE SUB toneGrayscale (array() AS INTEGER) DECLARE SUB toneSepia (array() AS INTEGER) CONST DAC.PELMask = &H3C6 ' DAC (Digital/Analog Converter) PEL Mask Register CONST DAC.READ = &H3C7 ' DAC Read Port/DAC State Register CONST DAC.WRITE = &H3C8 ' DAC Write Port/DAC State Register CONST DAC.DATA = &H3C9 ' DAC Data Port ' Palette buffer DIM clr(0 TO 767) AS INTEGER ' Enter Mode 13 (320x200, 256 colors) SCREEN 13 ' Display the whole color palette FOR y% = 0 TO 15 FOR x% = 0 TO 15 LINE (x% * 10, y% * 10)-STEP(9, 9), x% + (y% * 16), BF NEXT x% NEXT y% ' Wait for user input COLOR 15: LOCATE 3, 25: PRINT "Press a key - 1": SLEEP paletteGet clr() ' get palette toneSepia clr() ' modify paletteSet clr() ' set palette ' Wait for user input COLOR 15: LOCATE 3, 25: PRINT "Press a key - 2": SLEEP paletteGet clr() ' get palette toneGrayscale clr() ' modify paletteSet clr() ' set palette ' Read original palette, {array} must be (0 to 767) SUB paletteGet (array() AS INTEGER) OUT DAC.PELMask, &HFF ' Mask all registers OUT DAC.READ, 0 ' Select first attribute FOR i% = 0 TO 767 ' Read all 768 components array(i%) = INP(DAC.DATA) NEXT i% END SUB ' Set palette, {array} must be (0 to 767) SUB paletteSet (array() AS INTEGER) OUT DAC.PELMask, &HFF ' Mask all registers OUT DAC.WRITE, 0 ' Select first attribute FOR i% = 0 TO 767 ' Set all 768 components OUT DAC.DATA, array(i%) NEXT i% END SUB ' Convert palette to Grayscale SUB toneGrayscale (array() AS INTEGER) DIM grey AS INTEGER FOR i% = 0 TO 767 STEP 3 grey = array(i%) * .299 + array(i% + 1) * .587 + array(i% + 2) * .114 array(i%) = grey array(i% + 1) = grey array(i% + 2) = grey NEXT i% END SUB ' Convert palette to sepia SUB toneSepia (array() AS INTEGER) DIM r AS INTEGER, g AS INTEGER, b AS INTEGER FOR i% = 0 TO 767 STEP 3 r = array(i%) * .393 + array(i% + 1) * .769 + array(i% + 2) * .189 g = array(i%) * .349 + array(i% + 1) * .686 + array(i% + 2) * .168 b = array(i%) * .272 + array(i% + 1) * .534 + array(i% + 2) * .131 IF (r > 63) THEN array(i%) = 63 ELSE array(i%) = r IF (g > 63) THEN array(i% + 1) = 63 ELSE array(i% + 1) = g IF (b > 63) THEN array(i% + 2) = 63 ELSE array(i% + 2) = b NEXT i% END SUB