TEXT MISER
by Ray Elder
from ZX Computing January 1987

Ray Elder presents a program for efficient text storage.


Although the program as printed is nothing special, the end product
will save a minimum of 15 bytes per message on a 100 location
adventure - this becomes 1500+ bytes!

In simple terms the program takes a text and/or graphics input and
stores it sequentially as bytes. The short 36 byte machine code
routine then prints out the text as required.

The routine and code is completely relocatable and options to view the
text before storage, re-entering it, and viewing all the stored text
are included.

The main disadvantage is that editing of stored text is not possible
(at the moment) so it is wise to plan the entries before using the
program. Once you have entered the program, the machine code is built
in - make sure the DATA line is accurate, just run it and follow the
prompts. If you just press ENTER for the x,y co-ordinates and the INK
and PAPER colours, the program defaults to PRINT AT 0,0; INK 0; PAPER
7.

At any time you can leave the text entering routine and view what you
have stored so far, going back from the option page if you require to
add more.

Details of the number of entries made and the length of the file are
also given so you can keep an eye on how much space you have left. The
program starts at 40000 but this can be lowered if you wish. From the
option menu you can save the code to tape; it saves as "text" CODE
40000, length.


Using the text

The stored text can be used from either machine code programs or from
BASIC. First it should be loaded to the required address, for example
to load it to 50000 first CLEAR address-2 (49998) then LOAD "" CODE
50000. Obviously the address+length (as given on the option page) must
not exceed 65535. The reason for clearing two below the address is
that the program uses the address-1 location to get the text item
number.

For BASIC the most economical way is to set up a variable for the call
address, eg. LET z=50000, and to print the required message POKE the
item number into z-1. So to print the fifth message you would use POKE
z-1,5: RANDOMIZE USR z.

As you may have gathered it is very useful to keep a list of your
messages; menu option 1 is useful for this.

From machine code, stack the values of AF, BC, DE and HL if you want
to preserve them, load BC with the routine's address - LD BC 50000 -
POKE the message number to the address-1 and CALL the address.


Advantages

Apart from being an economical way of storing text, it has the
advantage that the text cannot be read by listing the basic program.
The technique of setting up such a text "table" is one which has been
used extensively before the advent of good old inefficient BASIC where
DIMming a string often means most of the string is wasted spaces.

Each message takes up only the length of that message plus eight
bytes, the format of the stored message is:

1 byte, total length of entry
1 byte, paper token character
1 byte, paper colour
1 byte, ink token character
1 byte, ink colour
1 byte, AT token character
1 byte, Y co-ordinate
1 byte, X co-ordinate
n bytes, the characters of the message


Machine code routine

9C40          0000       ORG  40000
9C40 213200   0005       LD   HL,50
9C43 09       0010       ADD  HL,BC
9C44 0B       0015       DEC  BC
9C45 0A       0020       LD   A,(BC)
9C46 3D       0025       DEC  A
9C47 FE00     0030       CP   0
9C49 2808     0035       JR   Z,PRINT
9C4B 47       0040       LD   B,A
9C4C 1600     0045       LD   D,0
9C4E 7E       0050 LOOP  LD   A,(HL)
9C4F 5F       0055       LD   E,A
9C50 19       0060       ADD  HL,DE
9C51 10FB     0065       DJNZ LOOP
9C53 E5       0070 PRINT PUSH HL
9C54 3E02     0075       LD   A,2
9C56 CD0116   0080       CALL 1601H
9C59 E1       0085       POP  HL
9C5A 0600     0090       LD   B,0
9C5C 4E       0095       LD   C,(HL)
9C5D 0D       0100       DEC  C
9C5E 23       0105       INC  HL
9C5F EB       0110       EX   DE,HL
9C60 CD3C20   0115       CALL 203CH
9C63 C9       0120       RET
              0125       END
PRINT 9C53   LOOP  9C4E   #     5E3E


--
Another Fine Product transcribed by:
Jim Grimwood, Weardale, England (http://www.users.globalnet.co.uk/~jimg/)
--
