gzoomを使わず、celput,gsquare,grotateなどを利用してはいかがでしょう。
celputでは拡大縮小後のサイズではなく、
倍率で指定する形になるので、循環小数になるような倍率になる場合は注意が必要ですが
上手く使えば1ドットのズレも対処可能です。
screen 0, 401, 401, 0;
color 0, 0, 255:boxf;
// バッファ1 背景,赤 円,黒
buffer 1, 200, 200, 0;
color 255, 0, 0:boxf;
color 0, 0, 0:circle 0, 0, 199, 199, 1;
// バッファ2 拡大用縮小画像
buffer 2, 100, 100, 0;
gzoom 100, 100, 1, 0, 0, 200, 200;
gsel 0;
color 255, 255, 255;
gmode 0:pos 0, 0;
gcopy 1, 0, 0, 200, 200;
mes "gcopy\nバッファ1\n通常コピー";
gmode 2:pos 201, 0;
gcopy 1, 0, 0, 200, 200;
mes "gcopy\nバッファ1\n黒透過コピー";
gmode 2:pos 0, 201;
gzoom 200, 200, 2, 0, 0, 100, 100;
mes "gzoom\nバッファ2\n黒透過拡大コピー";
gmode 2:pos 201, 201;
celput 2, 0, 2.0, 2.0, 0.0;
pos 201, 201;
mes "celput\nバッファ2\n黒透過拡大コピー\n\ncelputでは\nposの位置も更新される";