3Bit #01
03 января 2005

Programming - the procedure to print the text fonts, 8x8, 6x8, 5x8, 4x8 pixels.

<b>Programming</b> - the procedure to print the text fonts, 8x8, 6x8, 5x8,
4x8 pixels.
    All of the printed characters, ...

(C) Cooper/RSM/P7S


  Today is a rare program, especially systemic, do without it - 
without printing characters.


  On the Spectrum there are 4-D standard
fonts. They differ from each other wide
one character. These formats 8x8, 6x8, 5x8,
4x8 pixels. Consequently, the first format
we can put in one line on the screen
32 characters, the second - 42 characters, the third -
51 character, while the fourth - 64 characters. 5x8 matrix is 
​​the least common among all the others. 

  What represents a block font?
The most common type consists of 256
character - or rather, because of their images.
One character, regardless of size
matrix is ​​given by 8 bytes. For example,
this way is stored in the character set (hereafter - the font), 
the letter "A": 


      adr: bin:

     # C000 00000000

     # C001 00111100

     # C002 01000010

     # C003 01000010

     # C004 01111110

     # C005 01000010

     # C006 01000010

     # C007 00000000


  Not difficult to calculate that the entire font is in memory 
of 2048 bytes. 

  Along with the usual linear fonts
There are so-called screen fonts. There is also
each character consists of eight bytes, the difference lies in 
the same order they are found eight bytes of data symbols in a 
block font (Oh, shit, and said;). For example, all the same 
letter "A" will be stored like this: 


      adr: bin:

     # C000 00000000

     # C100 00111100

     # C200 01000010

     # C300 01000010

     # C400 01111110

     # C500 01000010

     # C600 01000010

     # C700 00000000


  Note the address of occurrence
bytes in memory. Why is it necessary, I will tell
below, we will print these characters
on the screen.


  Well, then, with the font format understood. Once again I 
repeat: all the above refers to the standard fonts, because 
There are non-standard fonts (6x7, packing, proportional fonts 
for printing and others). Now, we will be shaped as letters of 
our (Or Th we've got;) displayed on the screen.



  For this we need a procedure that used recounted given us the 
coordinates to the appropriate address in the screen area. Ie, 
here's this ... 

;========= Coordinates -> scr adr ========
; In: D - Y coordinate, E - X coordinate
; Out: DE - screen adress

        LD A, D

        AND 7

        RRCA

        RRCA

        RRCA

        OR E

        LD E, A

        LD A, D

        AND 24

        OR 64

        LD D, A


  We will not go into details, they say,
what, where and how it works, because is a common procedure and 
is used everywhere. 

 Now consider the nuances of printing fonts with different 
matrices ... 


      Print character 8x8


  Characters with such a matrix display is easier
total. For example, in case A we have kept the character code, 
and in DE - its coordinates on the screen. Then the procedure, 
the print symbol of 8x8 points, will look like: 

;===== Print character 8x8 color =====
; In: DE - coordinates, A - character code
Pr_Sym LD L, A

        LD H, 0

        ADD HL, HL; multiply the character code

        ADD HL, HL; eight ...

        ADD HL, HL

        LD BC, font; ... and add to

        ADD HL, BC; start address font

        LD A, D; familiar to us already

        AND 7; protsedurka;)

        RRCA

        RRCA

        RRCA

        OR E

        LD E, A

        LD A, D

        AND 24

        OR 64

        LD D, A

        LD B, 8
PRINT LD A, (HL); take a byte from the font

        LD (DE), A; and put in a screen

        INC HL; do increment

        INC D

        DJNZ PRINT; go on a cycle

        RET; and return ...


  The speed of this procedure is fairly small. If you get it, 
ie, the speed is not satisfied, then it is time to return to 
our screen fonts. 

  What do we have? Note
the design:

        LD L, A

        LD H, 0

        ADD HL, HL

        ADD HL, HL

        ADD HL, HL

        LD BC, FONT

        ADD HL, BC

  In this snippet code symbol is multiplied by eight and added 
