Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Topics - Gary

I have a program I am working on that requires a few very large arrays to be set up on start up as look up tables. The amount of data in each of them is anything up to 200,000 entries.

I have the entries in a text document ready to paste into a DIMDATA line but it looks like GLBasic can't handle really really long line in the editor and just locks up when I paste the data in

Is there any other solution to my problem without having to resort to reading in the data from a file at start up and also can GLB handle arrays of that size?

For the project I am working on I need to set the version and copyright information on a windows EXE file so that when you right click, properties, and then detail (windows 10) it shows all the embedded information like the screen below. I need it to be like the one on the left but mine is the one on the right. I have tried setting it all up in project options but it does not seem to want to carry over to the exe. Is there a 3rd party tool I can use to add the info or can GLB do it directly?


Everything was fine yesterday, came to start coding today and getting a crash almost straight away on editor start up, the normal windows xp error "GLBasic has encountered a problem and needs to close"

Is there an ini file somewhere that stores what the last files opened were? Im wondering if that could have got corrupted. Don't want to do a clean install as I am using an old version which works fine for the project I'm working on

Ive noticed a strange quirk of my add in that when I run it in debug mode I do not hear a windows exclamation beep but if I turn off debug mode I am getting the sound which is a bit annoying.

Does anyone know where I could be going wrong? I am using version 10 (Yes I know, very old but I'm reluctant to upgrade until the project is finished as it could mess up the whole project) on a windows xp computer. Upgrading the main system is not an option before anyone says stick windows 10 on it :) I would have thought if there was an error (like missing file etc) causing the exclamation sound that the debug window would have shown the error

GLBasic - en / DLL and HWND
I have a DLL which I need to include in a program. I have got it all loading and opening properly but I am struggling with one of the commands I need to set up.

In the manual that came with the DLL is has visual studio examples and the one im struggling with at the moment is this one

Code (glbasic) Select

BP_StartDLL = (bp_bool_hwnd) GetProcAddress (DllModule, "BP_StartDLL");

and it says to call it you need to do the following

Code (glbasic) Select
RetVal = (*BP_StartDLL)(myhWnd);

Now I thought I had found out how to do it from the help and set things up like this

Code (glbasic) Select
DECLARE_ALIAS(BPStartDLL, "gamesocket.dll", "BP_StartDLL", (bool hwnd), int);

in the part where I load the DLL and declare all the functions


Code (glbasic) Select
return 255;

In the actual StartDLL function but it is refusing to talk to the other program it is supposed to. I think it is getting the wrong HWND value.

Anyone got any ideas where I am going wrong?

I am wondering if there is an easy way for GLB to do the following

I have a display that is currently drawn as a single screen of 1024 wide and 1526 high to display over 2 screens within windows. I now need to draw it as a screen 2048 wide and 768 high with the screen that starts at 1024,0 being what was drawn as the top screen.

Can I use my existing draw routine and then create a sprite for each of the halves of the screens and then redraw in the new positions?

its something like this I'm after

current screen layout
-        -
-    x   -
-        -
-        -
-    y   -
-        -

new screen layout
-        --       -
-   y    --   x   -
-        --       -

Dont suppose there is anyone on here who is part of the xbox preview program is there? Would love to try out the backwards compatibility stuff but it seems to become a member you have to be invited by someone who is on the program. So just thought I would ask if there was anyone on here who is.

Been a while since I did a build for release on the app store so wondered if there was any step by step instructions for making sure the app gets uploaded correctly with the correct certs etc as it looks like things have changed a lot in the last 4 years.

Is there any automatic way of getting the build date of the program to display when it starts running? or do I have to manually change the date in a string with every new build?
I know this is way off topic but I am hoping that someone may be able to help.

I have a list of 1000 url addresses that add free bonuses into a facebook game im playing and each url needs to be clicked in turn to add the bonus. Now I know you can get Java to use to automatically open a new window/tab for each url but I cant think how to automate it in with php to open a text file, read in the first line, open the url, wait 5 seconds, close the window and then grab the next url and so on. Has anyone done anything similar or know how I can do it?

I did wonder if GLB could do it with its web commands but as you need to be logged onto facebook to get the bonus it needs to be opened in a proper browser window so I discounted a quick GLB project

Hope someone has some ideas that might work


Would it be possible to add a mem2wav option much like the mem2sprite function (and a loadwavmem command)? This would then allow basic sound manipulation (like speed up and slow down by altering the sample frequency) on the fly and give the option to generate tones without the use of wav files being prebuilt before hand. Also any music and sounds could be hidden in the source rather than being separate files that could be ripped out

I have found what I think is an issue with passing a variable to a subroutine.  Example code

Code (glbasic) Select


FOR i = 0 TO 10
GOSUB printi


SUB printi:
DEBUG i+"\r\n"

I would expect the output to be

but instead I get

if I make a copy of the variable used in the for loop it passes to the routine correctly.

It almost looks like a variable used in a for loop is not the same variable as the globally defined one. See the code below for a better explanation

Code (glbasic) Select

GLOBAL i=100

FOR i = 0 TO 10
GOSUB printi


SUB printi:
DEBUG i+"\r\n"

this will display

in the debug window

Using a function also does the same thing

I am looking to write a simple converter from a sound eprom from a fruit machine which is encoded for an oki M6876 chip in 4 bit adpcm format into wav files.

I have found some source code that does the job apparently (funny enough the guy who wrote it bought an unknown board from an electrical shop and was curious to know what was on the sound proms on there. The board is the one I want to do the decoder for, so the code is written already :) ). The problem is I don't know what BASIC it is written in, it wont compile with any of the VB editions I have and thats about the only other one I know.

