Screen flipping and multiple screen buffers with GFABASIC

From Atari Wiki
Revision as of 10:03, 5 July 2006 by Simonsunnyboy (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
'
' SWITCH - routines and small library for usage of a doublebuffered screen
' (c) 2005 by Simon Sunnyboy / Paradize         http://paradize.atari.org/
'
' This routine gives you two additional screens in memory so you
' can draw a picture on one screen while displaying another.
' Additionally you get a third screen as a buffer for a background
' or to scroll things around.
'
' I used similar routines for about 10 years but I never bothered
' to make a library or include file out of it.
' USE AT YOUR OWN RISK!
'
' call initpage23 once at the start of your program
' make sure to call reset23 even in case of error (ON ERROR GOSUB ...)
' or you probably will disturb normal screen management
'
> PROCEDURE initpage23
  LOCAL hilf2%,hilf3%
  ' get address of current screen, it is reused by our routines!
  physbase%=XBIOS(2)
  oldphysbase%=physbase%
  ' get memory for two additional screens
  ' feel free to rewrite it to use MALLOC() :)
  res32s2$=STRING$(32256,"0")
  res32s3$=res32s2$
  hilf2%=VARPTR(res32s2$)
  hilf3%=VARPTR(res32s3$)
  logbase%=(hilf2%+256) AND &HFFFFFF00
  background%=(hilf3%+256) AND &HFFFFFF00
  '
  CLS
  scopy(physbase%,logbase%)
  scopy(physbase%,background%)
RETURN
' scopy(src%,dest%)
' coyp contents of screen src% to screen dest%
> PROCEDURE scopy(pagea%,pageb%)
  BMOVE pagea%,pageb%,32000
RETURN
' switch()
' use this to flip screens
' screen physbase% is displayed, draw things to logbase%
' GFA commands will from now on automatically draw to logbase%
> PROCEDURE switch
  VSYNC
  SWAP physbase%,logbase%
  ~XBIOS(5,L:logbase%,L:physbase%,L:-1)
RETURN
' switch_background()
' use this to flip screens and copy your third background to the
' new workscreen in one go
> PROCEDURE switch_background
  VSYNC
  SWAP physbase%,logbase%
  ~XBIOS(5,L:logbase%,L:physbase%,L:-1)
  scopy(background%,logbase%)
RETURN
' draw_hidden()
' show screen physbase% but draw to screen logbase%
> PROCEDURE draw_hidden
  ~XBIOS(5,L:logbase%,L:physbase%,L:-1)
RETURN
' draw_normal()
' show and draw to physbase% (all GFA output is directly visible)
> PROCEDURE draw_normal
  ~XBIOS(5,L:physbase%,L:physbase%,L:-1)
RETURN
' reset23()
' clean up and go back to the initial screen
> PROCEDURE reset23
  ~XBIOS(5,L:oldphysbase%,L:oldphysbase%,L:-1)
RETURN