to the address of our font. This is, in fact, spans some of the 
CPU time. If we are To be precise, the multiplication spends 33 
clocks the symbol. It seems nonsense, but when printing,

For example, a screen, this minuscule result in a fair number 
of cycles. 

  Due to the nature of constructing on-screen
fonts, to calculate the address of the symbol does not
to do multiplication. Ie, we now
save these 33 cycles, and in the print cycle
on the screen instead of INC HL, you need to do INC H,
which saves a further 16 cycles.

  "Is it possible to more quickly," - asks the novice coder. Of 
course you can. Look at this: first, what can be done, 
especially not straining, as it is "unroll the loop." Ie, now 
we do not have to be shipped in Register B "eight" (save 7 
clocks), and accordingly, no need to do DJNZ, that

also saves a fair amount of clock cycles.
But note that code section, perebrasyvayushy bytes of the font 
in the screen must be repeated eight times, and this leads to 
an increase in the size of procedure. Should pay for 
everything: (Oh, and do not Remember, if the transfer of the 
last byte on the screen, remove unnecessary commands INC D and

INC H. Why waste time on them?

  For the lazy cite the text of the expedited procedure. And 
here it is;) 

;===== Print character 8x8 (fast) =====
; In: DE - coordinates, A - character code
Pr_Sym LD L, A; in HL - code symbols
        LD H, 0, la, we

        LD BC, font; added to the

        ADD HL, BC; start address font

        LD A, D; familiar to us already

        AND 7; protsedurka;)

        RRCA

        RRCA

        RRCA

        OR E

        LD E, A

        LD A, D

        AND 24

        OR 64

        LD D, A

        DUP 7; directive ALASM!!!

        LD A, (HL); take a byte from the font

        LD (DE), A; and put in a screen

        INC H; increment fnt adr

        INC D; increment scr adr

        EDUP; and so 8 times

        LD A, (HL)

        LD (DE), A

        RET; back ...


      Print characters 4x8


  To print characters of a given size is more convenient to use 
a screen font, where each character is duplicated in the left 
and the right side. Something like this:



      adr: bin:

     # C000 00000000

     # C100 01000100

     # C200 10101010

     # C300 10101010

     # C400 11101110

     # C500 10101010

     # C600 10101010

     # C700 00000000


  Why is it necessary - see below, in the course of
article.

  What is so radically different from the print character 4x8 
8x8 print character? One difference is that

Now for the X-coordinate, we can print
as much as 64 characters, and hence it is
coordinate, can be set from 0 to 63.

  Next, we need to translate these coordinates in the form 
acceptable to us, because at screen of 32 familiarity. In 
general, I will not suffer this garbage and the same score 
text. In short, Sklifosovsky! 

  Take the coordinate X, we shift its team
RR E (usually the X-coordinate marketing "sits"
it is here). Then we get the usual
for the 32-character print coordinates, and
carry flag will indicate which of the halves of familiarity 
print. 

  Here is an example, unpretentious, but at the
However, it is a workable procedure to print the symbols of 
this size. 

;===========================
; Print driver symbols 4x8
; Print A at (D, E)
Print4 LD L, A

        LD H, 0

        LD BC, Font4

        ADD HL, BC

        RR E

        JP C, RIGHT

        CALL Posit

        LD B, 8
LEFT LD A, (HL); print symbol on the left side

        AND% 11110000

        LD C, A

        LD A, (DE)

        OR C

        LD (DE), A

        INC D

        INC H

        DJNZ LEFT

        RET
RIGHT CALL Posit; print symbol on the right side

        LD B, 8
RIGHT1 LD A, (HL)

        AND% 00001111

        LD C, A

        LD A, (DE)

        OR C

        LD (DE), A

        INC H

        INC D

        DJNZ RIGHT1

        RET


  As you can see - nothing difficult!


      Print characters 6x8


  And there will have to tinker, because it
the most difficult to print a character matrix.

  Immediately warn that there will be described only the 
principle of printing such letters are not claiming to be 
something special, because not the fastest speed. To