I'm wondering if any of the more knowledgeable members could have a look and let me know if they recognise what BASIC it is and also any pointers to converting it to GLB would be great. Everything looks fairly straight forward but if there are any particular commands that don't have a GLB equivalent it would be good to know before I start.


Code (glbasic) Select

' ADPCM decoder. this code decompresses the contents of a speech chip sound ROM set that
' is 4 bit ADPCM encoded. A table of addresses at the start of the ROM is used to find
' the start of the individual samples, the end, and the sample length, is calculated from
' the sample block sizes. this version saves the decompressed samples as eight bit 16ksps
' mono .wav files with the hex start address of the sample as the file name

' 05/04/06

SCREEN 12 ' 640 x 480 x 16
CLS ' clear it

DEFINT A-Z ' all integers except where defined

DIM stepadj(7) ' step index adjust, 0 to 7
DIM steptable(48) ' step size table, 0 to 48
DIM wavaddr&(127) ' sample start addresses
adrcount% = 0 ' number of sample addresses found

RESTORE stepadj ' read the step index adjust table
FOR i = 0 TO 7
  READ stepadj(i)

RESTORE steptable ' read the step size table
FOR i = 0 TO 48
  READ steptable(i)

OPEN "snd_2.rom" FOR BINARY AS #1 ' open input file

i& = 3 ' skip unknown start bytes

  GOSUB GetLong ' get address longword
  wavaddr&(adrcount%) = llong& ' save address
  adrcount% = adrcount% + 1 ' increment address count
  PRINT RIGHT$("00000" + HEX$(llong&), 6); "  "; ' display address

PRINT  adrcount% - 1; "addresses found";
adrcount% = adrcount% - 2 ' correct for zero term and zero
' count start

FOR wavfiles% = 0 to adrcount% ' for each sample
  filename$ = RIGHT$("00000" + HEX$(wavaddr&(wavfiles%)), 6) + ".wav"
  OPEN filename$ FOR OUTPUT AS #2 ' open output file
  PRINT "File "; filename$; ' show file name
  GOSUB GetLength ' get the sample length
  GOSUB WriteRIFF ' write the header chunk
  GOSUB WriteFORMAT ' write the format chunk
  GOSUB WriteDATA ' write the data chunk
  CLOSE #2 ' close output file

CLOSE #1 ' close input file

PRINT "Done. Any key to exit." ' show file name

LOOP WHILE INKEY$="" ' wait for a key


' get the sample size. the sample is arranged into blocks, the first byte of the block
' is the byte count for the remainder of the block + $80. the sample is terminated by
' a block count of zero

  sslength& = 0 ' reset length
  i& = wavaddr&(wavfiles%) ' sample start address
    GOSUB GetByte ' read block length
    byte% = byte% AND 127 ' mask block length
    sslength& = sslength& + byte% ' add this chunk length
    i& = i& + byte% ' index to next chunk length
  LOOP WHILE byte% ' zero length is end marker

' write RIFF header chunk

  PRINT #2, "RIFF"; ' always there
  samplength& = sslength& * 2 ' length of output in bytes
  llong& = samplength& + 36 ' length of rest of file
  GOSUB WriteLongword ' write file length
  PRINT #2, "WAVE"; ' always there

' write FORMAT chunk

  PRINT #2, "fmt "; ' always there
  llong& = 16 : GOSUB WriteLongword ' length of chunk, always 16
  llong& = 1 : GOSUB WriteWord ' always 1
  llong& = 1 : GOSUB WriteWord ' mono
  llong& = 16000 : GOSUB WriteLongword ' sample rate
  llong& = 16000 : GOSUB WriteLongword ' bytes/second
  llong& = 1 : GOSUB WriteWord ' 1 byte/sample
  llong& = 8 : GOSUB WriteWord ' 8 bits/sample

