Shop OBEX P1 Docs P2 Docs Learn Events
Trench demo in VGA — Parallax Forums

Trench demo in VGA

PatMPatM Posts: 72
edited 2007-07-04 05:10 in Propeller 1
Still stuggling away....

I've been trying to get the trench demo to run in vga. I think I have most of it done - my monitor does display something! I commented out most of the graphics and just have it set the tile colours, but that ends up showing the tiles as a mishmash of colours with random looking noise in then. I'm probably just missing one little thing that'd make it all work and I'm hoping someone can spot it.

graphics.spin and vga.spin have not been modified in any way (one file at a time is quite enough for me!)

' //////////////////////////////////////////////////////////////////////
' Color rotation demo, creates 3D trench effect
' AUTHOR: Andre' LaMothe
' LAST MODIFIED: 5.15.06
' VERSION 1.0
' 256x192, 4 colors, bitmapped, quadrant I, mapped to screen, (0,0) at
' lower bottom left
' Use the gamepad up/down to speed up/slow down the color rotation
' //////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////
' CONSTANTS SECTION ////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////
CON
  _clkmode = xtal2 + pll8x            ' enable external clock and pll times 4
  _xinfreq = 10_000_000 + 0000        ' set frequency to 10 MHZ plus some error
  _stack = ($3000 + $3000 + 64) >> 2  ' accomodate display memory and stack
  ' graphics driver and screen constants
  PARAMCOUNT        = 21        
  'OFFSCREEN_BUFFER  = $2000           ' offscreen buffer, unused in this template
  ONSCREEN_BUFFER   = $3000           ' onscreen buffer ** Originally $5000 but [url=mailto:320x240@2bpp]320x240@2bpp[/url] is 19,200 bytes $4B00
  ' size of graphics tile map          $7FFF - $4B00 = $34FF so $5000 wouldn't be good
  X_TILES           = 20
  Y_TILES           = 15
  
  SCREEN_WIDTH      = 320
  SCREEN_HEIGHT     = 240 
  ' color constant's to make setting colors for parallax graphics setup easier
  COL_Black       = %0000_0010
  COL_DarkGrey    = %0000_0011
  COL_Grey        = %0000_0100
  COL_LightGrey   = %0000_0101
  COL_BrightGrey  = %0000_0110
  COL_White       = %0000_0111 
  COL_PowerBlue   = %0000_1_100 
  COL_Blue        = %0001_1_100
  COL_SkyBlue     = %0010_1_100
  COL_AquaMarine  = %0011_1_100
  COL_LightGreen  = %0100_1_100
  COL_Green       = %0101_1_100
  COL_GreenYellow = %0110_1_100
  COL_Yellow      = %0111_1_100
  COL_Gold        = %1000_1_100
  COL_Orange      = %1001_1_100
  COL_Red         = %1010_1_100
  COL_VioletRed   = %1011_1_100
  COL_Pink        = %1100_1_100
  COL_Magenta     = %1101_1_100
  COL_Violet      = %1110_1_100
  COL_Purple      = %1111_1_100
  ' each palette entry is a LONG arranged like so: color 3 | color 2 | color 1 | color 0
  COLOR_0 = (COL_Black  << 0)
  COLOR_1 = (COL_Red    << 8)
  COLOR_2 = (COL_Red    << 16)
  COLOR_3 = (COL_White  << 24)  

  ' button ids/bit masks
  ' NES bit encodings general for state bits
  NES_RIGHT  = %00000001
  NES_LEFT   = %00000010
  NES_DOWN   = %00000100
  NES_UP     = %00001000
  NES_START  = %00010000
  NES_SELECT = %00100000
  NES_B      = %01000000
  NES_A      = %10000000

