Page 1 of 3

Changing Fonts in ZX Spectrum :)

Posted: Fri Jun 28, 2019 2:40 pm
by alban lusitanae
Hi to all

This will be my first programming post on this forum :) Please note I just started a little bit of programming learning
and in my concept I am reducing myself only to BASIC, no Assembler. So I'm creating a "game" to test where my knowledge goes at the moment.
Appologies if it is long but I will try to be as detailed as possible.

In the "game" test I am creating, I have my idea figured out, but I would like to use a different font, just for fun, and to see how difficult it is.
At first glance, it shouldn't really be THAT difficult, since it involves drawing each of the characters as you do for UDGs, storing them in a memory
and then using what I like to call Zedex's Biggest Secret, tampering with the system variables through POKE to basically shift the ROM's CHARS into reading the previous allocated memory.

This is where it gets confusing. I chose to use BASINc to code and it actually has FONTs binaries inside, mainly from Damien Guard who is a very cool guy and shared his work for people to use at https://damieng.com/typography/zx-origi ... aEYiiW6HU8 . When you try to extract the data out of it (the BASINc version), this is an example of what comes out (considering you chose 255 bytes per line and 64000 as the memory to send the data to):

10 RESTORE 11: FOR F=64000 TO 64767: READ A: POKE F,A: NEXT F
[ALL DATA STATEMENTS starting at 20]

This is pretty normal stuff you would also see while drawing UDGs, the start decimal drawing in data and allocation to the right place.
Then you would add the two POKE instructions, POKE 23606,low byte + POKE 23607,high byte.

I thought that you could just get the data above and mix it with the CHARS redirect to avoid having to load "" code the whole font from TAP,
and when I queried, someone at another "forum" came with this:

10 LET f=64000: CLEAR f-1
100 RESTORE 101: FOR F=64000 TO 64767: READ A: POKE F,A: NEXT F
[ALL DATA STATEMENTS]

and then for the CHARS redirect they send me this:

200 POKE 23607,INT (f/256)-1: POKE 23606,f-256*INT (f/256)

which it is supposed to save me the trouble of matching the value of the POKE statement precisely with these equations to make the CHARS align perfectly to the memory location I chose (on this case 64000). I then added a 210 PRINT "THIS IS A TEST" statement to test the font allocation to the screen file. To my surprise, There was no error, but there was nothing printed as well!

I went to Damien's page and extracted a TAP file, where he LOAD "" CODE what I believe to be all the data before the CHARS redirect
from a memory allocation of 49152,768 and then uses POKE 29606,0; POKE 29607,191 and strangely POKE 29607,60 again after print test the FONT to the screen. And yeah the TAP has two LOAD "" CODE 49152,768 blocks which are the two variants, and which you can actually click L and it loads a new FONT overiding the previous one.

So after all of this, my questions are:
1 - Can you or can you not trigger the FONT without LOADing it from TAP with a memory allocation
2 - What is the best memory placement to place fonts (so you can BASIC code without a problem)
3 - What is the best code to use, both in creating the FONT and in the valuing of variables ?

Thank you guys for everything you can help me with, I would like to LEARN how to use it, not keep replicating code I really don't get (even if it works).

Best Regards
Alban

Re: Changing Fonts in ZX Spectrum :)

Posted: Fri Jun 28, 2019 3:14 pm
by spider
1. Not really, not unless you 'write' directly to the new font location to 'build' it live. A bit like that character thickener routine that's been used in a few bits of Basic. Not unless you change it in the ROM that is. :D

2. As high as sensibly possible really just before the UDG's if you are using those. If you have any code then you'll probably want that as high as possible too. This will allow as much space as possible for Basic, assuming you are using CLEAR x-1 (x being the start of any code and/or the font code)

3. I have something that may help the charset finder but its quite easy to use, can't attach in this forum area for some reason.

EDIT... Regarding (1) you can have as many in memory as you can sanely fit and switch between them via 23606/23607 if you want.

Re: Changing Fonts in ZX Spectrum :)

Posted: Fri Jun 28, 2019 3:41 pm
by alban lusitanae
spider wrote:
Fri Jun 28, 2019 3:14 pm
1. Not really, not unless you 'write' directly to the new font location to 'build' it live. A bit like that character thickener routine that's been used in a few bits of Basic. Not unless you change it in the ROM that is. :D

2. As high as sensibly possible really just before the UDG's if you are using those. If you have any code then you'll probably want that as high as possible too. This will allow as much space as possible for Basic, assuming you are using CLEAR x-1 (x being the start of any code and/or the font code)

