Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
POKE STRING and @string$
#1
Just converted the Proportional text routine to a SUB, so it won't crash at exit, but I ran into some problems.
I remember, I asked about it, but the thread was closed then, but you promised to look at this: POKE and PEEK STRING do not work, and something else: @a$ does not return the correct adress of the string stored in a$. It returns a adress, but peeking memory in emulator reveals that the text stored in string is not at the adress. Testing @variable reveals that the adress of normal ubyte variables is correct.
Is this a bug or "feature"? If it is a feature, how to find out the adress of a string stored in Variable?
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
#2
LCD Wrote:Is this a bug or "feature"? If it is a feature, how to find out the adress of a string stored in Variable?
Strings are just pointers to memory blocks (chars), so:
Code:
DIM a$;

PRINT PEEK(Uinteger, @a$)
a$ = "Hello" : REM Assigning a new value *changes* it [u]dynamic[/u] address

PRINT PEEK(Uinteger, @a$)
Notice a$ address pointer changes (reallocates) a$ on each assignation.
Reply
#3
I was expecting, it was a pointer, but I ran into the problem in a sub:
Code:
SUB test(a$ as string)
PRINT PEEK(Uinteger, @a$)
END SUB
If the String is defined in the header of the SUB, it points to a completly wrong adress (I got one on the Attribute area of screen), but thank to your tip boriel, I found a workaround:
Code:
SUB test(a$ as string)
DIM dummy$
dummy$=a$
PRINT PEEK(Uinteger, @dummy$)
END SUB
Now I got the correct adress...
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
#4
LCD Wrote:I was expecting, it was a pointer, but I ran into the problem in a sub:
Code:
SUB test(a$ as string)
PRINT PEEK(Uinteger, @a$)
END SUB
If the String is defined in the header of the SUB, it points to a completly wrong adress (I got one on the Attribute area of screen), but thank to your tip boriel, I found a workaround:
Code:
SUB test(a$ as string)
DIM dummy$
dummy$=a$
PRINT PEEK(Uinteger, @dummy$)
END SUB
Now I got the correct adress...
Not sure, but @parameter should work too. I will investigate it further, as you might catched a bug. @parameter addresses are not in a fixed ram position (the global variables memory block) but in the stack (which is a dynamic one). So, will have a look...
Reply
#5
BUMP!
Are POKE and PEEK STRING supposed to work? This would be great for direct string manipulation. I ask because they do not work. POKE [type] address,value suggest that it should accept any type (Okay, I have not tried floats and doubles yet, and POKE ULONG address,PEEK (ULONG,address) was not working in previous versions, crashing the emulator), so this is something that needs further testing.
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
#6
LCD Wrote:BUMP!
Are POKE and PEEK STRING supposed to work? This would be great for direct string manipulation. I ask because they do not work. POKE [type] address,value suggest that it should accept any type (Okay, I have not tried floats and doubles yet, and POKE ULONG address,PEEK (ULONG,address) was not working in previous versions, crashing the emulator), so this is something that needs further testing.
Nope, the don't. In fact, the problem here is most of you are thinking in C/Asm and not in "High level" language (such as BASIC). You can use memcpy (it's in the library) already for that. Memcpy(Destiny, @varname + 2, len(varname)) will copy an entire string starting at Destiny memory address.
Reply
#7
boriel Wrote:
LCD Wrote:BUMP!
Are POKE and PEEK STRING supposed to work? This would be great for direct string manipulation. I ask because they do not work. POKE [type] address,value suggest that it should accept any type (Okay, I have not tried floats and doubles yet, and POKE ULONG address,PEEK (ULONG,address) was not working in previous versions, crashing the emulator), so this is something that needs further testing.
Nope, the don't. In fact, the problem here is most of you are thinking in C/Asm and not in "High level" language (such as BASIC). You can use memcpy (it's in the library) already for that. Memcpy(Destiny, @varname + 2, len(varname)) will copy an entire string starting at Destiny memory address.

Yes, that is true.
Thanks for clearing this.
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
#8
By the way: <!-- m --><a class="postlink" href="http://www.freebasic-portal.de/befehlsreferenz/poke-476.html">http://www.freebasic-portal.de/befehlsr ... e-476.html</a><!-- m --> (german)
FreeBasic supports POKE/PEEK String
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
#9
btw, it's missing a description about memcopy (or memcpy) at <!-- m --><a class="postlink" href="http://www.boriel.com/wiki/en/index.php/ZX_BASIC:Library">http://www.boriel.com/wiki/en/index.php ... IC:Library</a><!-- m -->

