あまりコード書くと正体バレそうだけど、まあいいや。例えばこのようにして使います。

// マップデータ
byte[][] map = new byte[MAP_WIDTH * MAP_HEIGHT];
final int PATTERN_WIDTH = 16;
final int PATTERN_HEIGHT = 16;

...

// メインループ内の背景描画

// BG面の描画範囲を決める。mapX、mapYはマップ表示座標(ドット単位)
int x0 = mapX / PATTERN_WIDTH;
int y0 = mapY / PATTERN_HEIGHT;
int x1 = (mapX + WIDTH - 1) / PATTERN_WIDTH; 
int y1 = (mapY + HEIGHT - 1) / PATTERN_HEIGHT;

for (int iy = y0; iy <= y1; iy++) {
    for (int ix = x0; ix <= x1; ix++) {
        // 表示される領域を描画
        // Bgクラスのキャッシュ機構で、drawImageの呼び出しは最小限に抑えられる。
        bg.put(ix, iy, map[iy * MAP_WIDTH + ix]);
    }
}
bg.draw(g, mapX, mapY);