to learn how to quickly print such
fonts suggest you refer to other
magazines and newspapers, which are discussed in detail
these questions.

  Cite the source immediately, and then prokomentiruem it all.

;===========================
; Print driver symbols 6x8
; Print A at (D, E)
Print68 EX DE, HL

        PUSH HL

        PUSH DE

        PUSH BC

        EX DE, HL; looking for the address of the symbol

        LD L, A

        LD H, 0

        LD BC, Font6

        ADD HL, BC

        EX DE, HL; DE-char image
GetMasks LD A, L

        LD B, A

        SRL A

        SRL A

        LD C, A

        ADC A, C

        ADD A, C

        LD L, A
; Procedure coords-> scr adres =

        LD A, H

        AND # 07

        RRCA

        RRCA

        RRCA

        ADD A, L

        LD L, A

        LD A, H

        AND # 18

        OR # 40

        LD H, A; HL-screen addr


        PUSH HL; depending on the X coordinate

        LD A, B; take the appropriate mask for printing

        AND # 03

        ADD A, A

        LD L, A

        LD H, # 2000

        LD BC, Masks

        ADD HL, BC

        LD C, (HL)

        INC HL

        LD B, (HL); BC-mask

        POP HL

        EXX

        LD B, 8; BC = mask
PrtA1 EXX

        LD A, (DE)

        BIT 7, B

        JR NZ, PrtA2

        RRCA

        RRCA

        BIT 0, C

        JR NZ, PrtA2

        RRCA

        RRCA

        BIT 3, B

        JR NZ, PrtA2

        RRCA

        RRCA
PrtA2 EXX

        LD C, A

        EXX

        BIT 0, C

        JR NZ, PrtA3

        LD A, B

        CPL

        AND (HL)

        LD (HL), A

        EXX

        LD A, C

        EXX

        AND B

        OR (HL)

        LD (HL), A

        BIT 7, B

        JR NZ, PrtA4
PrtA3 INC L

        LD A, C

        CPL

        AND (HL)

        LD (HL), A

        EXX

        LD A, C

        EXX

        AND C

        OR (HL)

        LD (HL), A

        DEC L
PrtA4 INC H

        INC D

        EXX

        DJNZ PrtA1

        POP BC

        POP DE

        POP HL

        RET

Masks DEFW # FC00; mask printing characters 6x8

        DEFW # 03F0

        DEFW # 0FC0

        DEFW # 003F


  When printing these fonts we already have to use things like
mask (what it is, I think, to explain
not necessary, because usually all programmers start out with a 
print of sprites. And there close to the mask;) In general, 
this procedure prints just two familiarity. It is necessary for 
the reason that the width of a character by no means a multiple 
of familiarity, it turns out that certain characters should be 
print at the junction of the two familiarity. Interest also 
lies in the fact that the 4-D symbol on occupy a width of 
exactly three familiarity. Therefore, it is not difficult to 
guess, only four masks. In fact, after every fourth characters 
we are beginning to print from the beginning of familiarity, 
etc. 

  At the start, depending on the coordinate
X, select the required mask and falls
on the screen, only then superimposed over the symbol. I think 
that the principle is clear;) 

  You can print thong (messages) in portions at 4-D characters 
each, ie multiple of familiarity. Thereby increasing the 
printing speed. But we must use an another procedure;)



    Print symbols in color


  To do this we need to calculate the following address on the 
screen to use this protsedurku, which translates the address in 
the display area at the appropriate address in the field 
attributes. 

;========= Scr adr -> attr adr ========
; In: DE - screen adress
; Out: DE - attr adress

        LD A, D

        RRCA

        RRCA

        RRCA

        AND 3

        OR # 58

        LD D, A


  For symbols of 8x8 and 4x8, I think everything is
understandable, but to print 6x8 pomozgovat need to check on 
how much familiarity must be painted - one or two. But this 
I'll leave you to an independent study. Not all chew in his 
mouth lozhit;) and must own a little thinking. And then we 
shall everything here with atrophied like PTs'shnyh

