Try your example with something a little more defined that circles.... Let's use simple lines:

`DECLARE SUB FourBIT (x1%, y1%, x2%, y2%, Filename$)`

SCREEN 12

CLS: RANDOMIZE TIMER

FOR i = 0 TO 639

clr = i MOD 16

LINE (i, 0)-(i, 479), clr

NEXT

SLEEP

WINDOW SCREEN(0, 0)-(799, 599) '800x600 image surface

FourBIT 0, 0, 799, 599, "BIG-BMP"

WINDOW

SUB FourBIT (x1%, y1%, x2%, y2%, Filename$) 'SCREEN 12 bitmap maker

'fullscreen takes about 8 seconds

DIM FileCOLORS%(1 TO 48)

DIM Colors4%(0 TO 15)

IF INSTR(UCASE$(Filename$), ".BMP") = 0 THEN

Filename$ = RTRIM$(LEFT$(Filename$, 8)) + ".BMP"

END IF

FileTYPE$ = "BM"

Reserved1% = 0

Reserved2% = 0

OffsetBITS& = 118

InfoHEADER& = 40

PictureWIDTH& = (x2% - x1%) + 1

PictureDEPTH& = (y2% - y1%) + 1

NumPLANES% = 1

BPP% = 4

Compression& = 0

WidthPELS& = 3780

DepthPELS& = 3780

NumCOLORS& = 16

IF PictureWIDTH& MOD 8 <> 0 THEN

ZeroPAD$ = SPACE$((8 - PictureWIDTH& MOD 8) \ 2)

END IF

ImageSIZE& = (((PictureWIDTH& + LEN(ZeroPAD$)) * PictureDEPTH&) + .1) / 2

FileSize& = ImageSIZE& + OffsetBITS&

OUT &H3C7, 0 'start at color 0

FOR n = 1 TO 48 STEP 3

FileCOLORS%(n) = INP(&H3C9)

FileCOLORS%(n + 1) = INP(&H3C9)

FileCOLORS%(n + 2) = INP(&H3C9)

NEXT n

OPEN Filename$ FOR BINARY AS #1

'Header bytes

PUT #1, , FileTYPE$ '2 '1 to 2

PUT #1, , FileSize& '4

PUT #1, , Reserved1% 'should be zero '2

PUT #1, , Reserved2% 'should be zero '2

PUT #1, , OffsetBITS& '4

PUT #1, , InfoHEADER& '4

PUT #1, , PictureWIDTH& '4

PUT #1, , PictureDEPTH& '4

PUT #1, , NumPLANES% '2

PUT #1, , BPP% '2

PUT #1, , Compression& '4

PUT #1, , ImageSIZE& '4

PUT #1, , WidthPELS& '4

PUT #1, , DepthPELS& '4

PUT #1, , NumCOLORS& '4

PUT #1, , SigCOLORS& '4 '51 - 54

u$ = " " 'unused byte

FOR n% = 1 TO 46 STEP 3 'PUT as BGR order colors

Colr$ = CHR$(FileCOLORS%(n% + 2) * 4)

PUT #1, , Colr$

Colr$ = CHR$(FileCOLORS%(n% + 1) * 4)

PUT #1, , Colr$

Colr$ = CHR$(FileCOLORS%(n%) * 4)

PUT #1, , Colr$

PUT #1, , u$ 'add Unused byte

NEXT n%

FOR y = y2% TO y1% STEP -1 'Place from bottom up

FOR x = x1% TO x2% STEP 2 'nibble steps

HiX = POINT(x, y): Colors4%(HiX) = 1 'added here

LoX = POINT(x + 1, y): Colors4%(LoX) = 1

HiNIBBLE$ = HEX$(HiX)

LoNIBBLE$ = HEX$(LoX)

HexVAL$ = "&H" + HiNIBBLE$ + LoNIBBLE$

a$ = CHR$(VAL(HexVAL$))

PUT #1, , a$

NEXT x

PUT #1, , ZeroPAD$

NEXT y

FOR n = 0 TO 15

IF Colors4%(n) = 1 THEN SigCOLORS& = SigCOLORS& + 1

NEXT n

PUT #1, 51, SigCOLORS& 'new PUT

CLOSE #1

END SUB

Run this, and look at your screen. It'll sleep on you before it saves it. Click a key, let it save it.

Does the image match what was on your screen??