10 rem LRUN in console
12 CLS
14 CLCHP
16 clr = $ffaa00: rem Some RGB colour
18 nm$ = '': rem 'ram1_' & hex$(clr, 24) & '_spr'
20 spr = MkBlk64(44, 56, clr, nm$)
22 if spr > 0 then
24  if jobid then
26   sprw; 10, 2, spr
28   pause: quit
30  else
32   sprw#1; 10, 2, spr
34  endif
36 else
38  beep 2000, 2: rem Saved
40 endif
42 :
44 :
1000 rem + ------------------------------------------------------------------------ +
1002 rem |<                                MkBlk64                                 >|
1004 rem + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +
1006 rem |          Make a mode 64 single colour, compressed, block sprite          |
1008 rem |                                                                          |
1010 rem | Save sprite (with overwrite!) if filename supplied, else keep memory     |
1012 rem | No error checking!                                                       |
1014 rem + ------------------------------------------------------------------------ +
1016 rem | V0.01, pjw, 2021 Nov 14                                                  |
1018 rem | V0.01, pjw, 2022 Nov 07, tidied                                          |
1020 rem + ------------------------------------------------------------------------ +
1022 :
1024 def fn MkBlk64(xs%, ys%, col, fnm$)
1026 loc i%, ad, tg, bp%, ez%, c$(5)
1028 loc d%, r%, sz, lz, cz
1030 :
1032 rem     Work out compressed data size
1034 bp% = 4:                                rem mode 64 => 4 bpp
1036 ez% = bp% + 1:                          rem compressed element size 5b
1038 lz = xs% * ys%:                         rem logical size
1040 sz = lz * bp%:                          rem actual data size
1042 d% = lz div 128:                        rem number of max compressed blocks
1044 r% = lz mod 128:                        rem remainder
1046 cz = ez% * (d% + (r% <> 0)) + 32:       rem compressed sprite size
1048 ad = ALCHP(cz)
1050 :
1052 rem     Convert RGB to count + colour 24
1054 poke_l ad, col: poke   ad, 129:         rem create element sample:
1056 c$ = peek$(ad, ez%):                    rem c$ = count.b + col24
1058 :
1060 rem     Create sprite header
1062 POKE   ad,       2, 64, 0:              rem GD2 mode 64 sprite..
1064 POKE   ad +  3, %1000011:               rem pattern compressed, dont cache
1066 POKE_W ad +  4, xs%, ys%, 0, 0:         rem size, origen
1068 POKE_L ad + 12, 12,  0, 0:              rem offset to data
1070 poke$  ad + 24, 'RLE4':                 rem compression header
1072 poke_l ad + 28, sz:                     rem expanded data size
1074 tg = ad + 32  :                         rem target address for sprite data
1076 :
1078 rem     Now create sprite
1080 for i% = 1 to d%: poke$ tg, c$: tg = tg + ez%
1082 if r%: poke$ tg, c$: poke tg, 257 - r%: rem remainder
1084 :
1086 rem     Save sprite (if wanted)
1088 if len(fnm$) then
1090  sbytes_o fnm$, ad, cz: rechp ad: return 0: rem save and forget
1092 endif
1094 return ad:                              rem dont save and keep in mem
1096 enddef MkBlk64
1098 :
1100 :
