home *** CD-ROM | disk | FTP | other *** search
/ Falcon 030 Power 2 / F030_POWER2.iso / ST_STE / MAGS / ICTARI08.ARJ / ictari.08 / GFA / BITMAP_S.GFA (.txt) < prev    next >
GFA-BASIC Atari  |  1994-01-08  |  3KB  |  124 lines

  1. '  --------  BEGIN constants  --------
  2. no_planes|=4                  ! Number of planes (1 to 16) => Colors
  3. plane_bits|=16                ! Size of each plane (in pixel bits): 8,16,24,32
  4. s_addr%=XBIOS(2)              ! EVEN bitmap address (in bytes)      ¯ ¯¯
  5. s_leng%=32000                 ! Bitmap length (in bytes): Needed for exist only
  6. '
  7. plane_size|=plane_bits| DIV 8
  8. block_size|=no_planes|*plane_size|
  9. total_blocks%=s_leng% DIV block_size|
  10. total_pixels%=total_blocks%*plane_bits|
  11. IF plane_size|=4
  12.   p_mask%=2^31-1
  13.   n_mask%=-2^31
  14.   plane_mask%=@sign(2^plane_bits|-1)
  15. ELSE
  16.   plane_mask%=2^plane_bits|-1
  17. ENDIF
  18. '  --------  END constants  --------
  19. '
  20. '
  21. '  --------  BEGIN main program  --------
  22. color%=3
  23. pixel%=319+199*320
  24. IF pixel%<total_pixels%
  25.   write_pixel(pixel%,color%)
  26.   PRINT @read_pixel(pixel%)
  27. ENDIF
  28. '
  29. pixel%=0
  30. WHILE pixel%<total_pixels%
  31.   write_pixel(pixel%,color%)
  32.   INC pixel%
  33. WEND
  34. '
  35. PRINT CHR$(7);
  36. ~INP(2)
  37. EDIT
  38. '  --------  END main program  --------
  39. '
  40. '
  41. '  --------  BEGIN utilities  --------
  42. FUNCTION sign(long#)
  43.   IF long#>p_mask%
  44.     ADD long#,n_mask%
  45.     long#=long# OR n_mask%
  46.   ENDIF
  47.   RETURN long#
  48. ENDFUNC
  49. '
  50. '
  51. > FUNCTION read_plane(b_addr%,plane_count|)
  52.   LOCAL l_addr%,plane%
  53.   l_addr%=s_addr%+b_addr%+plane_count|*plane_size|
  54.   IF plane_size|=1
  55.     plane%=PEEK(l_addr%)
  56.   ELSE IF plane_size|=2
  57.     plane%=DPEEK(l_addr%)
  58.   ELSE IF plane_size|=3
  59.     plane%=PEEK(l_addr%)*65536+PEEK(l_addr%+1)*256+PEEK(l_addr%+2)
  60.   ELSE
  61.     plane%=LPEEK(l_addr%)
  62.   ENDIF
  63.   RETURN plane%
  64. ENDFUNC
  65. '
  66. > PROCEDURE write_plane(b_addr%,plane_count|,plane%)
  67.   LOCAL l_addr%
  68.   l_addr%=s_addr%+b_addr%+plane_count|*plane_size|
  69.   IF plane_size|=1
  70.     POKE l_addr%,plane%
  71.   ELSE IF plane_size|=2
  72.     DPOKE l_addr%,plane%
  73.   ELSE IF plane_size|=3
  74.     POKE l_addr%,plane% DIV 65536
  75.     POKE l_addr%+1,plane% DIV 256
  76.     POKE l_addr%+2,plane% MOD 256
  77.   ELSE
  78.     LPOKE l_addr%,plane%
  79.   ENDIF
  80. RETURN
  81. '
  82. > FUNCTION read_pixel(pixel%)  !--SPEEDY--
  83.   LOCAL b_addr%,mask%,plane_count|,plane%,color%
  84.   b_addr%=(pixel% DIV plane_bits|)*block_size|
  85.   IF plane_size|=4
  86.     mask%=@sign(2^(plane_bits|-pixel% MOD plane_bits|-1))
  87.   ELSE
  88.     mask%=2^(plane_bits|-pixel% MOD plane_bits|-1)
  89.   ENDIF
  90.   plane_count|=0
  91.   color%=0
  92.   WHILE plane_count|<no_planes|
  93.     plane%=@read_plane(b_addr%,plane_count|)
  94.     IF (plane% AND mask%) DIV mask%=1
  95.       color%=color% OR 2^plane_count|
  96.     ENDIF
  97.     INC plane_count|
  98.   WEND
  99.   RETURN color%
  100. ENDFUNC
  101. '
  102. > PROCEDURE write_pixel(pixel%,color%)  !--SPEEDY--
  103.   LOCAL b_addr%,mask%,plane_count|,plane%
  104.   b_addr%=(pixel% DIV plane_bits|)*block_size|
  105.   IF plane_size|=4
  106.     mask%=@sign(2^(plane_bits|-pixel% MOD plane_bits|-1))
  107.   ELSE
  108.     mask%=2^(plane_bits|-pixel% MOD plane_bits|-1)
  109.   ENDIF
  110.   plane_count|=0
  111.   WHILE plane_count|<no_planes|
  112.     plane%=@read_plane(b_addr%,plane_count|)
  113.     IF (color% AND 2^plane_count|) DIV 2^plane_count|=1
  114.       plane%=plane% OR mask%
  115.     ELSE
  116.       plane%=mask% XOR plane_mask% AND plane%
  117.     ENDIF
  118.     write_plane(b_addr%,plane_count|,plane%)
  119.     INC plane_count|
  120.   WEND
  121. RETURN
  122. '
  123. '  --------  END utilities  --------
  124.