3. I have something that may help the charset finder but its quite easy to use, can't attach in this forum area for some reason.

EDIT... Regarding (1) you can have as many in memory as you can sanely fit and switch between them via 23606/23607 if you want.
First of all, many thanks for the quick answer, much appreciated by this noob :D

Ok, so I just have to know how to properly save and load the blocks, that is ok, if it is how you do it, it's how you do it.
I AM using a SERIOUS amount of UDG usage (we're talking about multiple draw and redraw of the 21 UDGs during the program)
but if I load the Font at the start of the program before anything say at 64000, then the several UDG redraws at 65000+ and prints to the screen file won't actually touch the FONT at 64000 correct? I normally don't do memory allocation or anything else (because... yeah, I don't know how ;) noob), I just type the program, with some subroutines and stuff, but I don't think I will EVER reach the 64000 allocation with the program code...

What are your thoughts on that (and can I see that code? :))

Re: Changing Fonts in ZX Spectrum :)

Posted: Fri Jun 28, 2019 3:51 pm
by Einar Saukas
It's quite easy:
  • In your favorite emulator, insert a tape containing fonts. For instance file "ZX-ALFA(Fonts).tzx.zip" from here.
  • Type this program:

    Code: Select all

    10 CLEAR 63999
    20 LOAD ""CODE 64000
    30 POKE 23607,249
    40 PRINT "OK!"
  • Execute this program above typing "RUN"
That's all.

Re: Changing Fonts in ZX Spectrum :)

Posted: Fri Jun 28, 2019 4:06 pm
by alban lusitanae
Einar Saukas wrote:
Fri Jun 28, 2019 3:51 pm
It's quite easy:
  • In your favorite emulator, insert a tape containing fonts. For instance file "ZX-ALFA(Fonts).tzx.zip" from here.
  • Type this program:

    Code: Select all

    10 CLEAR 63999
    20 LOAD ""CODE 64000
    30 POKE 23607,249
    40 PRINT "OK!"
  • Execute this program above typing "RUN"
That's all.
Well thanks Einar"!! And I'll be... I actually chose the EXACT SAME high address as the ZX SOFT team chose (of which you are one of the two)... I must be doing something right! This basically tells me that I might have been thrown off path with all of the other forum's responses... why the whole complicated algorithm??

I'll test all of this and then report back :) thanks a lot. 8-)

Re: Changing Fonts in ZX Spectrum :)

Posted: Fri Jun 28, 2019 5:14 pm
by Einar Saukas
You are welcome! :)

Re: Changing Fonts in ZX Spectrum :)

Posted: Fri Jun 28, 2019 8:14 pm
by R-Tape
alban lusitanae wrote:
Fri Jun 28, 2019 4:06 pm
I'll test all of this and then report back :) thanks a lot. 8-)
Welcome alban!

ZX-Alfa is an absolute treasure trove for using fonts (I think "COUNTDOWN" is my favourite); I've used it many times myself. Einar's code is almost correct, but it has one small bug, corrected here:

Code: Select all

10 CLEAR 63999
20 LOAD ""CODE 64000
30 POKE 23607,249
40 PRINT "Hello World"

Re: Changing Fonts in ZX Spectrum :)

Posted: Sat Jun 29, 2019 9:35 pm
by alban lusitanae
Hi to all

Just tested and it works :) trhank you very much for all your help, you will be credited of course on any TAP I make.
Just one thing, when I decide to actually draw 768 bytes of my own, do I SAVE "" CODE 64000 or 64000,768? I'm assuming 64000,768

best regards

Re: Changing Fonts in ZX Spectrum :)

Posted: Sat Jun 29, 2019 9:49 pm
by R-Tape
alban lusitanae wrote:
Sat Jun 29, 2019 9:35 pm
Hi to all

Just tested and it works :) trhank you very much for all your help, you will be credited of course on any TAP I make.
Just one thing, when I decide to actually draw 768 bytes of my own, do I SAVE "" CODE 64000 or 64000,768? I'm assuming 64000,768

best regards
The first option: SAVE "FONTNAME" CODE 64000,768

In fact BASIC won't let you do anything else: when saving a codeblock you have to specify FILENAME, START LOCATION, LENGTH.

Re: Changing Fonts in ZX Spectrum :)

Posted: Sat Jun 29, 2019 9:58 pm
by Einar Saukas
alban lusitanae wrote:
Sat Jun 29, 2019 9:35 pm
Just tested and it works :) trhank you very much for all your help, you will be credited of course on any TAP I make.
I'm glad it worked :)

There's no need to credit me for providing help.

It's only if you use any of my fonts or someone else's, then it's good practice to credit it.