There are much better methods. It's more efficient to use a bitmap that is about one tilesize larger than the screen. For example if you're running a 640x480 resolution and your tile size are 32x32 then you'll want your bitmap size to be 672x512 (640+32 x 480+32).
Draw what you need on the bitmap, in this case we can fit 20x15 tiles onto the screen so we make a loop that'll draw that plus 1 to both the x & y counts. Use the copy bitmap statement and copy over what is needed. When you scroll out of bounds just simply redraw the tiles with the new increments and reset your scrolling variables. I'm really not good with words, so check out the codes

.
gosub Initialize
do
gosub ExampleScrolling
text 0,0,"FPS:"+str$(screen fps())
sync
cls
loop
Initialize:
set display mode 640,480,32
sync on
sync rate 0
REM Create Bitmap
#constant BitmapTerrain 1
create bitmap BitmapTerrain,640+32,480+32
REM Bitmap 0 is the screen.
set current bitmap 0
REM Create Tiles
#constant PointerTiles 1000
for lp = 0 to 9
cls rgb(rnd(255),0,0)
get image PointerTiles+lp,0,0,32,32,1
next lp
REM Create Array 64x64
dim Terrain(63,63)
REM Setting Randome Tile Data
for y = 0 to 63
for x = 0 to 63
Terrain(x,y) = rnd(9)
next x
next y
return
ExampleScrolling:
gosub HandleKeys
gosub HandleDisplay
return
HandleKeys:
if upkey()
dec ScrollY
if ScrollY <= 0
ScrollY = 32
TerrainFlag = 0
dec ViewY
endif
endif
if leftkey()
dec ScrollX
if ScrollX <= 0
ScrollX = 32
TerrainFlag = 0
dec ViewX
endif
endif
if rightkey()
inc ScrollX
if ScrollX >= 32
ScrollX = 0
TerrainFlag = 0
inc ViewX
endif
endif
if downkey()
inc ScrollY
if ScrollY >= 32
ScrollY = 0
TerrainFlag = 0
inc ViewY
endif
endif
return
HandleDisplay:
if TerrainFlag = 0
TerrainFlag = 1
set current bitmap BitmapTerrain
cls
for y = 0 to 15
for x = 0 to 20
TerrainX = x+ViewX
TerrainY = y+ViewY
REM Out of Array bounds Check!
if TerrainX > -1 and TerrainY > -1 and TerrainX <= 63 and TerrainY <= 63
REM If you EVER plan to paste sprites, you only need ONE :)
sprite 1,-32,-32,PointerTiles+Terrain(TerrainX,TerrainY)
paste sprite 1,x*32,y*32
endif
next lpx
next lpy
set current bitmap 0
endif
REM Copy from the Bitmap onto the Screen.
copy bitmap BitmapTerrain,ScrollX,ScrollY,640+ScrollX,480+ScrollY, 0,0,0,640,480
return
This example is just a basics of how to get this method to work, there are also more advance ways to work with this that'll keep the graphics smooth.