'//////////////////////////////////////////////////////////////////////////////
' VARIABLES SECTION ///////////////////////////////////////////////////////////
'//////////////////////////////////////////////////////////////////////////////
VAR
  long  vga_status      'status: off/visible/invisible  read-only       (21 contiguous longs)
  long  vga_enable      'enable: off/on                 write-only
  long  vga_pins        'pins: byte(2),topbit(3)        write-only
  long  vga_mode        'mode: interlace,hpol,vpol      write-only
  long  vga_videobase   'video base @word               write-only
  long  vga_colorbase   'color base @long               write-only              
  long  vga_hc          'horizontal cells               write-only
  long  vga_vc          'vertical cells                 write-only
  long  vga_hx          'horizontal cell expansion      write-only
  long  vga_vx          'vertical cell expansion        write-only
  long  vga_ho          'horizontal offset              write-only
  long  vga_vo          'vertical offset                write-only
  long  vga_hd          'horizontal display pixels      write-only
  long  vga_hf          'horizontal front-porch pixels  write-only
  long  vga_hs          'horizontal sync pixels         write-only
  long  vga_hb          'horizontal back-porch pixels   write-only
  long  vga_vd          'vertical display lines         write-only
  long  vga_vf          'vertical front-porch lines     write-only
  long  vga_vs          'vertical sync lines            write-only
  long  vga_vb          'vertical back-porch lines      write-only
  long  vga_rate        'pixel rate (Hz)                write-only
  
  long  vga_screen      'pointer to screen (words)      write-only
  long  vga_colors      'pointer to colors (longs)
{  word  screen[noparse][[/noparse]screensize]
  long  col, row, color
  long  boxcolor,ptr
  long  stack[noparse][[/noparse]100]
}
{VAR
  long  vga_status     '0/1/2 = off/visible/invisible           read-only
  long  vga_enable     '0/? = off/on                            write-only
  long  vga_pins       '%ppmmm = pins                           write-only
  long  vga_mode       '%ccinp = chroma,interlace,ntsc/pal,swap write-only
  long  vga_screen     'pointer to screen (words)               write-only
  long  vga_colors     'pointer to colors (longs)               write-only               
  long  vga_hc         'horizontal cells                        write-only
  long  vga_vc         'vertical cells                          write-only
  long  vga_hx         'horizontal cell expansion               write-only
  long  vga_vx         'vertical cell expansion                 write-only
  long  vga_ho         'horizontal offset                       write-only
  long  vga_vo         'vertical offset                         write-only
  long  vga_broadcast  'broadcast frequency (Hz)                write-only
  long  vga_auralcog   'aural fm cog                            write-only
}
  word  screen[noparse][[/noparse]X_TILES * Y_TILES] ' storage for screen tile map
  long  colors[noparse][[/noparse]64]                ' color look up table
  long palette[noparse][[/noparse]4]                  ' used to shadows colors
  ' nes gamepad vars
  long nes_buttons
 '//////////////////////////////////////////////////////////////////////////////
' OBJECT DECLARATION SECTION //////////////////////////////////////////////////
'//////////////////////////////////////////////////////////////////////////////
OBJ
  'tv    : "vga_drv_010.spin"          ' instantiate a tv object
  vga   : "vga.spin"
  gr    : "graphics_drv_010.spin"    ' instantiate a graphics object
  gpad  : "gamepad_drv_001.spin"     ' gamepad driver
  
'//////////////////////////////////////////////////////////////////////////////
' PUBLIC FUNCTIONS ////////////////////////////////////////////////////////////
'//////////////////////////////////////////////////////////////////////////////
PUB start | i, dx, dy, x, y, y_inv ,t, temp_color, rotation_rate
  'start vga
  longmove(@vga_status, @vgaparams, paramcount)
  vga_screen := @screen
  vga_colors := @colors
  vga.start(@vga_status)
  'init colors, each tile has same 4 colors
  palette[noparse][[/noparse]0] := COL_Black  
  palette[noparse][[/noparse]1] := COL_Violet
  palette[noparse][[/noparse]2] := COL_Violet
  palette[noparse][[/noparse]3] := COL_White   
   
  repeat i from 0 to 63
    colors[noparse][[/noparse]i] := (palette[noparse][[/noparse]3] << 24) | (palette[noparse][[/noparse]2] << 16)  | (palette[noparse][[/noparse]1] << 8) | (palette[noparse][[/noparse]0] << 0)
    
  'init tile screen
  repeat dx from 0 to vga_hc - 1
    repeat dy from 0 to vga_vc - 1
      screen[noparse][[/noparse]dy * vga_hc + dx] := onscreen_buffer >> 6 + dy + dx * vga_vc + ((dy & $3F) << 10)
{
    UNUSED CODE DELETED FOR CLARITY

}
    ' END RENDERING SECTION ///////////////////////////////////////////////////
  ' END MAIN GAME LOOP REPEAT BLOCK ///////////////////////////////////////////
