Welcome, Guest |
You have to register before you can post on our site.
|
Online Users |
There are currently 81 online users. » 0 Member(s) | 79 Guest(s) Bing, Google
|
Latest Threads |
Printing with FZX
Forum: Help & Support
Last Post: boriel
07-17-2025, 09:08 PM
» Replies: 1
» Views: 90
|
Strange Happenings
Forum: Bug Reports
Last Post: boriel
05-23-2025, 09:15 AM
» Replies: 4
» Views: 2,145
|
.tap file code not execut...
Forum: Help & Support
Last Post: Zoran
04-28-2025, 10:59 AM
» Replies: 4
» Views: 2,363
|
Exit from more than one l...
Forum: Wishlist
Last Post: Duefectu
04-23-2025, 10:06 PM
» Replies: 3
» Views: 1,989
|
put small ASM programs li...
Forum: How-To & Tutorials
Last Post: Zoran
04-18-2025, 02:02 PM
» Replies: 6
» Views: 4,718
|
Creating +3 Menus - Loadi...
Forum: Help & Support
Last Post: merlinkv
04-16-2025, 02:08 PM
» Replies: 6
» Views: 3,252
|
Randomize not very random...
Forum: Help & Support
Last Post: Zoran
04-08-2025, 10:40 AM
» Replies: 4
» Views: 3,067
|
Scope rules
Forum: Bug Reports
Last Post: Zoran
04-04-2025, 09:46 AM
» Replies: 2
» Views: 1,693
|
Using constants not allow...
Forum: Bug Reports
Last Post: baltasarq
03-19-2025, 10:00 PM
» Replies: 8
» Views: 4,175
|
404 page not found
Forum: Documentation
Last Post: boriel
03-08-2025, 07:16 PM
» Replies: 5
» Views: 5,041
|
|
|
Another optimizer bug (*solved*) |
Posted by: einar - 11-04-2014, 01:47 AM - Forum: Bug Reports
- Replies (3)
|
 |
Ouch! This bug gave me a headache! It took me some time to figure out the reason my game was crashing...
Take a look at this sample:
Code: sub test()
asm
call $fc12
di
ld a, $fe
ld i, a
im 2
ei
end asm
end sub
test()
Try compiling this sample above using:
Code: zxb.exe -A -O2 prog.bas
And it will produce the expected result:
Code: _test:
push ix
ld ix, 0
add ix, sp
#line 1
call $fc12
di
ld a, $fe
ld i, a
im 2
ei
#line 7
_test__leave:
ld sp, ix
pop ix
ret
However try compiling it again using:
Code: zxb.exe -A -O3 prog.bas
Now the result won't make sense anymore:
Code: _test:
push ix
ld ix, 0
add ix, sp
#line 1
call $fc12
di
im 2
ei
#line 7
_test__leave:
ld sp, ix
pop ix
ret
The problem is, the optimizer is supposed to try to optimize its own generated code only, not someone else's assembly code that it doesn't have enough information to understand!
|
|
|
Weird bug involving OVER 1 (*solved*) |
Posted by: einar - 11-02-2014, 01:47 PM - Forum: Bug Reports
- Replies (5)
|
 |
ZX BASIC has some weird bug involving OVER 1. Unfortunately I was unable to isolate this problem to produce a short example, so I will have to provide my full source code...
The ZEN source code is available here:
<!-- m --><a class="postlink" href="https://www.dropbox.com/sh/bgtoq6tdwropzzr/AAAknv_0PeJGhn36dLJZfGASa">https://www.dropbox.com/sh/bgtoq6tdwrop ... 6dLJZfGASa</a><!-- m -->
Right at the beginning, you will notice it sets ATTR_P to INK 0:
Code: INK 0: PAPER 0: FLASH 0: BRIGHT 0: CLS
Afterwards it never sets a different INK, except for a single PRINT statement at the end of this sub-routine:
Code: sub drawTile(row AS UBYTE, col AS UBYTE, color AS UBYTE)
DIM tile AS UBYTE
DIM ch AS UBYTE
LET tile = PEEK BOARD(row, col)
IF tile = 0 THEN
IF row=0 AND col=width THEN
OVER 1
ELSEIF color=2 THEN
LET tile = 16
END IF
END IF
LET ch = (tile<<2)+32
POKE UINTEGER 23606, @zenchr-256
INK color
PRINT AT row0+(row<<1), col0+(col<<1); CHR$(ch);CHR$(ch+1);AT row0+(row<<1)+1, col0+(col<<1);CHR$(ch+2);CHR$(ch+3);:
INK 0
OVER 0
end sub
An obvious optimization would be setting a temporary INK inside this PRINT statement, instead of using a separate INK statement before, and another INK 0 immediately afterwards. Right? Unfortunately that won't work! Try it yourself. Replace these lines:
Code: INK color
PRINT AT row0+(row<<1), col0+(col<<1); CHR$(ch);CHR$(ch+1);AT row0+(row<<1)+1, col0+(col<<1);CHR$(ch+2);CHR$(ch+3);:
INK 0
OVER 0
with this:
Code: PRINT INK color; AT row0+(row<<1), col0+(col<<1); CHR$(ch);CHR$(ch+1);AT row0+(row<<1)+1, col0+(col<<1);CHR$(ch+2);CHR$(ch+3);:
OVER 0
If you recompile ZEN with this change, parts of the board will be disappearing on screen. If you analyze the screen when it happens, you will notice the INK colors are correct on screen, but the pixels are missing. Therefore this PRINT statement is apparently using OVER 1 even in cases where OVER 1 wasn't set.
This bug is not relevant for me anymore since I have already released this game anyway, but it demonstrates ZX BASIC has some bug involving OVER 1 that may affect other developers in the future.
|
|
|
Routine mapping? |
Posted by: einar - 11-02-2014, 05:51 AM - Forum: Wishlist
- Replies (2)
|
 |
Right now, ZX BASIC already supports variable mapping. If I already have a variable defined at a certain memory address, I can reference it as follows:
Code: DIM x AS UBYTE AT 64000
It would be nice if ZX BASIC could also support routine mapping. If I already have an assembly routine implemented at a certain memory address, I would like to reference it as follows:
Code: DECLARE sub FASTCALL doSomething(src as UINTEGER, dst as UINTEGER) AT 64000
In the meantime, I'm having to use this workaround:
Code: sub FASTCALL doSomething(src as UINTEGER, dst as UINTEGER)
asm
jp 64000
end asm
end sub
EDIT: Of course routine mapping should also work with both sub-routines and functions, either FASTCALL or not, exactly like any other ZX BASIC routine implemented in asm directly inside the routine body.
|
|
|
[poby-news] first test |
Posted by: nitrofurano - 10-23-2014, 12:19 PM - Forum: Other Archs
- No Replies
|
 |
first test for Poby-News arcade machine:
<!-- m --><a class="postlink" href="https://dl.dropboxusercontent.com/u/795795/retrocoding/arcade/PobyNews/example01c_works.zip">https://dl.dropboxusercontent.com/u/795 ... _works.zip</a><!-- m -->
|
|
|
|