based on that, i'm trying to create a new subroutine, which attempts to do a memcopy from paged memory (128k) (far still incomplete and accurate, because, besides it doesn't work fine yet, it doesn't copy a group of bytes splitted into different neighbour pages)

Code:
sub memcpypagedtodisplay(tdest as ulong, tpadr as ulong, tleng as ulong):
  dim tpvl as ulong
  dim tqadr as ulong
  tpvl=int (tpadr/16384)
  tqadr=tpadr mod 16384
  out 32765,16+(int(tpvl*1.5))
  memcopy(tdest,49152+tqadr,tleng)
  end sub
Reply
#10
nitrofurano Wrote:btw, it's missing a description about memcopy (or memcpy) at <!-- m --><a class="postlink" href="http://www.boriel.com/wiki/en/index.php/ZX_BASIC:Library">http://www.boriel.com/wiki/en/index.php ... IC:Library</a><!-- m -->

based on that, i'm trying to create a new subroutine, which attempts to do a memcopy from paged memory (128k) (far still incomplete and accurate, because, besides it doesn't work fine yet, it doesn't copy a group of bytes splitted into different neighbour pages)

Code:
sub memcpypagedtodisplay(tdest as ulong, tpadr as ulong, tleng as ulong):
  dim tpvl as ulong
  dim tqadr as ulong
  tpvl=int (tpadr/16384)
  tqadr=tpadr mod 16384
  out 32765,16+(int(tpvl*1.5))
  memcopy(tdest,49152+tqadr,tleng)
  end sub
Is this not a little bit offtopic?
Anyway, Memcopy is not optimal, it can be replaced with much faster and shorter ASM routine. I made one and it is on my HDD, but I do not remember which one was working and which not.
Code:
sub CopyMem(src as Uinteger,des as Uinteger,length as Uinteger,bank as ubyte)
    asm
        
        ld a,(ix+11)
        ld bc,32765
        out (c),a
        ld hl,(ix+5)
        ld de,(ix+7)
        ld bc,(ix+9)
        ldir
        ld a,(23388)
        ld bc,32765
        out (c),a
    end asm
end sub
Code:
sub CopyMem(src as Uinteger,des as Uinteger,length as Uinteger)
    asm
        ld d,(ix+7)
        ld e,(ix+6)
        ld h,(ix+5)
        ld l,(ix+4)
        ld b,(ix+9)
        ld c,(ix+8)
        ldir
    end asm
end sub
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
#11
LCD Wrote:
nitrofurano Wrote:btw, it's missing a description about memcopy (or memcpy) at <!-- m --><a class="postlink" href="http://www.boriel.com/wiki/en/index.php/ZX_BASIC:Library">http://www.boriel.com/wiki/en/index.php ... IC:Library</a><!-- m -->

based on that, i'm trying to create a new subroutine, which attempts to do a memcopy from paged memory (128k) (far still incomplete and accurate, because, besides it doesn't work fine yet, it doesn't copy a group of bytes splitted into different neighbour pages)

Code:
sub memcpypagedtodisplay(tdest as ulong, tpadr as ulong, tleng as ulong):
  dim tpvl as ulong
  dim tqadr as ulong
  tpvl=int (tpadr/16384)
  tqadr=tpadr mod 16384
  out 32765,16+(int(tpvl*1.5))
  memcopy(tdest,49152+tqadr,tleng)
  end sub
Is this not a little bit offtopic?
Anyway, Memcopy is not optimal, it can be replaced with much faster and shorter ASM routine. I made one and it is on my HDD, but I do not remember which one was working and which not.
Code:
sub CopyMem(src as Uinteger,des as Uinteger,length as Uinteger,bank as ubyte)
    asm
        
        ld a,(ix+11)
        ld bc,32765
        out (c),a
        ld hl,(ix+5)
        ld de,(ix+7)
        ld bc,(ix+9)
        ldir
        ld a,(23388)
        ld bc,32765
        out (c),a
    end asm
end sub
Code:
sub CopyMem(src as Uinteger,des as Uinteger,length as Uinteger)
    asm
        ld d,(ix+7)
        ld e,(ix+6)
        ld h,(ix+5)
        ld l,(ix+4)
        ld b,(ix+9)
        ld c,(ix+8)
        ldir
    end asm
