ZalaXa 9 — Proportional Fonts with FZX

FZX is an excellent proportional font driver by Andrew Owen and Einar Saukas. The latest source code can be downloaded here, although the version I have added to the code for part 9 has been slightly modified.123

FZX is an indispensible font editor by Klaus Jahn. Download it from here by clicking on the image.

The SetupMenu routine has a new section, as I’ve rewritten it to use a proportional font instead of the standard Spectrum font.

7
8
9
10
11
12
;menu.asm
 
                        ld hl, Font.Namco               ; Set FZX font
                        ld (FZX_FONT), hl
                        ld hl, MenuText.FZX             ; Start of menu ASCII data
                        PrintTextHL()                   ; Macro to print FZX proportional text with FZX

We set the font file to use 4, load hl with the address of the new menu text, and invoke the PrintTextHL macro. The macro looks like this:

23
24
25
26
27
28
29
30
31
32
33
34
35
;macros.asm
 
PrintTextHL             macro()
PrintMenu:              ld a, (hl)                      ; for each character of this string...
                        cp 255
                        jp z, Next                      ; check string terminator
                        push hl                         ; preserve HL
                        call FZX_START                  ; print character
                        pop hl                          ; recover HL
                        inc hl
                        jp PrintMenu
Next:                                                   ; This will be whatever code follows the macro
mend

We don’t really need to know much about the internals of FZX_START, except that it prints a single ASCII character in the range 32 to 255. It uses a pixel coordinate system, so the numbers are eight times larger than the BASIC PRINT routine. It recognises the At constant, which is followed by a pair of coordinate bytes, Y first.

Here is the revised MenuText table. You will see I have cheated slightly—because FZX doesn’t set attribute colours, I have retained the previous ROM printing code, which sets the same attributes as before, but only prints spaces. I wouldn’t normally do it like this, but I intend to change the menu again later, so let’s keep it quick and dirty for now.

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
;macros.asm
 
MenuText                proc                            ; Named procedure to keep our print data tidy
                        db At, 7, 13                    ; These codes are the same as you would use
                        db Paper, Black, PrBright, 1    ;   with Sinclair BASIC's PRINT command
                        db Ink, Red, " "                ; Set the attributes here, with spaces,
                        db Ink, Yellow, " "             ;   because FZX only prints pixels
                        db Ink, Cyan, " "
                        db Ink, Magenta, " "
                        db Ink, White, " "
                        db Ink, Green, " "
                        db At, 21, 6
                        db Ink, Yellow, "      "
                        db Ink, White, "      "
                        db Ink, Yellow, "        "
Length                  equ $-MenuText                  ; Let Zeus do the work of calculating the length
                                                        ; ($ means the current address Zeus is assembling to)
FZX:                    db At, 56, 104                  ; FXX coordinates are (Y, X) in pixels
                        db "ZA%AXA"
                        db At, 168, 55
                        db "PRESS SPACE TO START"
                        db 255                          ; Terminator byte
pend

You may also notice the % character in ZA%AXA. I did this because L in the Namco font was a bit narrower, and stopped the text aligning to character boundaries. I defined an unused character as a slightly wider L.

The Namco font is imported with a standard import_bin directive:

16
17
18
19
20
;database.asm
 
Font                    proc
  Namco:                import_bin "..\fonts\Namco.fzx"
pend

I’ve done something very similar in SetupGame:

25
26
27
28
; menu.asm
 
                        ld hl, GameText                 ; Start of menu ASCII data
                        PrintTextHL()                   ; Macro to print FZX proportional text with FZX
45
46
47
48
49
50
51
52
53
; database.asm
 
GameText                proc                            ; FXX coordinates are (Y, X) in pixels
                        db At, 0, 0, "&UP"
                        db At, 0, 94, "HIGH SCORE"
                        db At, 9, 0, "0"
                        db At, 9, 112, "20000"
                        db 255                          ; Terminator byte
pend

The &UP text is actually 1UP. Proportional fonts conventionally have all their digits to same width, so that columns of numbers always line up. Doing it this way makes the 1 of 1UP start on the second pixel of the line, so I made a shifted version of it in another space character.

If you recall, in part 8 we set the first character line of the game screen to bright red, and the second line to bright white, using the ClsNirvana routine. Well, if we got everything right, our new score text will appear in the right place, with these colours.

It does! I think this looks reasonably like the font Namco used in the original arcade version of Galaga.