'//////////////////////////////////////////////////////////////////////////////
' DATA SECTION ////////////////////////////////////////////////////////////////
'//////////////////////////////////////////////////////////////////////////////
DAT
' VGA PARAMS FOR DRIVER
vgaparams               long  0                 'status: off/visible/invisible  read-only       (21 contiguous longs)
                        long  1                 'enable: off/on                 write-only
                        long  %010_111                 'pins: byte(2),topbit(3)        write-only
                        long  %0011                 'mode: interlace,hpol,vpol      write-only
                        long  0                 'video base @word               write-only
                        long  0                 'color base @long               write-only              
                        long  X_TILES           'horizontal cells               write-only
                        long  Y_TILES           'vertical cells                 write-only
                        long  1                 'horizontal cell expansion      write-only
                        long  1                 'vertical cell expansion        write-only
                        long  0                 'horizontal offset              write-only
                        long  0                 'vertical offset                write-only
                        long  320               'horizontal display pixels      write-only
                        long  21                'horizontal front-porch pixels  write-only
                        long  40                'horizontal sync pixels         write-only
                        long  41                'horizontal back-porch pixels   write-only
                        long  240               'vertical display lines         write-only
                        long  1                 'vertical front-porch lines     write-only
                        long  1                 'vertical sync lines            write-only
                        long  19                'vertical back-porch lines      write-only
                        long  15_000_000        'pixel rate (Hz)                write-only
 

Comments

  • PatMPatM Posts: 72
    edited 2007-07-02 20:42
    Well, I've kept at it but still no luck. The random garbage on screen initially made me think it was a problem with video memory being overwritten. Looking deeper, I think its a matter of the vga.spin starting at memory location zero and what I'm seeing is a graphic representation of the program.

    Looking at the original trench demo, I cannot for the life of me see where the address of the video memory is passed to the vga driver, yet it somehow knows exactly where to look and same thing with the colors array.

    What am I missing? I know its going to be something simple. It always is.

    PS - Yes, I tried putting the screen and colors into the vgaparams list. Of course, the pointers are in variables and variables are verboten in a constants listing.
    ·
  • PatMPatM Posts: 72
    edited 2007-07-02 20:57
    DING!

    I got it... It was something simple of course.

    In the DAT section the screen and colors pointers were zero because those are assigned in runtime and the dat is constant. The vga variables list also has vga_screen and vga_colors, but those are type declarations so no value.

    At the beginning of pub start, longmove is used to move the DAT data into the vga variables THEN the screen and colors pointers are assigned to the vga_screen and vga_colors. Of course it hit me after I gave up and went to do something completely different.

    I now have the trench demo working in VGA! The colors need adjusting though, not nearly the same on a VGA monitor.
  • JT CookJT Cook Posts: 487
    edited 2007-07-02 22:38
    That is cool, can you post the source of it working? I want to try it out.
  • PatMPatM Posts: 72
    edited 2007-07-03 01:30
    Ok, here's what I ended up with for the trench. The original button method of speeding it up and slowing it down doesn't work now. I had to greatly increase the rotation_rate variable to slow down the colour cycling. It was so fast that the colours were blending and ending up yellow instead of white etc. I was going to come up with a different way of changing the speed, but moved on to experimenting with graphics_drv_010.
  • Shane De CataniaShane De Catania Posts: 67
    edited 2007-07-04 02:41
    OK I give up... where do I find graphics_drv_010.spin?

    Cheers,
    S
  • QuattroRS4QuattroRS4 Posts: 916
    edited 2007-07-04 03:51
    Shane,
    Did a bit of a search ... found it here ...

    www.parallax.com/dl/sw/HYDRA_Demos_Source_Teaser.zip

    loads of stuff in this zip file - you will find it under the 'hydra trench archive'

    Quattro

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    'Necessity is the mother of invention'

    Post Edited (QuattroRS4) : 7/4/2007 4:29:13 AM GMT
  • Harrison.Harrison. Posts: 484
    edited 2007-07-04 05:10
    Woah. I didn't know that was online for downloading. I thought most of those files were for the hydra cd only...
Sign In or Register to comment.