end sub
At the moment I'm "tera-busy" (not mega, neither giga Tongue) with the compiler refactoring and other projects, so I have almost no time to examine this.
This idea is *very* interesting, and this routine may go in the library/ package, bundled with the compiler. :roll:
Reply
#12
boriel Wrote:At the moment I'm "tera-busy" (not mega, neither giga Tongue) with the compiler refactoring and other projects, so I have almost no time to examine this.
This idea is *very* interesting, and this routine may go in the library/ package, bundled with the compiler. :roll:
Cool. Thanks!
Looking forward for the refactored Compiler.
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
#13
While we are there. How about this?
Code:
sub FillMem(mem as Uinteger,size as Uinteger,byt as Ubyte)
    asm
        ld h,(ix+5)
        ld l,(ix+4)
        ld d,(ix+5)
        ld e,(ix+4)
        inc de
        ld b,(ix+7)
        ld c,(ix+6)
        dec bc
        ld a,(ix+9)
        ld (hl),a
        ldir
    end asm
end sub

paper 7:ink 0:cls
do
FillMem(16384,6144,85)
asm
    halt
end asm
FillMem(16384,6144,170)
asm
    halt
end asm
loop until inkey$<>""
I think, this may be usefull for some coders here too. But I'm just playing around...
Edit: replacing
Code:
ld d,(ix+5)
ld e,(ix+4)
with
Code:
ld de,hl
should work too and save some bytes.
Code:
sub FillMem(mem as Uinteger,size as Uinteger,byt as Ubyte)
    asm
        ld h,(ix+5)
        ld l,(ix+4)
        ld de,hl
        inc de
        ld b,(ix+7)
        ld c,(ix+6)
        dec bc
        ld a,(ix+9)
        ld (hl),a
        ldir
    end asm
end sub
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
#14
thanks, but when testing

Code:
sub cpymempaged(src as Uinteger,des as Uinteger,length as Uinteger,bank as ubyte):
  asm
    ld a,(ix+11)
    ld bc,32765
    out (c),a
    ld hl,(ix+5)
    ld de,(ix+7)
    ld bc,(ix+9)
    ldir
    ld a,(23388)
    ld bc,32765
    out (c),a
  end asm
end sub
sub cpymem(src as Uinteger,des as Uinteger,length as Uinteger):
  asm
    ld d,(ix+7)
    ld e,(ix+6)
    ld h,(ix+5)
    ld l,(ix+4)
    ld b,(ix+9)
    ld c,(ix+8)
    ldir
  end asm
end sub
cls
cpymem(17000,12000,400)
pause 0

i got from terminal:
Code:
memcopytest.bas:5: Error: Syntax error. Unexpected token 'IX' [IX]

(btw, sorry about the offtopic... :S )
Reply
#15
nitrofurano Wrote:thanks, but when testing

Code:
sub cpymempaged(src as Uinteger,des as Uinteger,length as Uinteger,bank as ubyte):
  asm
    ld a,(ix+11)
    ld bc,32765
    out (c),a
    ld hl,(ix+5)
    ld de,(ix+7)
    ld bc,(ix+9)
    ldir
    ld a,(23388)
    ld bc,32765
    out (c),a
  end asm
end sub
sub cpymem(src as Uinteger,des as Uinteger,length as Uinteger):
  asm
    ld d,(ix+7)
    ld e,(ix+6)
    ld h,(ix+5)
    ld l,(ix+4)
    ld b,(ix+9)
    ld c,(ix+8)
    ldir
  end asm
end sub
cls
cpymem(17000,12000,400)
pause 0

i got from terminal:
Code:
memcopytest.bas:5: Error: Syntax error. Unexpected token 'IX' [IX]

(btw, sorry about the offtopic... :S )
Okay, so I do now know which one was not working... LD registerpair,(IX+offset) is invalid. Then this should work:
Code:
sub cpymempaged(src as Uinteger,des as Uinteger,length as Uinteger,bank as ubyte)
  asm
    ld a,(ix+11)
    ld bc,32765
    out (c),a
    ld h,(ix+5)
    ld l,(ix+4)
    ld d,(ix+7)
    ld e,(ix+6)
    ld b,(ix+9)
    ld c,(ix+8)
    ldir
    ld a,(23388)
    ld bc,32765
    out (c),a
  end asm
end sub
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)