Welcome, Guest |
You have to register before you can post on our site.
|
Online Users |
There are currently 154 online users. » 0 Member(s) | 151 Guest(s) Applebot, Bing, Google
|
Latest Threads |
.tap file code not execut...
Forum: Help & Support
Last Post: Zoran
04-28-2025, 10:59 AM
» Replies: 4
» Views: 316
|
Exit from more than one l...
Forum: Wishlist
Last Post: Duefectu
04-23-2025, 10:06 PM
» Replies: 3
» Views: 296
|
put small ASM programs li...
Forum: How-To & Tutorials
Last Post: Zoran
04-18-2025, 02:02 PM
» Replies: 6
» Views: 1,596
|
Creating +3 Menus - Loadi...
Forum: Help & Support
Last Post: merlinkv
04-16-2025, 02:08 PM
» Replies: 6
» Views: 554
|
Randomize not very random...
Forum: Help & Support
Last Post: Zoran
04-08-2025, 10:40 AM
» Replies: 4
» Views: 890
|
Scope rules
Forum: Bug Reports
Last Post: Zoran
04-04-2025, 09:46 AM
» Replies: 2
» Views: 327
|
Using constants not allow...
Forum: Bug Reports
Last Post: baltasarq
03-19-2025, 10:00 PM
» Replies: 8
» Views: 1,064
|
404 page not found
Forum: Documentation
Last Post: boriel
03-08-2025, 07:16 PM
» Replies: 5
» Views: 2,886
|
Spectrum keywords codes
Forum: Bug Reports
Last Post: boriel
03-08-2025, 11:00 AM
» Replies: 1
» Views: 419
|
ZXodus][Engine
Forum: ZX Basic Compiler
Last Post: boriel
02-19-2025, 11:43 PM
» Replies: 69
» Views: 213,807
|
|
|
New beta release 1.2.7r2021 |
Posted by: boriel - 02-01-2011, 08:28 AM - Forum: Bug Reports
- Replies (30)
|
 |
Okay, a new beta release with a *critical* fix and two interesting optimizations :!:
- ! The string parameters byVal (the default) in functions incorrecly managed causing crashes sometimes. Fixed.
- ! Some other bugs in the Intermediate code has been fixed. And string management a bit optimized (faster and less memory used)
- + Added a String.bas libray with MID$, LEFT$, RIGHT$, InStr and StrPos.
- * The ZX Basic preprocessor has been *entirely* rewritten (refactored). It now allows true multivariate macros as cpp does (Thus allowing function inlining, etc).
Please, test needed :!: The compiler has undergone *deep changes* with this update.
You can download (as always) from <!-- m --><a class="postlink" href="http://www.boriel.com/files/zxb">http://www.boriel.com/files/zxb</a><!-- m -->
|
|
|
New beta release 1.2.7r1866 |
Posted by: boriel - 12-16-2010, 09:40 AM - Forum: Bug Reports
- Replies (4)
|
 |
Okay, a new beta release with a fix and two interesting optimizations :!:
- ! The optimizer could hang under rare circumstances. Fixed.
- ! The csrlin() routine had a bug reporting sometimes the wrong position (this also affected Input() library which uses it). Fixed.
- + Every BEEP command always took 21 bytes. Now it only takes 11 bytes and it's faster (good for sound effects) if only constant numbers are used. So beep <num1>, <num2> is much optimized.
- DRAW routine has been improved for speed. Now it's 200% faster (aprox.) and takes only 150 bytes more.
- PLOT, DRAW & CIRCLE now uses SCREEN_ADD positioning => you can "DRAW" at part of the memory pointed by this internal variable.
To do:- If several constant beeps (BEEP <num1>, <num2>) are specified one after another, they will be "compressed" and played with a beep sequencer. So every beep in the sequence takes only 4 bytes.
- A new library routine is in preparation: polyline, which draws a sequence of lines to coords Xn, Yn:
Code: REM A list of coords (Unsigned Bytes)
DIM CoordList(10, 2) as UByte = { {1, 1}, {3, 100}, {20, 80}, ... _
... ' More coord lists
{128, 189}}
REM Draws a polilyne of 10 coordinates, taking coord 0 as the 1st one
REM The 2nd 0 is mondatory, but useless here.
PolyLine(10, @CoordList(0, 0))
- UBound and LBound soon to come (for getting the Upper and Lower bound of arrays).
Code: DIM a(2 To 5, 1 TO 8) as Byte
PRINT Ubound(a, 1) : REM prints 2
PRINT LBound(a, 2) : REM prints 8
- Variable parameters function calls, like in FreeBasic or C
Code: Function Avg(n as uByte, ...)
...
End Function
PRINT Avg(3, 2.5, 3.6, 7.8)
PRINT Avg(5, 1, 4, 5, 7, 9)
This way, function AVG can receive any numbers of parameters of any type.
Meanwhile, you can download 1.2.7-r1866 here, as always: <!-- m --><a class="postlink" href="http://www.boriel.com/files/zxb">http://www.boriel.com/files/zxb</a><!-- m -->
|
|
|
SE Basic support |
Posted by: cheveron - 12-11-2010, 11:25 PM - Forum: Wishlist
- Replies (7)
|
 |
Hi!
Thanks for the kind words on WoSF about SE Basic. It would be really cool if the compiler could:
* support the extra commands present in SE Basic
and also
* create code that runs with the SE Basic ROM used.
Happy to give whatever support you require to achieve one or both of these if you're interested.
Cheers!
-Andrew
|
|
|
Version 1.2.6 released! |
Posted by: boriel - 12-10-2010, 09:48 PM - Forum: ZX Basic Compiler
- Replies (4)
|
 |
This release is just 1.2.6-r1812 renamed. I think it's quite stable now, and if new bugs are found, they will be fixed on 1.2.7.
So, those interested, please, download from: <!-- m --><a class="postlink" href="http://www.boriel.com/files/zxb">http://www.boriel.com/files/zxb</a><!-- m -->
This version finally implements bitwise operations (bAND, bOR, bXOR, bNOT) on any interger types (8, 16 and 32 bits). 8)
Thanks to Britlion, apenao, LCD, LTee, programandala & carloscomputer again (and maybe others, please priv. msg. me). They've detected many bugs again, but now I've started to use TDD (Unit Testing) to avoid already-fixed bugs to be reintroduced. Like the previous version, this one fixes so many that some parts has been completely rewritten. If you use any older version, do please upgrade to this one immediately. This version could be considered as another "Service Pack Update".
Changes since v.1.2.5
===================================
Assembler: - + The assembler now supports ALIGN <integer> directive
- + Added support for checking out of memory in runtime.
- + Added support for checking BREAK in runtime (--enable-break)
- + Added support for Subscript Out of Range in runtime (--debug-memory)
- + Added support for --strict-boolean (0 or 1) values (--debug-array)
- + Added suport for 8 bit bitwise bAND, bOR, bXOR, bNOT operations.
- + Added print64 by Britlion library routine, and Mojon Twins FourSpriter version (more to come).
Compiler:- + Added support for logical XOR (if A XOR B then...)
- + Bitwise bAND, bOR, bXOR, bNOT finally added for 8, 16 and 32 bits
- ! Fixed a bug in RANDOMIZE which wasn't updating the seed correctly.
- ! Fixed a pragma typo in POS.bas library wich lead to errors.
- ! Fixed a bug in STR$, VAL, CHR$ and CODE which could crash the program.
- ! Fixed a bug in string comparison
- ! Fixed 2 more bugs in the peephole optimizer (-O3) which could crash the program.
- ! Fixed some syntax bugs. PI() and RND() are now allowed.
Calling functions with no parenthesis is either.
- ! Fixed a parser bug in which empty WHILE / DO .. LOOP loops crashed the compiler. Fixed.
- ! Array access has been optimized for speed. Now faster.
- ! For loops have been slightly optimized.
- ! MEM_FREE heap routine has been slightly optimized.
- * The print* intermediate code instructions have been removed and converted to routines.
- * Lot of code refactoring, and moved to the standard trunk/tag/branches SVN repository scheme.
- * String expresions now are standarized (like any other data type).
- * TDD: Begin to create unitary tests cases for the compiler.
|
|
|
PRINT in FUNCTION causes Crash (*solved*) |
Posted by: LCD - 11-27-2010, 03:16 PM - Forum: Bug Reports
- Replies (4)
|
 |
