Welcome, Guest
You have to register before you can post on our site.

Username
  

Password
  





Search Forums

(Advanced Search)

Forum Statistics
» Members: 293
» Latest member: BillBennar
» Forum threads: 1,027
» Forum posts: 6,211

Full Statistics

Online Users
There are currently 391 online users.
» 0 Member(s) | 388 Guest(s)
Bing, Google, Yandex

Latest Threads
Includes in ASM
Forum: How-To & Tutorials
Last Post: bracckets
04-04-2024, 12:17 AM
» Replies: 2
» Views: 900
Intermittent errors
Forum: Help & Support
Last Post: zarsoft
03-12-2024, 12:39 PM
» Replies: 0
» Views: 463
Store array information i...
Forum: Help & Support
Last Post: rbiondi
03-10-2024, 09:42 PM
» Replies: 0
» Views: 615
ScrollLeft function scrol...
Forum: Bug Reports
Last Post: rbiondi
03-07-2024, 03:57 PM
» Replies: 2
» Views: 1,194
string.bas errors when co...
Forum: Bug Reports
Last Post: rbiondi
03-01-2024, 10:10 AM
» Replies: 2
» Views: 1,057
Using Beepola with ZX BAS...
Forum: How-To & Tutorials
Last Post: edtoo
02-29-2024, 09:47 AM
» Replies: 15
» Views: 34,606
Johnny Bravo
Forum: Gallery
Last Post: zarsoft
02-11-2024, 11:20 PM
» Replies: 0
» Views: 630
Compiling +D G+DOS progra...
Forum: ZX Basic Compiler
Last Post: boriel
01-22-2024, 08:32 AM
» Replies: 4
» Views: 9,236
VAL = ? (solved)
Forum: Bug Reports
Last Post: zarsoft
01-03-2024, 11:44 PM
» Replies: 8
» Views: 4,255
Wrong math (solved)
Forum: Bug Reports
Last Post: zarsoft
01-03-2024, 11:38 PM
» Replies: 4
» Views: 2,333

 
  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.

Print this item

  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?

Print this item

  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?

Print this item

  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.

Print this item

  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. Smile

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. Smile

Print this item

  SEO & Permalinks enabled
Posted by: boriel - 11-15-2010, 02:03 PM - Forum: News - No Replies

I've enabled SEO and friendly URLS (a.k.a. permalinks) in this forum. Please, report any web error (e.g. 404 - Not found) here or in a private message.

Thank you, and sorry for any inconvenience.

Print this item

  Spam on this forum
Posted by: boriel - 11-05-2010, 11:02 PM - Forum: News - No Replies

This forum has recently being attacked by spammers. We're trying to fix this. Sorry for any inconvenience. :|

Print this item

  Randomize does not change the Seed (*solved*)
Posted by: LCD - 08-16-2010, 02:24 PM - Forum: Bug Reports - Replies (3)

Another bug i discovered in the latest dev version is that RANDOMIZE does not change the seed.
I got exactly the same RND numbers with RANDOMIZE 0 as with RANDOMIZE 1 or even RANDOMIZE (without number, after a pause 0 to avoid the fact that the emulator always starts with frame count 0 and uses it as Seed.
Here is the evidence:

Code:
print "Actual Seed: ";peek (uinteger,23670)
randomize 45
print "Seed after Random 45: ";peek (uinteger,23670)
randomize 37
print "Seed after Random 37: ";peek (uinteger,23670)
randomize
print "Randomized seed: ";peek (uinteger,23670)
There is a way around it:
Code:
poke uinteger 23670,peek (uinteger,23672)
This does not rely on RANDOMIZE, it just copies two bytes from frames sysvar to seed sysvar, and gives you every time you start a program, new RND sequence (After a PAUSE 0 or selecting controls).

Print this item

  Screen corruption & possible crash (*solved*)
Posted by: LCD - 08-15-2010, 02:43 PM - Forum: Bug Reports - Replies (10)

I wrote a function to transform Speccy frames to a timer:

Code:
function Clock(tim as uinteger) as String
    dim secs as Uinteger
    dim mins,sec as ubyte
    dim s$ as String
    s$=""
    secs=int(tim/50)
    mins=int(secs/60)
    sec=secs mod 60
    s$=str(sec)
    if len(s$)=1 then
        s$="0"+s$
    end if
    return str(mins)+":"+s$
end function

dim a as uinteger
for a=0 to 1000
    print at 0,0;Clock(a)
next a
After calling it often (it shows effect around timecode 0:08), there was a screen memory corruption. In my full program the timer was still working, but the keys did not work anymore, and after that, even the minute display was corrupted. Maybe a overflow?
Reducing the Heap size from default to 100 caused no corrupted screen memory, but a complete crash.
Oh, and I'm using the latest devel version.

Edit:
It looks like there is a leak in the STR function, as without STR my program does not crash after a while.

Print this item

  pos.bas (*solved*)
Posted by: britlion - 07-31-2010, 07:49 PM - Forum: Bug Reports - Replies (11)

Code:
#include <input.bas>

Drops the following error:
pos.bas:17: Error: syntax error. Unexpected token 'case_insensitive'

Obviously this happens with anything else that includes pos.bas as well, like #include <sinclair.bas>

Print this item