[Coco] Programming help needed

tim franklinlabs.com tim at franklinlabs.com
Sun Dec 2 06:18:21 EST 2018


   A string terminates with a zero. If there's a chr$(0) somewhere in the
   midpoint of the string, BASIC would see that as an "End of String" and
   stop processing. Only part of the string data would be saved. I haven't
   verified this but that's what I would expect.

     On December 2, 2018 at 1:19 AM William Astle <[1]lost at l-w.ca> wrote:
     On 2018-12-01 5:59 p.m., Paul Shoemaker wrote:

     Need some advice. I am trying to store to a disk file a 48x40
     section from a PMODE 4 screen.
     The method I am attempting to use is to peek the byte values using a
     nested loop and save them as a string. For example, A$ = A$ + CHR$
     (PEEK(&HE00+X+(Y*32))). Note I am storing the byte value as a CHR$
     because doing so makes the completed string length only 240 bytes
     long. Creating the string is working fine; I have validated that.
     Saving the string to a disk file is not working, however. When I
     execute a WRITE #1,A$ followed by a PUT #1,<record #>, Disk BASIC is
     not saving entire contents of A$. I believe it is parsing the string
     as it goes or something, as it seems to be ignoring or even stopping
     on some "special" CHR$ codes.. like CHR$(0).
     Is there a way around this?
     Thanks!
     -Paul

     WRITE should be exactly equivalent to PRINT except that it will
     surround
     string data with quotes (and numeric data won't have quotes). I
     assume
     you're using READ or INPUT after a "GET" as a way to get the result
     back. That *will* stop reading at a NUL byte since NULs terminate
     parsing strings in the interpreter.
     Basically, your problem is that you are using random files wrong.
     What
     you're doing is okay for text formatted records. However, it's not
     binary safe. What you should be doing is:
    1. Open the file with in random/direct mode with a specified record
       length.

    2. Use FIELD to set up variables for the record:

     FIELD #1,<record size> AS F$
    3. Put your data into F$ using LSET (or RSET if you want it right

     justified). DO NOT simply assign to F$. In fact, don't assign to F$
     at
     all since it will disassociate it from the file record. For example:
     LSET F$ = A$
    4. Now use "PUT #1, <record #>"

     Reading works the same but use "GET #1, <record number>" and then
     access
     the string variable specified in the FIELD command. Again, don't
     assign
     to that variable since that will break its association with the file
     record.
     The above *is* binary safe.
     Obviously, it can be more complicated than that by having multiple
     fields for a particular file. You can even have multiple record
     structures using different variable names for the same file.
     --
     Coco mailing list
     [2]Coco at maltedmedia.com
     [3]https://pairlist5.pair.net/mailman/listinfo/coco

References

   1. mailto:lost at l-w.ca
   2. mailto:Coco at maltedmedia.com
   3. https://pairlist5.pair.net/mailman/listinfo/coco


More information about the Coco mailing list