Hello, I'm a newbie tinkering with the Spectrum.
I tried to get some code to test like the classic 'clock.bas' or 'circle. bas' and then converting a .bas file to .tap.
In some cases, I obtain some errors like:
manuelzompetta@Manuels-MacBook-Pro zxbasic % python zxbc.py clock.bas clock.bas:21: warning: [W100] Using default implicit type 'float' for 'a' clock.bas:22: warning: [W100] Using default implicit type 'float' for 'sx' clock.bas:22: warning: [W100] Using default implicit type 'float' for 'sy' clock.bas:25: warning: [W100] Using default implicit type 'ulong' for 't2' Traceback (most recent call last): File "/Users/manuelzompetta/Downloads/zxbasic/zxbc.py", line 12, in <module> sys.exit(zxbc.main()) # Exit ^^^^^^^^^^^ File "/Users/manuelzompetta/Downloads/zxbasic/src/zxbc/zxbc.py", line 155, in main asm_output = backend.emit(optimize=OPTIONS.optimization_level > 0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/manuelzompetta/Downloads/zxbasic/src/arch/z80/backend/main.py", line 770, in emit self._output_join(output, self._QUAD_TABLE[quad.instr].func(quad), optimize=optimize) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/manuelzompetta/Downloads/zxbasic/src/arch/z80/backend/generic.py", line 362, in _cast output.extend(to_long(tA)) ^^^^^^^^^^^ File "/Users/manuelzompetta/Downloads/zxbasic/src/arch/z80/backend/common.py", line 401, in to_long raise NotImplementedError(f"type conversion from {stype} to long is undefined") NotImplementedError: type conversion from u32 to long is undefined
In other cases I obtain .tap file but when I execute it in the Spectrum or in an emulator nothing happens, I just obtain the welcome screen.
Sometimes we need exit not only from innermost loop, but also from some outer loop (sometimes more than two levels).
As a workaround I use "do" in the outer loop and "while 1" in the inner, just to be able to use "exit do" or "exit while":
Code:
do
' some code
while 1
' some code
if somecondition then
exit do ' exit from two levels
end if
' some code...
if someothercondition then
exit while ' exit inner loop only
end if
' some code...
end while
' some code...
loop
When exit from more than two levels is needed, there is no other way but to put a label and use "goto". It would be much more elegant if we could exit from more levels directly. For example, "exit do do" or "exit do do do" would exit from two or three levels of "do". I'm not sure that "exit for for for" or "exit while while" is needed; supporting "do" loop only is probably quite enough -- "do" loop is the most powerful and you can easily write any loop as a "do" loop.
I don't know if this should be in the bug section or is just a general question. There was an older question in the bug forum saying it would be fixed.
Making a card game, I use an array (0 to 51) for card numbers, then have a routine to shuffle it up.
With RANDOMIZE at top of program so it only gets used once each time the game is loaded, I consistently start with 2,0,3,48,9.
Moving it into the "new game" loop so it is run at the start of each new game, I'm always seeing 49,0,21,24.
I'm seeing the same sequence whether I use my Linux or Windows pc.
Not sure if it's something to do with FUSE emulator rather than ZX BASIC, and not using the FRAME setting which the help page mentions?
I've added my source as a txt file for reference.
sub nestedRoutine()
print "From inner sub, before: "; n
n = 22
print "From inner sub, after: "; n
end sub
n = 11
print "From outer sub, before: "; n
nestedRoutine()
print "From outer sub, after: "; n
end sub
cls
outerRoutine()
The output:
Quote:From outer sub, before: 11
From inner sub, before: 11
From inner sub, after: 22
From outer sub, after: 22
So the first example shows that variable n, declared in outer routine is fully accessible from the nested routine.
In the second example, I only added a dummy variable declaration inside the nested routine:
Code:
#pragma explicit = true
#pragma strict = true
sub outerRoutine
dim n as ubyte
sub nestedRoutine()
dim k as ubyte ' declare a dummy variable
if k <> 0 then ' and access it
print ""; ' do nothing meaningful
end if
print "From inner sub, before: "; n
n = 22
print "From inner sub, after: "; n
end sub
n = 11
print "From outer sub, before: "; n
nestedRoutine()
print "From outer sub, after: "; n
end sub
cls
outerRoutine()
Quote:From outer sub, before: 11
From inner sub, before: 0
From inner sub, after: 22
From outer sub, after: 11
Totally different output!
The main problem is that, referring to variable n, something is accessed and even written to inside the nested subroutine, but it is clearly not the varible n declared above.
With explicit and strict options, if the outer routine scope is not accessible, the compiler has to give an error that variable n is not declared in routine innerRoutine.
The compiler gives no error, though. Then the programme behaviour is unpredictable and rather dangerous actually.
The documentation for CHR function (https://zxbasic.readthedocs.io/en/latest/chr/) says that, although expanded, the function is 100% Sinclair basic compatible.
If it is so, then for the same parameters I'd expect the same output, not only for ascii letters, but also for sinclair basic keywords.
In Sinclair basic, this programme:
Code:
10 CLS
20 FOR i = 230 TO 250
30 PRINT CHR$ i
40 NEXT i
gives some Basic keywords in the output (see the attached image zxkeywords_sinclair.png).
Hi!
Another bug or at least improvement, sorry!
When I create constants, such as: const DCMD_EOD as ubyte = 100 const DCMD_LINE as ubyte = 101 const DCMD_CIRCLE as ubyte = 102 const DCMD_FILL as ubyte = 103 const DCMD_UDG as ubyte = 104
And then try to use them like so (initializer expression): sub draw_presentation() dim pic_data(11) as ubyte => { _ DCMD_Circle, 50, 180, 10, _ DCMD_Fill, 50, 180, _ DCMD_Circle, 100, 160, 25, _ DCMD_EOD } draw_pic( pic_data ) end sub
Or maybe like so (DATAs): LocPics: ' Loc 0 - Limbo data DCMD_Line, 0, 180, 250, 100, _ DCMD_Line, 250, 180, 0, 100, _ DCMD_EOD
I receive the following errors:
For the use of constants inside DATAs: locs.bas:64: warning: [W100] Using default implicit type 'float' for 'DCMD_Line' locs.bas:69: warning: [W100] Using default implicit type 'float' for 'DCMD_Circle' locs.bas:70: warning: [W100] Using default implicit type 'float' for 'DCMD_Fill'
This doesn't make any sense, since they are defined as constants of type ubyte.
For the use of these constants inside the constant initializer for an array: reveni.bas:14: error: Initializer expression is not constant. reveni.bas:19: warning: [W100] Using default implicit type 'float' for 'pic_data' reveni.bas:19: error: Invalid argument 'pic_data'
Again, this doesn't make any sense, since they are constants but the initializer expression is erroneously detected as non-constant.
Could this be solved?
Thanks,
Hey I just tried to download (from all the links) and got nothing. Links look good but boriel.com/files appears to be empty. Is that right? It's Sunday night so maybe it's maintenance?
I've been enjoying using ZX BASIC so far. It's great to have something that's easy to use (and in-keeping with the original Sinclair BASIC). I have come up against an issue which I can't find a solution for:
The compiler supports multi-dimensional arrays, but it throws an error if I attempt to get a "slice" of the data.
My code:
Code:
DIM data_array(0 TO 2, 0 TO 3) AS UByte = { _
{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} _
}
DIM element12 AS UByte = data_array(1, 2)
DIM element0(0 TO 3) AS UByte
element0 = data_array(0) ' throws an error
I get no errors relating to element12
I would expect that element0 should result in {0, 1, 2, 3}. It's the right "shape". Instead I get an error:
Out of simple routine, I created a for loop like this:
Code:
for i = 0 to ubound(m)
if m( i ) = 0
break
end if
next
At first, I did not understand what was happening. break was not working. But there was not any error or even a warning. Then I realized: break is not a part of Basic. It never was.
The strange point is the absence of any error or warning. Either this was included in the grammar by error, or maybe because it is planned for inclusion.
I don't know.