I am working my way through the book 'Boriel Basic for Beginners'. It is a very good book and well written. I have convinced my friend to buy a copy too.
On page 166 in the example the first command is '#INCLUDE "ship.gdu.bas". When I exported the UDG's as per the instructions on page 165 it creates a file 'ship.gdu.zxbas'
I was wondering why it did not export with the extension '.bas'. I understand I just need to change the extension in the code and it loads in fine, I just want to understand why. It may be something I have done wrong.
I'm using print64.bas, and the code I'm using to show a command menu is as follows:
Code:
const COLOR_BLACK as ubyte = 0
const COLOR_BLUE as ubyte = 1
const COLOR_RED as ubyte = 2
const COLOR_MAGENTA as ubyte = 3
const COLOR_GREEN as ubyte = 4
const COLOR_CYAN as ubyte = 5
const COLOR_YELLOW as ubyte = 6
const COLOR_WHITE as ubyte = 7
sub cursor_to(row as ubyte, col as ubyte)
printat64( row, col )
end sub
sub cprint(s as string)
print64( s )
end sub
sub lf()
cprint( CR )
end sub
sub set_colors(i as ubyte, p as ubyte)
paper( p )
ink( i )
end sub
sub set_default_colors()
set_colors( COLOR_WHITE, COLOR_BLACK )
end sub
sub set_highlighted_colors()
set_colors( COLOR_CYAN, COLOR_BLACK )
end sub
sub set_action_colors()
set_colors( COLOR_YELLOW, COLOR_BLACK )
end sub
sub print_word_marked_initial(word as string)
set_action_colors()
cprint( word( 0 ) )
set_default_colors()
cprint( word( 1 to ) )
end sub
sub print_cmds()
' Print basic options
cursor_to( SCR_FIRST_LINE_CMDS, 0 )
print_word_marked_initial( "Inv " )
print_word_marked_initial( "Mira alrededor " )
cprint( "E" ): print_word_marked_initial( "xamina... " )
print_word_marked_initial( "Norte " )
print_word_marked_initial( "Sur " )
print_word_marked_initial( "Este " )
print_word_marked_initial( "Oeste " )
print_word_marked_initial( "Arriba " )
cprint( "A" )
print_word_marked_initial( "bajo" )
lf()
' Print object manipulation options
print_word_marked_initial( "Coge... " )
print_word_marked_initial( "Deja... " )
cprint( "Em" ): print_word_marked_initial( "puja... " )
print_word_marked_initial( "Tira de... " )
print_word_marked_initial( "Rompe... " )
end sub
Well, the code should be straightforward. I also know it should work because I ported it from C, the same source code I used wtith z88dk. Unfortunately, it does not work, or it does not always work... (check the image).
if x1 = 3 (or any positive number) the correct result (9) is printed.
If x1 = -3 I get no result in the output (nothing is printed on the screen) and no message is shown.
I've tried to define x1 and x2 as integer, with the same problem.
I'm using 1.17.3 version with ZX Basic Studio, but I also tried with Visual Studio Code and Fuse (same result).
I'm doing something wrong or it's a bug?
Thanks
After doing some more changes to my project, zxbc started to complain about "Can't convert non-numeric value to string at compile time", check it out:
Code:
reveni.bas:46: error: Can't convert non-numeric value to string at compile time
reveni.bas:44: error: Can't convert non-numeric value to string at compile time
The second error is signaling a line that... is empty! The first error refers to the following source:
Code:
clrscr()
I think this means that the compiler gets somehow confused about something. I'm attaching the project.
Thanks,
-- Baltasar
$ python ~/bin/zxbasic/zxbc.py --tap --BASIC --autorun reveni.bas
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/keys.bas:50: warning: [W150] Parameter 'scancode' is never used
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/print64.bas:20: warning: [W150] Parameter 'characters' is never used
cmd.bas:41: warning: [W150] Parameter 'cmd' is never used
io.bas:222: warning: [W100] Using default implicit type 'float' for 'current_loc'
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/keys.bas:51: warning: [W190] Function 'MultiKeys' should return a value
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/keys.bas:72: warning: [W190] Function 'GetKeyScanCode' should return a value
objs.bas:88: warning: [W170] Function 'get_objs_in' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/keys.bas:50: warning: [W170] Function 'MultiKeys' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/keys.bas:71: warning: [W170] Function 'GetKeyScanCode' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:29: warning: [W170] Function 'mid' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:40: warning: [W170] Function 'left' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:51: warning: [W170] Function 'right' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:98: warning: [W170] Function 'strpos' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:124: warning: [W170] Function 'ucase2' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:174: warning: [W170] Function 'ucase' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:249: warning: [W170] Function 'ltrim' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:275: warning: [W170] Function 'rtrim' is never called and has been ignored
/home/baltasarq/bin/zxbasic/src/lib/arch/zx48k/stdlib/string.bas:304: warning: [W170] Function 'trim' is never called and has been ignored
util.bas:47: warning: [W170] Function 'testMultiplyStr' is never called and has been ignored
util.bas:57: warning: [W170] Function 'testFormatStr' is never called and has been ignored
Traceback (most recent call last):
File "/home/baltasarq/bin/zxbasic/zxbc.py", line 12, in <module>
sys.exit(zxbc.main()) # Exit
^^^^^^^^^^^
File "/home/baltasarq/bin/zxbasic/src/zxbc/zxbc.py", line 110, in main
optimizer.visit(zxbparser.ast)
File "/home/baltasarq/bin/zxbasic/src/api/optimize.py", line 199, in visit
return super().visit(node)
^^^^^^^^^^^^^^^^^^^
File "/home/baltasarq/bin/zxbasic/src/api/optimize.py", line 56, in visit
return super().visit(ToVisit(node))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/baltasarq/bin/zxbasic/src/ast/ast.py", line 42, in visit
stack.append(last.send(last_result))
^^^^^^^^^^^^^^^^^^^^^^
File "/home/baltasarq/bin/zxbasic/src/api/optimize.py", line 423, in visit_FOR
if from_ > to_ and step_ > 0:
^^^^^^^^^^^
TypeError: '>' not supported between instances of 'SymbolID' and 'SymbolID'
I was compiling my program when the compiler claimed (correctly) that there was an error in my code:
Code:
util.bas:105: error: Function 'FormatStr' takes 3 parameters, not 1
This message was correct, but instead of signaling the file name and the line where the error was present, it was showing the line number and the file name of where the function was defined!
It also messes with the line number, which corresponds to where the error happened, not where the function was defined. In my case, the error happened at line number 105 of player.bas, calling function FormatStr() defined in line number 39 of util.bas.
I think it would be better to expose both pieces of information, maybe this way:
Code:
player.bas: 105: error: Function 'FormatStr' takes 3 parameters, not 1
util.bas:39: error: Function 'FormatStr' defined here.