I'm not sure what you mean loosing coordinates, but scrolling can be very complex (actually I've been trying to make a very simple scrolling program all day just to answer this question... and it took me quite awhile)
depending on the game you are making, how you do scrolling could change quite a bit. this example I've made is huge, but it shows a basic form of scrolling and hopefully isn't too hard to understand.
if you play with the "visx" and "visy" variables you should be able to see some scalabilty.. and hopefully slow the program down to a reasonable level.
`NUMBER OF ON-SCREEN SQUARES X&Y
visx = 10
xspacer = 640/visx
`ARRAY of screen positions
DIM screen_X(visx)
FOR count = 0 to visx
screen_X(count) = xspacer*count
NEXT count
visy = 10
yspacer = 480/visy
`ARRAY of screen positions
DIM screen_Y(visy)
FOR count = 0 to visy
screen_Y(count) = yspacer*count
NEXT count
`initial map variables
tilex = 0
tiley = 0
`RANDOM MAP
DIM map(100,100)
FOR COUNT = 0 to 100
FOR YCOUNT = 0 TO 100
Map(count,ycount) = RND(2)+1
NEXT YCOUNT
NEXT COUNT
TEXTURES(xspacer,yspacer)
DRAWMAP(visx,visy,tilex,tiley)
`character sprite
spritex=0
spritey=0
`the sprites positions are associated with the 2 screen coordinate arrays
sprite 100,screen_X(spritex),screen_Y(spritey),4
`\\\\\\\\\\\\\\\\\\
`MAIN LOOP
`\\\\\\\\\\\\\\\\\\\
DO
wait 10
inc tilex
if tilex > 90 then tilex = 0
DRAWMAP(visx,visy,tilex,tiley)
GOSUB SPRITE_MOVMENT
LOOP
`\\\\\\\\\\\\\\\\
`MOVMENT SUBROUTINE
`\\\\\\\\\\\\\\\\\
SPRITE_MOVMENT:
if upkey() = 1 and spritey > 0
dec spritey
sprite 100,screen_X(spritex),screen_Y(spritey),4
endif
if downkey() = 1 and spritey < 9
inc spritey
sprite 100,screen_X(spritex),screen_Y(spritey),4
endif
if leftkey() = 1 and spritex > 0
dec spritex
sprite 100,screen_X(spritex),screen_Y(spritey),4
endif
if rightkey() = 1 and spritex < 9
inc spritex
sprite 100,screen_X(spritex),screen_Y(spritey),4
endif
RETURN
FUNCTION DRAWMAP(visx,visy,tilex,tiley)
`this map is actually composed of sprites
`that are associated with the map array
xnum=0
ynum=0
SP = 1
FOR xnum = 0 TO visx-1
FOR ynum = 0 TO visy-1
inc SP
spriteimage00 = map(tilex+xnum,tiley+ynum)
SPRITE 99+SP,screen_X(xnum),screen_Y(ynum),spriteimage00
SET SPRITE 99+SP,0,1
NEXT ynum
NEXT xnum
ENDFUNCTION
FUNCTION TEXTURES(xspacer,yspacer)
`there are some simple textures
CREATE BITMAP 1,xspacer,yspacer
ink RGB(100,0,0),RGB(100,0,0)
box 1,1,xspacer,yspacer
get image 1,0,0,xspacer,yspacer
CLS
ink RGB(0,100,0),RGB(0,100,0)
box 1,1,xspacer,yspacer
get image 2,0,0,xspacer,yspacer
CLS
ink RGB(0,0,100,),RGB(0,0,100)
box 1,1,xspacer,yspacer
get image 3,0,0,xspacer,yspacer
cls
circle xspacer/2,yspacer/2,5
circle xspacer/2,yspacer/2,10
circle xspacer/2,yspacer/2,15
get image 4,0,0,xspacer,yspacer
cls
DELETE BITMAP 1
ENDFUNCTION
...that move was indeed...Bold.