Hi Boriel, In my latest game using PRINT in a FUNCTION causes Crash. If I REM out it, it works. Two builds before it was working perfectly, so maybe a reintroduced bug?
I'm sending you the complete source via PM.
|
|
|
Add more library functions |
Posted by: britlion - 11-23-2010, 11:59 PM - Forum: Wishlist
- Replies (6)
|
 |
Cool stuff.
I've added it as a code patch to the wiki library section. Are there any others in there, like LCD's proportional print routine or the nascent maths library section that you think are worth calling part of the include pack?
|
|
|
Function call with string params bug (*solved*) |
Posted by: britlion - 11-21-2010, 12:23 AM - Forum: Bug Reports
- Replies (3)
|
 |
I think there's still a bug in the string slicing.
I was playing with the print64 routine - and I think it works just fine, but when printing sliced strings it breaks.
Code: SUB printat64 (y as uByte, x as uByte)
POKE @p64coords,x
POKE @p64coords+1,y
END sub
SUB print64 (characters$ as String)
asm
LD L,(IX+4)
LD H,(IX+5) ; Get String address of characters$ into HL.
; Load BC with length of string, and move HL to point to first character.
ld c, (hl) ; 60020 78
inc hl ; 60021 35
ld b, (hl) ; 60022 70
inc hl ; 60023 35
; Test string length. If Zero, exit.
ld a, c ; 60024 121
or b ; 60025 176
jp z, p64_END ; 60026 200
examineChar:
ld a, (hl) ; Grab the character
cp 128 ; too high to print?
jr nc, nextChar ; then we go to next.
cp 22 ; Is this an AT?
jr nz, newLine ; If not, hop to newLine routine.
ex de, hl ; Swap DE and HL
and a ; Clear Carry
ld hl, 2 ;
sbc hl, bc ; Can we Shorten our string length by 2? If not then at (y,x) doesn't make sense.
ex de, hl ; Swap DE and HL back
jp nc, p64_END ; If we went negative, there wasn't anything to AT to, so we return.
inc hl ; Onto our Y co-ordinate
ld d, (hl) ; And load it into D
dec bc ; Shorten our remaining string counter.
inc hl ; Onto the X Co-ordinate
ld e, (hl) ; Load it into E
dec bc ; Shorten our remaining string counter
call p64_test_X ; Make xy legal 60051 205 53 235
jr p64_eaa3 ; Go to save coords 60054 24 11
newLine:
cp 13 ; Is this a newline character? 60056 254 13
jr nz, p64_isPrintable ; If not, hop to testing to see if we can print this 60058 32 13
ld de, (p64_coords) ; Get coords 60060 237 91 68 235
call p64_nxtLine ; Go to next line. ; 60064 205 58 235
p64_eaa3:
ld (p64_coords), de ; 60067 237 83 68 235
jr nextChar ; 60071 24 11
p64_isPrintable:
cp 31 ; Bigger than 31? 60073 254 31
jr c, nextChar ; If not, get the next one. 60075 56 7
push hl ; Save position 60077 229
push bc ; Save Count 60078 197
call p64_PrintChar ; Call Print SubRoutine 60079 205 189 234
pop bc ; Recover length count 60082 193
pop hl ; Recover Position 60083 225
nextChar:
inc hl ; Point to next character 60084 35
dec bc ; Count off this character 60085 11
ld a, b ; Did we run out? 60086 120
or c ; 60087 177
jr nz, examineChar ; If not, examine the next one 60088 32 193
jp p64_END ; Otherwise hop to END. 60090 201
;p64_eabb:
; defb "z$" ;Original "basic" accessed routine used this variable.
;ld a, d ; 60091 122
;inc h ; 60092 36
;p64_eabd:
p64_PrintChar:
exx ; 60093 217
push hl ; Save HL' 60094 229
exx ; 60095 217
sub 32 ; Take out 32 to convert ascii to position in charset 60096 214 32
ld h, 0 ; 60098 38 0
rra ; Divide by 2 60100 31
ld l, a ; Put our halved value into HL 60101 111
ld a, 240 ; Set our mask to LEFT side 60102 62 240
jr nc, p64_eacc ; If we didn't have a carry (even #), hop forward. 60104 48 2
ld a, 15 ; If we were ab idd #, set our mask to RIGHT side instead 60106 62 15
p64_eacc:
add hl, hl ; 60108 41
add hl, hl ; 60109 41
add hl, hl ; Multiply our char number by 8 60110 41
ld de, p64_charset ; Get our Charset position 60111 17 70 235
add hl, de ; And add our character count, so we're now pointed at the first byte of the right character. 60114 25
exx ; 60115 217
ld de, (p64_coords) ; 60116 237 91 68 235
ex af, af' ; 60120 8
call p64_loadAndTest ; 60121 205 49 235
ex af, af' ; 60124 8
inc e ; 60125 28
ld (p64_coords), de ; Put position+1 into coords 60126 237 83 68 235
dec e ; 60130 29
ld b, a ; 60131 71
rr e ; Divide X position by 2 60132 203 27
ld c, 0 ; 60134 14 0
rl c ; Bring carry flag into C (result of odd/even position) 60136 203 17
and 1 ; Mask out lowest bit in A 60138 230 1
xor c ; XOR with C (Matches position RightLeft with Char RightLeft) 60140 169
ld c, a ; 60141 79
jr z, p64_eaf6 ; If they are both the same, skip rotation. 60142 40 6
ld a, b ; 60144 120
rrca ; 60145 15
rrca ; 60146 15
rrca ; 60147 15
rrca ; 60148 15 ; Move the mask to the other half of the byte.
ld b, a ; 60149 71
p64_eaf6:
ld a, d ; Get Y coord 60150 122
sra a ; 60151 203 47
sra a ; 60153 203 47
sra a ; Multiply by 8 60155 203 47
add a, 88 ; 60157 198 88
ld h, a ; Put high byte value for attribute into H. 60159 103
ld a, d ; 60160 122
and 7 ; 60161 230 7
rrca ; 60163 15
rrca ; 60164 15
rrca ; 60165 15
add a, e ; 60166 131
ld l, a ; Put low byte for attribute into l 60167 111
ld a, (23693) ; Get permanent Colours from System Variable 60168 58 141 92
ld (hl), a ; Write new attribute 60171 119
ld a, d ; 60172 122
and 248 ; 60173 230 248
add a, 64 ; 60175 198 64
ld h, a ; 60177 103
ld a, b ; 60178 120
cpl ; 60179 47
ld e, a ; 60180 95
exx ; 60181 217
ld b, 8 ; 60182 6 8
p64_eb18:
ld a, (hl) ; 60184 126
exx ; 60185 217
bit 0, c ; 60186 203 65
jr z, p64_eb22 ; 60188 40 4
rrca ; 60190 15
rrca ; 60191 15
rrca ; 60192 15
rrca ; 60193 15
p64_eb22: and b ; 60194 160
ld d, a ; 60195 87
ld a, (hl) ; 60196 126
and e ; 60197 163
or d ; 60198 178
ld (hl), a ; 60199 119
inc h ; 60200 36
exx ; 60201 217
inc hl ; 60202 35
djnz p64_eb18 ; 60203 16 235
exx ; 60205 217
pop hl ; 60206 225
exx ; 60207 217
ret ; 60208 201
p64_loadAndTest:
ld de, (p64_coords) ; 60209 237 91 68 235
; SubRoutine to go to legal character position. (60213)
p64_test_X:
ld a, e ; Get column from e
cp 64 ; more than 64 ?
jr c, p64_test_Y ; If not, then jump over nextline
p64_nxtLine:
inc d ; Move down 1
ld e, 0 ; reset x co-ord to zero
p64_test_Y:
ld a, d ; get Y co-ord
cp 24 ; Past 24?
ret c ; Return if not.
ld d, 0 ; Rest y co-ord to top of screen.
ret ; Return.
end asm
p64coords:
asm
p64_coords:
defb 64; X Coordinate store 60228 64
defb 23; Y Coordinate Store 60229 23
p64_charset: ; 60230
DEFB 0,2,2,2,2,0,2,0 ; Space !
DEFB 0,80,82,7,2,7,2,0 ; " #
DEFB 0,37,113,66,114,20,117,32 ; $ %
DEFB 0,34,84,32,96,80,96,0 ; & '
DEFB 0,36,66,66,66,66,36,0 ; ( )
DEFB 0,0,82,34,119,34,82,0 ; * +
DEFB 0,0,0,0,7,32,32,64 ; , -
DEFB 0,1,1,2,2,100,100,0 ; . /
DEFB 0,34,86,82,82,82,39,0 ; 0 1
DEFB 0,34,85,18,33,69,114,0 ; 2 3
DEFB 0,87,84,118,17,21,18,0 ; 4 5
DEFB 0,55,65,97,82,84,36,0 ; 6 7
DEFB 0,34,85,37,83,85,34,0 ; 8 9
DEFB 0,0,2,32,0,34,2,4 ; : ;
DEFB 0,0,16,39,64,39,16,0 ; < =
DEFB 0,2,69,33,18,32,66,0 ; > ?
DEFB 0,98,149,183,181,133,101,0 ; @ A Changed from ;0,2,37,87,117,85,53,0
DEFB 0,98,85,100,84,85,98,0 ; B C
DEFB 0,103,84,86,84,84,103,0 ; D E
DEFB 0,114,69,116,71,69,66,0 ; F G
DEFB 0,87,82,114,82,82,87,0 ; H I
DEFB 0,53,21,22,21,85,37,0 ; J K
DEFB 0,69,71,71,69,69,117,0 ; L M
DEFB 0,82,85,117,117,85,82,0 ; N O
DEFB 0,98,85,85,103,71,67,0 ; P Q
DEFB 0,98,85,82,97,85,82,0 ; R S
DEFB 0,117,37,37,37,37,34,0 ; T U
DEFB 0,85,85,85,87,39,37,0 ; V W
DEFB 0,85,85,37,82,82,82,0 ; X Y
DEFB 0,119,20,36,36,68,119,0 ; Z [
DEFB 0,71,65,33,33,17,23,0 ; \ ]
DEFB 0,32,112,32,32,32,47,0 ; ^ _
DEFB 0,32,86,65,99,69,115,0 ; £ a
DEFB 0,64,66,101,84,85,98,0 ; b c
DEFB 0,16,18,53,86,84,35,0 ; d e
DEFB 0,32,82,69,101,67,69,2 ; f g
DEFB 0,66,64,102,82,82,87,0 ; h i
DEFB 0,20,4,53,22,21,85,32 ; j k
DEFB 0,64,69,71,71,85,37,0 ; l m
DEFB 0,0,98,85,85,85,82,0 ; n o
DEFB 0,0,99,85,85,99,65,65 ; p q
DEFB 0,0,99,84,66,65,70,0 ; r s
DEFB 0,64,117,69,69,85,34,0 ; t u
DEFB 0,0,85,85,87,39,37,0 ; v w
DEFB 0,0,85,85,35,81,85,2 ; x y
DEFB 0,0,113,18,38,66,113,0 ; z {
DEFB 0,32,36,34,35,34,36,0 ; | {
DEFB 0,6,169,86,12,6,9,6 ; ~ (c)
p64_END:
end asm
end sub
DIM n,x,y as uInteger
CLS
FOR n=1 to 10000
y=rnd*23
x=rnd*63
printat64(y, x)
print64 ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"(n MOD 26 TO n MOD 26))
'print64 ("A")
print at 23,0;n;" y:";y;" x:";x;" L:";n
NEXT n
END
If you swap the two print lines at the end (line 254 and 255), if you have print "string" (slice) it prints 951 characters and then explodes.
If instead you just have print64("A") it completes (though exits with a drive not ready error, which is odd).
I think that something in the string slicing is making it go weird.
Thoughts?
|
|
|
Loosing "strictbool.asm" in version r1606. (*solved*) |
Posted by: compiuter - 11-18-2010, 07:01 PM - Forum: Bug Reports
- Replies (9)
|
 |
My programs can not find this function in the library because I think you erase it. I tried paste "strictbool.asm" of last version of zxbasic in library-asm and It works ok.
Problem solved. I tell this for the rest of users.
And if Boriel would include it, then ok. :?:
I downloaded today's msi windows version 10-11-18.
If I put zxb --version It post 126.-r1603 instead 1606.
|
|
|
Local 2D Array of strings crash (*solved*) |
Posted by: LTee - 11-16-2010, 03:09 PM - Forum: Bug Reports
- Replies (10)
|
 |
I seem to be having some issues trying to use a 2D array of Strings in some cases, but unfortunately I don't seem to be able to figure out what they are. A piece of code which seems to work fine in isolation fails when I put it into my main program with screen corruption and a crash. Is a 2D array of Strings 'bad form' for some reason?
In the end I replaced it with a 2D array of UBYTEs instead which worked okay (and was probably less wasteful, tbh - I was only storing single characters anyway). If I figure out a decent way to reproduce the crash without it being embedded in a huge chunk of other stuff then I'll post it. It could well be something silly that I've done elsewhere in the program. 
While I'm here, could someone clarify what is okay to declare within a SUB? I don't seem to have any problems declaring normal variables (e.g. DIM test AS UBYTE) within a SUB, but I seem to have crash issues if I try to declare and use an array (e.g. DIM test(2,2) AS UBYTE). Is it actually legal to try and do that?
This code, for example, crashes unless I move the UBYTE array outside of the SUB:
Code: test()
SUB test
DIM xpos as UBYTE
DIM ypos as UBYTE
DIM scrdata(22, 32) AS UBYTE
CLS
FOR ypos = 0 TO 21
FOR xpos = 0 TO 31
scrdata(ypos, xpos) = 65
NEXT xpos
NEXT ypos
PRINT "Done."
PAUSE 0
CLS
FOR ypos = 0 TO 21
FOR xpos = 0 TO 31
PRINT AT ypos, xpos; CHR(scrdata(ypos, xpos))
NEXT xpos
NEXT ypos
END SUB
Sorry if the answer here is obvious, I'm still getting used to how things work.
|
|
|
|