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 >
Wrap
GFA-BASIC Atari
|
1994-01-08
|
3KB
|
124 lines
' -------- BEGIN constants --------
no_planes|=4 ! Number of planes (1 to 16) => Colors
plane_bits|=16 ! Size of each plane (in pixel bits): 8,16,24,32
s_addr%=XBIOS(2) ! EVEN bitmap address (in bytes) ¯ ¯¯
s_leng%=32000 ! Bitmap length (in bytes): Needed for exist only
'
plane_size|=plane_bits| DIV 8
block_size|=no_planes|*plane_size|
total_blocks%=s_leng% DIV block_size|
total_pixels%=total_blocks%*plane_bits|
IF plane_size|=4
p_mask%=2^31-1
n_mask%=-2^31
plane_mask%=@sign(2^plane_bits|-1)
ELSE
plane_mask%=2^plane_bits|-1
ENDIF
' -------- END constants --------
'
'
' -------- BEGIN main program --------
color%=3
pixel%=319+199*320
IF pixel%<total_pixels%
write_pixel(pixel%,color%)
PRINT @read_pixel(pixel%)
ENDIF
'
pixel%=0
WHILE pixel%<total_pixels%
write_pixel(pixel%,color%)
INC pixel%
WEND
'
PRINT CHR$(7);
~INP(2)
EDIT
' -------- END main program --------
'
'
' -------- BEGIN utilities --------
FUNCTION sign(long#)
IF long#>p_mask%
ADD long#,n_mask%
long#=long# OR n_mask%
ENDIF
RETURN long#
ENDFUNC
'
'
> FUNCTION read_plane(b_addr%,plane_count|)
LOCAL l_addr%,plane%
l_addr%=s_addr%+b_addr%+plane_count|*plane_size|
IF plane_size|=1
plane%=PEEK(l_addr%)
ELSE IF plane_size|=2
plane%=DPEEK(l_addr%)
ELSE IF plane_size|=3
plane%=PEEK(l_addr%)*65536+PEEK(l_addr%+1)*256+PEEK(l_addr%+2)
ELSE
plane%=LPEEK(l_addr%)
ENDIF
RETURN plane%
ENDFUNC
'
> PROCEDURE write_plane(b_addr%,plane_count|,plane%)
LOCAL l_addr%
l_addr%=s_addr%+b_addr%+plane_count|*plane_size|
IF plane_size|=1
POKE l_addr%,plane%
ELSE IF plane_size|=2
DPOKE l_addr%,plane%
ELSE IF plane_size|=3
POKE l_addr%,plane% DIV 65536
POKE l_addr%+1,plane% DIV 256
POKE l_addr%+2,plane% MOD 256
ELSE
LPOKE l_addr%,plane%
ENDIF
RETURN
'
> FUNCTION read_pixel(pixel%) !--SPEEDY--
LOCAL b_addr%,mask%,plane_count|,plane%,color%
b_addr%=(pixel% DIV plane_bits|)*block_size|
IF plane_size|=4
mask%=@sign(2^(plane_bits|-pixel% MOD plane_bits|-1))
ELSE
mask%=2^(plane_bits|-pixel% MOD plane_bits|-1)
ENDIF
plane_count|=0
color%=0
WHILE plane_count|<no_planes|
plane%=@read_plane(b_addr%,plane_count|)
IF (plane% AND mask%) DIV mask%=1
color%=color% OR 2^plane_count|
ENDIF
INC plane_count|
WEND
RETURN color%
ENDFUNC
'
> PROCEDURE write_pixel(pixel%,color%) !--SPEEDY--
LOCAL b_addr%,mask%,plane_count|,plane%
b_addr%=(pixel% DIV plane_bits|)*block_size|
IF plane_size|=4
mask%=@sign(2^(plane_bits|-pixel% MOD plane_bits|-1))
ELSE
mask%=2^(plane_bits|-pixel% MOD plane_bits|-1)
ENDIF
plane_count|=0
WHILE plane_count|<no_planes|
plane%=@read_plane(b_addr%,plane_count|)
IF (color% AND 2^plane_count|) DIV 2^plane_count|=1
plane%=plane% OR mask%
ELSE
plane%=mask% XOR plane_mask% AND plane%
ENDIF
write_plane(b_addr%,plane_count|,plane%)
INC plane_count|
WEND
RETURN
'
' -------- END utilities --------