Features that are never used
Post by rtr on Mar 22nd, 2014, 11:58am
This is the first in an occasional series of posts on features of BBC BASIC for Windows which distinguish it from other BASICs, but which are so obscure that nobody ever uses them, unless of course you know different!
1. Outputting bottom-to-top text
BB4W supports outputting right-to-left text (for languages like Hebrew and Arabic) and top-to-bottom text (for Chinese, Japanese and Korean, rarely) but it also supports bottom-to-top text - both when output to the 'mainwin' and to the printer:
Code: *font Lucida Console,24
VDU 23,16,12;0;0;0;13 : REM Bottom-to-top text
PRINT "Hello world!"
But there is no national language written this way, as far as I know, so apart from as a gimmick it's unlikely this facility has ever been used in a real program.
Richard.
Re: Features that are never used
Post by JGHarston on Mar 24th, 2014, 01:34am
I think I once displayed a graph by writing the Y axis that way.
But some things that seem redundant are easier to code that way, like CPUs that have MOVE r,r operations, disk controllers that have "write data and don't transfer" operations, plot operations that end up as "don't move, don't plot, and don't update".
Re: Features that are never used
Post by rtr on Mar 24th, 2014, 09:40am
on Mar 24th, 2014, 01:34am, JGHarston wrote:But some things that seem redundant are easier to code that way. |
|
If you are implying that bottom-to-top printing 'fell out' as a side effect of top-to-bottom and right-to-left printing, it didn't (not in the BB4W code at least, I can't speak about Acorn's).
Richard.
Re: Features that are never used
Post by lancegary on Mar 24th, 2014, 2:09pm
on Mar 24th, 2014, 01:34am, JGHarston wrote:I think I once displayed a graph by writing the Y axis that way. But some things that seem redundant are easier to code that way, like CPUs that have MOVE r,r operations, disk controllers that have "write data and don't transfer" operations, plot operations that end up as "don't move, don't plot, and don't update". |
|
It is true that most graphs are plotted in the opposite direction (bottom up) to the direction in which western text is written to the screen (top down). There was a time when stats programs used text (as opposed to pixels) for plotting graphs. So the bottom up facility would have been most useful for making text graphs. I suppose text art and charts could still be made using BB4W ...
Lance
Re: Features that are never used
Post by rtr on Mar 24th, 2014, 2:24pm
on Mar 24th, 2014, 2:09pm, lancegary wrote:It is true that most graphs are plotted in the opposite direction (bottom up) |
|
BBC BASIC is relatively unusual in using Cartesian graphics coordinates (positive Y being upwards). It's what you want for plotting graphs and other scientific purposes, but it often confuses people more used to the graphics origin being in the top-left corner.
It's also why you have to be so careful in BBC BASIC to set your 'window' dimensions (e.g. using MODE) because since the graphics origin is at the bottom left and the text origin is at the top left, correct alignment of text and graphics critically depends on the window height.
Windows itself supports the 'positive Y upwards' convention, but it's not the default setting and I decided (rightly or wrongly) not to change that but to achieve the mapping by translating the coordinates. Ever since I've wondered whether that was the right decision, because it makes it rather more difficult to mix BASIC graphics and API graphics.
Just one of the many things I might do differently if I could turn the clock back, but which now isn't an option because of compatibility considerations with existing programs.
Quote:So the bottom up facility would have been most useful for making text graphs |
|
For that to work you would need to set the text 'X' direction to the normal left-to-right and the text 'Y' direction upwards. You can do that too, but it's not what I was talking about in the initial post.
Richard.
Re: Features that are never used
Post by yee on Mar 25th, 2014, 07:14am
Since the characters in a line of Chinese text are independent, therfore can be " readily" read in eitheir directions , so in practice, a chinese reader can get used to it being output/ displayed in the top to botom or botom to top directions realtime !
- very sorry that I have not yet find a niche application for this feature
- may be a Chines crossword puzzle or a *true* 3-D cross word pudzle ?
Re: Features that are never used
Post by rtr on Mar 25th, 2014, 4:31pm
on Mar 25th, 2014, 07:14am, yee wrote:a chinese reader can get used to it being output/displayed in the top to botom or botom to top directions |
|
You may find this amusing:
http://blogs.msdn.com/b/oldnewthing/archive/2012/07/19/10331400.aspx
That's what you need to do when top-to-bottom text is not supported natively! Windows has nothing comparable with the control over text direction, scrolling, wrapping etc. that BBC BASIC (strictly, the VDU driver/emulator) provides. And it's not even specific to BB4W: as far as I know VDU 23,16 was implemented way back in 1987 on the Acorn Archimedes.
Richard.
Re: Features that are never used
Post by JGHarston on Mar 26th, 2014, 03:22am
on Mar 24th, 2014, 2:24pm, Richard Russell wrote:BBC BASIC is relatively unusual in using Cartesian graphics coordinates (positive Y being upwards). It's what you want for plotting graphs and other scientific purposes, but it often confuses people more used to the graphics origin being in the top-left corner. |
|
I don't think I've ever encountered a Basic, or even a programming language at all, that plotted from the top downwards. Plotting is just so intuitively bottom upwards from primary school onwards, it would be so bizarre to have the plotting environment upside down. Who plots graphs from the top down?
(Though I have to admit I have to remind myself which way polar coordinates go each time I use them. Compass directions go clockwise, graphs go anticlockwise.)
on Mar 25th, 2014, 4:31pm, Richard Russell wrote:And it's not even specific to BB4W: as far as I know VDU 23,16 was implemented way back in 1987 on the Acorn Archimedes. |
|
1984(?)/5(?) in the Master MOS 3.xx.
Re: Features that are never used
Post by rtr on Mar 26th, 2014, 09:31am
on Mar 26th, 2014, 03:22am, JGHarston wrote:I don't think I've ever encountered a Basic, or even a programming language at all, that plotted from the top downwards. |
|
I find that almost unbelievable! Liberty BASIC, PowerBASIC and Visual Basic all have the positive Y-axis going downwards, as do C#, Java and Python. Indeed since that's the default coordinate system for Windows graphics (both GDI and GDI+) any language designed for Windows might reasonably adopt that convention.
In fact the only other 'programming language' that I can immediately think of which uses the positive-Y upwards convention is Excel!
Richard.
The most unused is the sound !
Post by hitsware on May 8th, 2014, 02:07am
rem: Awkward, but works ! .... 
envelope 1,0,0,0,0,0,0,0,127,0,0,-1,127,0
dim note(3,7),selection(40)
for x=1 to 40: read selection(x): next x
data 40,88,96,100,116,120,136,144,148,164,168
data 184,192,196,212,232,0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0
print " hit any key to escape "
repeat
for count=0 to 7
n=inkey(1)
if n<>-1 then quit
for voice=0 to 3
random1=rnd(10)
random2=rnd(40)
if random1=1 then note(voice,count)=selection(random2)
next voice
if sgn(note(1,count))=1 then
sound 1,1,note(1,count),1: sound 4097,1,0,4
else sound 4097,1,0,5
endif
if sgn(note(2,count))=1 then
sound 2,1,note(2,count),1: sound 4098,1,0,4
else sound 4098,1,0,5
endif
if sgn(note(3,count))=1 then
sound 3,1,note(3,count),1: sound 4099,1,0,4
else sound 4099,1,0,5
endif
next count
until false
end
Re: The most unused is the sound !
Post by rtr on May 8th, 2014, 08:18am
on May 8th, 2014, 02:07am, hitsware wrote:rem: Awkward, but works ! .... :) |
|
No it doesn't, because neither note nor count is a legal variable name when Lowercase Keywords mode is selected, which it must be to load your program as listed! Here is a corrected version with those variables capitalised to make them valid in both modes:
Code: ENVELOPE 1,0,0,0,0,0,0,0,127,0,0,-1,127,0
DIM Note(3,7),selection(40)
FOR x=1 TO 40: READ selection(x): NEXT x
DATA 40,88,96,100,116,120,136,144,148,164,168
DATA 184,192,196,212,232,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRINT " hit any key to escape "
REPEAT
FOR Count=0 TO 7
n=INKEY(1)
IF n<>-1 THEN QUIT
FOR voice=0 TO 3
random1=RND(10)
random2=RND(40)
IF random1=1 THEN Note(voice,Count)=selection(random2)
NEXT voice
IF SGN(Note(1,Count))=1 THEN
SOUND 1,1,Note(1,Count),1: SOUND 4097,1,0,4
ELSE SOUND 4097,1,0,5
ENDIF
IF SGN(Note(2,Count))=1 THEN
SOUND 2,1,Note(2,Count),1: SOUND 4098,1,0,4
ELSE SOUND 4098,1,0,5
ENDIF
IF SGN(Note(3,Count))=1 THEN
SOUND 3,1,Note(3,Count),1: SOUND 4099,1,0,4
ELSE SOUND 4099,1,0,5
ENDIF
NEXT Count
UNTIL FALSE
END
I advise running the Cross Reference Utility before uploading code to the forum.
Richard.
Re: The most unused is the sound !
Post by rtr on May 8th, 2014, 1:12pm
I'm somewhat puzzled that you've unrolled the SOUND loop. Isn't your program exactly equivalent to this:
Code: ENVELOPE 1,0,0,0,0,0,0,0,127,0,0,-1,127,0
DIM Note(3,7),selection(40)
FOR x=1 TO 40: READ selection(x): NEXT x
DATA 40,88,96,100,116,120,136,144,148,164,168
DATA 184,192,196,212,232,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRINT " hit any key to escape "
REPEAT
FOR beat=0 TO 7
IF INKEY(1)<>-1 QUIT
FOR voice=1 TO 3
IF RND(10)=1 THEN Note(voice,beat)=selection(RND(40))
IF Note(voice,beat)>0 THEN
SOUND voice,1,Note(voice,beat),1
SOUND voice+4096,1,0,4
ELSE
SOUND voice+4096,1,0,5
ENDIF
NEXT voice
NEXT beat
UNTIL FALSE
END
Then you can trivially convert it from three-voice to four-voice:
Code: *tempo 133
ENVELOPE 1,0,0,0,0,0,0,0,127,0,0,-1,127,0
DIM Note(3,7),selection(40)
FOR x=1 TO 40: READ selection(x): NEXT x
DATA 40,88,96,100,116,120,136,144,148,164,168
DATA 184,192,196,212,232,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRINT " hit any key to escape "
REPEAT
FOR beat=0 TO 7
IF INKEY(1)<>-1 QUIT
FOR voice=0 TO 3
IF RND(10)=1 THEN Note(voice,beat)=selection(RND(40))
IF Note(voice,beat)>0 THEN
SOUND voice,1,Note(voice,beat),1
SOUND voice+4096,1,0,4
ELSE
SOUND voice+4096,1,0,5
ENDIF
NEXT voice
NEXT beat
UNTIL FALSE
END
Richard.
Re: Features that are never used
Post by hitsware on May 9th, 2014, 03:53am
how 'bout this one ? (done with your bbc4w)
http://home.comcast.net/~mnjmiller/cerisemode.exe
Re: Features that are never used
Post by hitsware on May 9th, 2014, 7:02pm
> I'm somewhat puzzled that you've
> unrolled the SOUND loop.
I don't know what you mean by
"unrolled the sound loop"
I came up with that code a long
time ago strictly by trial and error,
and never understood it at all.
The purpose is to allow notes with
envelopes to overlap when appropriate.
I.E. the way most BBC music is written
shuts all notes off after any new note,
but if each voice is considered an instrument
then this is a poor representation of reality.
There is probably a way simpler way.
Re: Features that are never used
Post by rtr on May 9th, 2014, 9:17pm
on May 9th, 2014, 7:02pm, hitsware wrote:I don't know what you mean by "unrolled the sound loop" |
|
I mean that instead of using a loop you wrote separate code for each SOUND channel (1,2,3), despite the code for each channel being identical - apart from the channel number itself of course!
It seemed particularly odd because you did use a loop when writing to the Note() array:
Code: FOR voice=0 TO 3
random1=RND(10)
random2=RND(40)
IF random1=1 THEN Note(voice,Count)=selection(random2)
NEXT voice
If you look at my version, I simply moved the SOUND statements into the existing loop, thereby getting rid of the duplication of code. That made the program shorter and easier to understand, and also meant that changing the program from three-voices to four-voices was trivial.
Quote:the way most BBC music is written shuts all notes off after any new note |
|
"The way most BBC music is written"? I sincerely hope not!
Richard.
Re: Features that are never used
Post by rtr2 on Mar 21st, 2015, 11:47pm
2. RETURN destination
This is the second in an occasional series of posts on features of BBC BASIC for Windows which are so obscure or specialised that they are (virtually) never used.
The RETURN statement is used either to exit from a subroutine (called using GOSUB) or to indicate the completion of an ON event handler. Normally it causes execution to continue from the point in the code where the subroutine call or event interrupt happened.
However you can, optionally, follow the RETURN with a destination (line number or label) which will cause it to 'return' to the specified place instead. Effectively it is like a GOTO except that the 'return address', which was pushed onto the stack, is discarded (if you used GOTO instead the program would appear to work, for a while, until all the memory was used up by the ever-growing stack).
When might you want to do that? Hardly ever (and being equivalent to a GOTO all the arguments for avoiding them apply to this usage as well)! One possible use might be for an ON TIME interrupt to abort some lengthy process without the overhead of polling for the event:
Code: ON TIME RETURN (abort)
REPEAT
I% += 1
UNTIL FALSE
(abort)
PRINT "Aborted with I% = "; I%
Perhaps you can think of another application for this functionality.
Richard.
Re: Features that are never used
Post by David Williams on Mar 22nd, 2015, 08:12am
SUMLEN
Not really a 'feature' of BB4W as such, but I noticed it for the first time a few days ago when I was browsing the list of ARM BASIC V's keywords. Had to check if BB4W has it as well, and of course it does.
I'm certain I had never noticed this keyword before in all my years of BBC BASIC programming.
Any other long-time BBC BASIC users new to this keyword?
Embarrassing if it's just me.
David.
--
Re: Features that are never used
Post by rtr2 on Mar 22nd, 2015, 10:43am
on Mar 22nd, 2015, 08:12am, David Williams wrote:Any other long-time BBC BASIC users new to this keyword? |
|
I think it's reasonably well-known, but little-used. Because SUMLEN arrived in the language at the same time as SUM (which is much more useful) I would expect anybody who knows about one to be aware of the other.
Having searched through thousands of programs on my PC I have found only one genuine example of its use, which is in a program that puts a whole load of files on the clipboard (CF_HDROP format). To work out how much memory to allocate for the clipboard data it does:
Code: nfiles% = FNselectfiles("Select one or more files", "*.*", file$())
ddesize% = DIM(dropfiles{}) + SUMLEN(file$()) + nfiles% + 1
But I'd prefer the thread not to fly off-topic this soon. Any feedback specifically on the RETURN destination feature?
Richard.
Re: Features that are never used
Post by David Williams on Mar 22nd, 2015, 12:25pm
on Mar 22nd, 2015, 10:43am, g4bau wrote:Any feedback specifically on the RETURN destination feature? |
|
Only that it was news to me, and that I've made a mental note of it.
David.
--
Re: Features that are never used
Post by DDRM on Mar 23rd, 2015, 5:32pm
Hi Richard,
I'm not sure you'd ever want to do it this way, but I guess you could use it to cut out the "PROCsys" bit of an ON PROC handler:
Code:
5 PROCMenus
10 ON SYS w%=50+@wparam%:RETURN w%
20 REPEAT
30 WAIT 1
40 UNTIL FALSE
45 END
50 PRINT "Black":END
51 PRINT "RED" :END
100 END
DEFPROCMenus
SYS "CreateMenu" TO hmenu%
SYS "SetMenu", @hwnd%, hmenu%
SYS "AppendMenu", hmenu%, 0, 0, "Blac&k"
SYS "AppendMenu", hmenu%, 0, 1, "&Red"
SYS "DrawMenuBar", @hwnd%
ENDPROC
Incidentally, I was interested to see that I can mix numbered and unnumbered bits of code - not that I'd recommend it...
Obviously you would probably want to jump to a handling routine rather than just a print statement, and I can't see much advantage over doing it the way recommended in the manual, but it IS a potential use for the feature!
I suspect you should probably mask @wparam% with &FFFF?
Best wishes,
D
Re: Features that are never used
Post by rtr2 on Mar 23rd, 2015, 8:01pm
on Mar 23rd, 2015, 5:32pm, DDRM wrote:I suspect you should probably mask @wparam% with &FFFF? |
|
Not in the case of a menu selection; MSDN says: "Value of the high-order word of wParam... If the message is from a menu, this parameter is 0".
Richard.
Re: Features that are never used
Post by rtr2 on Apr 6th, 2015, 10:32pm
3. ELSEIF condition THEN;
This is the third in an occasional series of posts on features of BBC BASIC for Windows which are so obscure or specialised that they are (virtually) never used.
Some BASIC dialects provide an ELSEIF (or ELSIF) keyword to allow multiple conditions to be conveniently handled without nesting IF statements. Standard BBC BASIC does not support this, but an equivalent functionality can be achieved using CASE:
Code: CASE TRUE OF
WHEN condition1:
REM Do something
WHEN condition2:
REM Do something else
OTHERWISE:
REM Do default action
ENDCASE
However BB4W does support a form of ELSEIF, a feature which was added primarily to aid automatic translation from other dialects:
Code: IF condition1 THEN
REM Do something
ELSEIF condition2 THEN;
REM Do something else
ELSE
REM Do default action
ENDIF
Note the semicolon ; immediately after the THEN which prevents a new (nested) multi-line IF clause being started.
Richard.
Re: Features that are never used
Post by DDRM on Apr 9th, 2015, 08:56am
Hi Richard,
Thanks for the note on ELSEIF. I quite often use the CASE TRUE construction, which is very nice, but I can see that using ELSEIF...THEN; might also work well to make multiple choices clear.
I see that there is one use of it in the wiki - is that enough to earn ELSEIF a brief mention in the manual?
Best wishes,
D
Re: Features that are never used
Post by rtr2 on Apr 9th, 2015, 10:13am
on Apr 9th, 2015, 08:56am, DDRM wrote:I see that there is one use of it in the wiki - is that enough to earn ELSEIF a brief mention in the manual? |
|
It is already there. ELSEIF is just ELSE IF and is therefore documented under ELSE and IF. It's a standard feature of BBC BASIC, which you could use even on the BBC Micro:
Code: IF condition1 PROCdosomething ELSEIF condition2 PROCdoanotherthing
The little-used, BB4W-specific, feature I drew attention to was THEN; (i.e. the trailing semicolon) which is documented, unsurprisingly, under THEN:
http://www.bbcbasic.co.uk/bbcwin/manual/bbcwin7.html#then
Richard.