' write DATA chunk

  PRINT #2, "data"; ' always there
  llong& = samplength& : GOSUB WriteLongword ' data chunk length
  sstart& = wavaddr&(wavfiles%) ' sample start address
  send& = wavaddr&(wavfiles% + 1) ' sample end address
  GOSUB Decompress ' decompress the sample

' write llong& as word to file, little endian format

  PRINT #2, CHR$(llong& AND 255&); ' write low byte
  llong& = llong& \ 256&
  PRINT #2, CHR$(llong& AND 255&); ' write high byte

' write llong& as longword to file, little endian format

  GOSUB WriteWord ' write low word
  llong& = llong& \ 256&
  GOSUB WriteWord ' write high word

' decompress ADPCM sample data to .wav data. first get the blocksize, if it's zero then
' all done so exit else for each byte in the block umpack the high then the low nibbles
' into 12 bit samples

' This routine could be greatly simplified but is given in this form as it more closely
' represents how it would be implemented in assembly code or directly in hardware

  stepindex = 0 ' reset decompression variables
  stepsize = 16 ' initialise index
  sample& = 2048 ' set 50% for unsigned value

  i& = sstart& ' set start of sample
  eflag% = 0 ' clear end flag
    GOSUB GetByte ' get this sample blocklength
    blklength% = byte% AND 127 ' mask and copy block length
    IF blklength% THEN ' if there are samples
        GOSUB GetByte ' get two compressed nibbles
        FOR nib% = 0 TO 1 ' for each nibble
          IF nib% THEN
            nibble% = byte% AND 15 ' second sample is low nibble
            nibble% = byte% \ 16 ' first sample is high nibble
          END IF

          newsample = nibble% AND 7 ' compressed sample magnitude

          difference = stepsize \ 8 ' effectively add 0.5 to difference

          IF newsample AND 4 THEN
            difference = difference + stepsize ' + stepsize / 4 * 4
          END IF
          IF newsample AND 2 THEN
            difference = difference + stepsize \ 2 ' + stepsize / 4 * 2
          END IF
          IF newsample AND 1 THEN
            difference = difference + stepsize \ 4 ' + stepsize / 4 * 1
          END IF

          IF (nibble% AND 8) THEN ' if -ve compressed sample
            sample& = sample& - difference '  subtract the difference
          ELSE ' else compressed sample was +ve
            sample& = sample& + difference '  so add the difference
          END IF

          IF sample& > 4095 THEN ' if > than unsigned 12 bit max
            PRINT " +clip "; '  print a warning
            sample& = 4095 '  clamp to 4095
          ELSEIF sample& < 0 THEN ' if < than unsigned 12 bit min
            PRINT " -clip "; '  print a warning
            sample& = 0 '  clamp to 0
          END IF

          PRINT #2, CHR$(sample& \ 16&); ' scale and save decompressed sample
          stepindex = stepindex + stepadj(newsample) ' new decompress step index
          IF stepindex > 48 THEN ' if > than step table max
            stepindex = 48 '  clamp to step table max
          ELSEIF stepindex < 0 THEN ' if < than step table min
            stepindex = 0 '  clamp to step table min
          END IF

          stepsize = steptable(stepindex) ' get step size for next sample

        NEXT nib% ' do other nibble
        blklength% = blklength% - 1% ' decrement count
      LOOP WHILE blklength% ' loop if more to do
      eflag% = -1% ' else set end flag
    END IF
  LOOP UNTIL eflag% ' loop until end

' get an indexed byte from the input stream. return the value as a string and a number

  byte$ = " " ' one byte long string
  i& = i& + 1& ' increment the index
  GET #1, (i&), byte$ ' get LEN(byte$) bytes
  byte% =  ASC(byte$) ' get numeric byte value

' get a big endian longword from the input stream. return the value in llong&

  GOSUB GetByte ' get MS byte
  llong& = byte% ' copy it
  GOSUB GetByte ' get next byte
  llong& = llong& * 256& + byte% ' convert and add it
  GOSUB GetByte ' get next byte
  llong& = llong& * 256& + byte% ' convert and add it
  GOSUB GetByte ' get next byte
  llong& = llong& * 256& + byte% ' convert and add it

' dialogic modified IMA tables

DATA 16,  17,  19,  21,   23,   25,   28,   31,   34,  37
DATA 41,  45,  50,  55,   60,   66,   73,   80,   88,  97
DATA 107, 118, 130, 143,  157,  173,  190,  209,  230, 253
DATA 279, 307, 337, 371,  408,  449,  494,  544,  598, 658
DATA 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552

DATA -1,-1,-1,-1,2,4,6,8

I have attached the source file as well as a sound prom file to decode

[attachment deleted by admin]
This has had me stumped for 2 days now so time to ask the gurus for help  :nw:

I am working on a project and have a routine for displaying text by loading in the individual letters as sprites and breaking the string down into individual characters and drawing the sprite for the letter, setting the xpos to the width of the char plus current print pos so its ready to print the next char. The widths are in a look up table as I figured it would be quicker than getting sprite size on the fly each time.