gamers brains;)


        Print strings


  Finally give the sleek protsedurku
Print messages. Yes, the token installation
coordinates can be anything - it is already yours
case. You can add here and a token color settings: 16, a color 
code. And it is possible as in ACEdit'e;)


;==================================
; -= The printing strings =; Rin: DE - coordinates
; HL - address of a string of text
Is supported by the tokens:
; 0 - End of Text
, 17, X, Y - coordinates printing plant
;==================================
Pr_Str LD A, (HL); take a character code

        AND A; check for zero

        RET Z; coincided - to leave

        CP 17; check for token

        JP NZ, Pr_Cont

        INC HL; installation of the new coordinates

        LD E, (HL)

        INC HL

        LD D, (HL)

        INC HL

        JP Pr_Str
Pr_Cont PUSH HL

        PUSH DE

        CALL Print8; you need it how to print

        POP DE

        POP HL

        INC E

        INC HL

        JP Pr_Str





Other articles:

From the Editor - the new Ukrainian electronic journal called "3BiT".

From the Editor - eve: correspondence with the authors of the magazine correspondents.

From the Editor - Credits: The authors of the magazine.

Speccy news - news: Scl published newspaper Cossackos, the results of the Voronezh Festival KidSoft'2004, Sergey Bulba archive AY music, Alone Coder released Info Guide # 6 ...

Programming - a new fast and short PT3.x Player of the RSM.

Programming - Design source: the basic requirements for listing of the program focused on the general public.

Programming - the procedure to print the text fonts, 8x8, 6x8, 5x8, 4x8 pixels.

Programming - an overview of features and company models ottechestvennogo Spectrum of Rob F.

Programming - a collection of codes: Draw a window frame in the color processing of disk errors TR-DOS, a universal procedure Scroll'a screen.

Programming - Game Making: Mad Killer shares his experience creating games for the ZX Spectrum.

Programming - Non-standard use of the General Sound: Sound emulation coprocessor AY-3-8910.

Hacker Zone - "phreaking": Freestuff calls to payphones. Free calls to anywhere world.

Outlook - Dune for the Spectrum of Sosyura Igor.

Have an opinion - Mad Killer accuses of corruption Inforkom PC.

Desktop - JPEG / GIF laboratory 1.1: a program for viewing images in a format JPEG / GIF.

Desktop - General Sound AY Emulator v1.0

Desktop - an overview of tools to search for music files, Pro Tracker 3.X Mod Finder v1.2

Gambling - The archivist: a review of not very fresh but I wonder adventyury "Last adventure. "

Gambling - Wolf 2004: The world saw something that worked Alone Coder entire 8-NIL years!

Zhelezyachki - Something about the CMOS-clock: a modified scheme of Alone Coder'a.

Zhelezyachki - an overview of some modern controllers for use with external storage media for the ZX-Spectrum.

Veselukha - Life is simple sysadmin and sad and dreary if there no beer: sysadmin is dedicated.

Veselukha - a humorous story: I am a machine.

Veselukha - Computer jokes.

Another World - Radeon X700: an inexpensive base for gaming cards.

Miscellaneous - report of Rob F. with the Ukrainian hangouts SpeXtream'2004.

Miscellaneous - age: what do you want the software, especially games and how to make them well.

Miscellaneous - Competition from GROUPS P7S for Patriots Spectrum!

Miscellaneous - An Interview with DESALEX'om / XPJ.

Miscellaneous - an interview with the author of one of the most anticipated game projects, games, Dune: The Battle for Arakkis.

Miscellaneous - an interview with the author of acclaimed demos under the VIC-20 - Viznut / PWP.

Miscellaneous - an interview with the renowned British spektrumistom Gasman / Raww arse.

Miscellaneous - An Interview with Random'om taken on Construction Chaos 2004.

Miscellaneous - Advertisement - motor trade and not only.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Similar articles:
Paradox 2000 - Interview with Sergei Kolotova / Serzh Soft.
System - full disc version of the program to create adventyurnyh games: Graphic Adventure Creator (GAC).

В этот день...   29 April