Code (glbasic) Select

FUNCTION stringprint: string$,stringxpos,stringypos,center = TRUE

LOCAL numchars, ctr, charypos, nextchar$,strlen=0

numchars = LEN(string$)

IF center
stringypos=stringypos + 11 // I moved the graphics on the screen by 11 pixels and this was easier than reentering all the ypos values on each draw command
FOR ctr = 0 TO numchars-1
strlen = strlen + char_width[ASC(string$,ctr)]
stringxpos = stringxpos - (strlen/2)

FOR ctr = 0 TO numchars-1
DRAWSPRITE 500+ASC(string$,ctr),stringxpos,stringypos


On my dev computer it displays fine as per the first screen shot. On the computer it needs to be deployed on it is missing the text totally. I did also try Peejays/morus text drawing routine (but as its a commercial project I dont want to use it for production as its their code) and this does exactly the same.

I have tried removing some of the graphics to keep the overheads down but that doesn't change anything so I am stumped.

The graphics card in the deployment PC is an Intel 82845G/GL/GE/PE/GV which I know does not do everything in the 3d department but I'm not doing anything fancy. All other sprites display correctly and everything else works apart from this one aspect.

Anyone else have any ideas as to what I could try? I'm on the verge of going back to a standard font and using the PRINT routine :) Its not a difference between full screen and windowed as the issues stay regardless of the settings


[attachment deleted by admin]
Hopefully someone here can give me a simple solution to this problem

I have a sound that is loaded as a wav file at program start up that I want to play as a continuous loop at certain times. Currently I am using PLAYSOUND and checking if the channel is still playing and restarting if it isn't but my problem is if the music stops when it is out of the loop doing something else I get a pause. I see that PLAYMUSIC can be set to run and just play in the background as a looping tune but from the docs it looks like PLAYMUSIC requires the sample to be loaded at the time of playing rather than specifying a sound number that is already loaded. This would be difficult to use as I jump all over the place saving files.

I also notice that you can set a buffer value on LOADSOUND between 1 and 4 that states the number of times the sample can be played without interruption, I assume it just duplicates the sound x number of times. Setting this to 4 cures the problem a little bit but not totally.

Can PLAYMUSIC be used with a preloaded sample or is there any way that PLAYSOUND can be set to loop and forget until the sample is killed with a HUSH?

GLBasic - en / GLB Debugger
Is there any page anywhere that details the proper use of the debugger?

I have had call to use it for the first time in over a year of using GLB and am finding new things out about it. At first I thought that it was cumbersome to have to keep scrolling up and down the debug window to find out a current value of a variable but then I left my mouse pointer over the source code and up popped the current value of a variable!!.

What other little timesaving tips are there in the debugger that I have not found yet?

I have made a few major changes to a project im working on and am now experiencing random crashes.

If I have debug on then the code seems to crash at random places anywhere between 10 and 30 seconds after starting up. According to the debugger its still running as I can pause it and step through each line.

If debug is off then it seems to be fine until I remove focus from the program and then it locks up and even clicking back on the app does not restore it running (I have AUTOPAUSE FALSE at the top of the program)

Also when running in debug in the thread that is running I have put in a debug message that is displayed every loop, this also stops making me think the thread is the part of the program that has hung (all of my graphic updates and button detection is done in the thread so this would give the impression of the main program locking up.

Has anyone else noticed anything similar when using threads recently? Or if not is there any way I can debug the thread that is running with the debugger?

Sorry if this is a simple question but cant see anything obvious in the help file

I want to create a couple of log files for a program Im writing. Basically all it will be is a series of numbers which I will then throw into a spreadsheet and create a graph from.

Is there a really simple way to open a file, append a line to the bottom and close it? There will be 10000 entries in the log files so cant use PUTFILE which would be ideal if it was not linked to an CHAR length

Nice to see this feature but there is a couple of minor bugs.

If you jump to line 1 then it actually takes you to line 2 and if you turn on or off line number display the cursor position does not move to the correct spot in the line, it can end up actually flashing in the line number display or being a couple of characters out in the code.

If you type a letter or move the cursor it returns back to the correct spot and then adds the character, so no big deal, just mentioned it as I spotted it just in case it has an impact else where that I have not found yet
Bug Reports / DIMDEL issues?

Have you changed anything in how arrays are handled recently?

I have a piece of code that logs the last 10 events and did it like this

Code (glbasic) Select

DIMDEL coin_recall$[],0
REDIM coin_recall$[11][3]
coin_recall$[9][0] = coinname$[coin]
coin_recall$[9][1] = PLATFORMINFO$("TIME")

this now crashes the program with an error of DIM has wrong dimensions.

It was working find up till a couple of revisions ago