Deja Vu #04
31 марта 1998

CODING - Print numbers in different number systems: print decimal and hexadecimal, binary, and Roman numbers, seal numbers in the radix set by the user.

<b>CODING</b> - Print numbers in different number systems: print decimal and hexadecimal, binary, and Roman numbers, seal numbers in the radix set by the user.
SoundTrack: "FuCK iSn'T A FacT Yet" (A. FER)
__________________________________________


 (C) Kolotov Sergei g.Shadrinsk, SerzhSoft
__________________________________________


 PRINTING numbers in different number systems
__________________________________________



                  *



   One of the major computer problems
is the derivation of numbers on screen (in print).
And the numbers may be in different number systems, of which 
there are not so little. 

   The most familiar to us all, of course
                but the same is the decimal
 S system, ie system schisc S representation with base 10. De
  S dozen here appears not
) S accident: a man with a deep S Coy antiquity believed in the 
power of singing S fingers, and they both R S is known - ten. 
But com   S puter "usual" assume

                a thief is not in the decimal system, but in 
binary, because All information in It seems the electric charges

is the current (1) and no current (0). Since the same move with 
the "computer" language in the normal man? 

   The following procedure prints
number specified in the register A (accumulator) in decimal 
form. Print runs standard command RST # 10 in the current 
output stream. The length of the procedure, 23 bytes. In its 
work, it uses a 3-byte table tens of degrees, and when 
performing in cycle counts and prints the number of hundreds 
(first figure), tens of (Second) and units (third digit) 
numbers. 


              See Listing 1.



   Yet it is unlikely that did not
will need to print, say,
hexadecimal or binary systems
notation. Yes, even in the same decimal, but, for example, 
numbers in the range of not 0 to 255 and from 0 to 65535. 
Therefore advisable to always enough "to have on hand" library 
of procedures designed Print numbers in various number systems, 
in various ranges. What me and realized ... 


              See Listing 2.


   The structure of this library includes procedures for the 
printing of numbers in various number systems. Namely: decimal,

hex, binary, installed
user (eg, octal), and
as a particularly exotic, the system Roman numbers.

   Procedures that make up the library,
have much in common and fully understand the one, you can more 
quickly grasp in the principle of rest. All headlines

printing procedures start with P
(Print). Further there are three letters that define a system 
in which printed number. Then, separated by an underscore, 
followed by one of the symbols of B or W, Determining the range 
of numbers printed: bytes (Byte) or Word (Word). In the first 
case (B), before calling the procedure, the number should

in register A (accumulator), and
In the second case (W) - in the register pair
HL. Printing is done in the current thread
O (Team RST # 10).


      Library description PDES LIB.



1. Print decimal.


   1.) Procedure PDEC_W - print numbers
located in the register pair HL. Print Range: 00000 .. 65535. 
Length of procedure 26 bytes. Uses a table of degrees of tens 
DECTB_W. 

   2.) Procedure PDEC_B - print the number of A
(000 .. 255), 11 bytes. The work is PDEC_W.

   3.) Procedure PDEC_3B - print numbers
given by three registers: A, H, L (for
seniority). Print range: 00000000 ...
16777215 (2 ^ 24-1). The length of the procedure, 40 bytes.
Causes PDEC_B and PDEC_W. This procedure
was put into this makes it possible for a library with
sometimes encountered problems in printing numbers greater than 
65535. For example, without this there manage to derive the 
number of cycles in an interrupt.


   4.) Table DECTB_W - contains dozens of 5 degrees, defined as 
a word (2 bytes) - Length of 10 bytes.


   Total length of section: 10 +40 +11 +26 = 87 bytes

2. Print hexadecimal numbers.


   1.) Pr-pa PHEX_LB - printing ml. nibble in A (0 .. F), 14 
bytes. 

   2.) Pr-pa PHEX_HB - print art. nibble in A (0 .. F), 4 
bytes. Swaps the nibbles in the A and causes PHEX_LB. 

   3.) Pr-pa PHEX_B - print the number of A
(00 .. FF), 3 bytes. Two times is
PHEX_HB.

   4.) Pr-pa PHEX_W - print the number of HL
(0000 .. FFFF), 5 bytes. Two times is
PHEX_B.

   Total length of section: 5 +3 +4 +14 = 26 bytes.

3. Print binary numbers.


   1.) Pr-pa PBIN_B - print the number of A (8
discharge), 12 bytes.

   2.) Pr-pa PBIN_W - print the number of HL
(16 bits), 5 bytes. Two times is
PBIN_B.

   Total length of section: 5 +12 = 17 bytes.

4. Print numbers in radix set by the user.

   Served as a prototype for the procedure, published in an 
excellent reference book - the book of H. Rodionov and A. 
Larchenko "ZX-Spectrum for users and programmers. "


   1.) Pr-pa MKUSETB - filling the table
USE_TBL degrees with the base defined in
battery. The length of the pr-algebra 28 bytes.

   2.) Pr-pa PUSE_W - print number to HL.
Uses the previously created table MKUSETB
degrees USE_TBL. 33 bytes.

   3.) Table USE_TBL - Table of powers,
32 bytes.

   Total length of section: 32 +33 +28 = 93 bytes.

5. Printing Roman numerals.


   1.) Pr-pa PRIM_W - print the number of HL
(I.. MMMCMXCIX), 77 bytes. Uses a table RIM_TBL.

   2.) Pr-pa PRIM_B - print the number of A
(I.. CCLV). Length of 3 bytes. Calls the procedure PRIM_W.

   3.) Table RIM_TBL - table of the significance of the letters 
in the writing of Roman numerals. Length: 7 * 3 = 21 bytes.


   Total length of section: 21 +3 +77 = 101 bytes.

   Full size libraries: 324 bytes.


Listing 1. The printing bytes ten
            quadratic system.

PDEC_B; print decimal numbers in Accu
          mulyatore (000 .. 255)



        LD HL, DECTB_B; address table
                               Litsa degree
                               It scores

        LD B, # 03; max. WHO
                               possible to
                               lichestvo

                               figures
LP_PDB1 LD C, "0" -1; initialization
                              tion counter
LP_PDB2 INC C; increase

                               counter

        SUB (HL); subtract

                               current

                               the degree of de
                               tens

        JR NC, LP_PDB2; repeat

                               while A> = 0

        ADD A, (HL); A = A mod (HL)

                              ; C = STR $ (A

                               div (HL))

        PUSH AF; keep A

                               on the stack

        LD A, C, current

                               figure

        RST # 10; digital printing
                               algebra

        POP AF; recovery
                               tion Accu
                               mulyatora

        INC HL; transition to

                               seq. degree
                               tens of degree
                               ki

        DJNZ LP_PDB1; spun

                               Loop

                               figures

        RET; exit

                               Procedure
;
DECTB_B DB 100,10,1; Table

                               degrees

                               10-ki for

                               byte



--------------;
PHEX_HB; print high-order nibble in A

             (0 .. F)

        RRCA; change

        RRCA; places

        RRCA; Senior

        RRCA; and younger

                                nibbles
;----------------------------------------;
PHEX_LB; Print younger nibbles of A

             (0 .. F)



        PUSH AF; saved A

                               on the stack

        AND # 0F; discarded

                               extra

                               senior bi
                               you

        CP # 0A; if A <10,

        JR C, GO_PHL; then rewrite
                               belched

        ADD A, "A" - "9" -1; correction
                               mounting plate: village
                               le "9" is

                               "A"
GO_PHL ADD A, "0", translated into

                               ASCII-code

        RST # 10; print HEX
                               figures

                               ("0" .. "F")

        POP AF; reductive
                               Does A with

                               Stack

        RET; exit

                               Procedure
;----------------------------------------;
; Print in BIN system:;
;----------------------------------------;
PBIN_W; print binary number to HL

               (16-bit 0 / 1)


        LD A, H; print

                               Senior

                               Byte number

        CALL PBIN_B; challenge of
                               procedure BIN
                               buy print
                               that

        LD A, L; print

                               Jr.

                               Byte number
;----------------------------------------;
PBIN_B; print binary number in A

                (8 bits 0 / 1)


        LD B, # 08; in a byte - 8

                               bits
LP_PBB RLCA; alternately

                               'Put forward'

                               bits in the CF

        PUSH AF; keep A

                               on the stack

        LD A, # 18, depending on
                               depending on the

                               Flag C:

        RLA; A = "0" or

                                A = "1"

        RST # 10; print obviously
                               anterior bi
                               that

        POP AF; restore
                               vit A with

                               Stack

        DJNZ LP_PBB; bitwise

                               cycle

        RET; exit

                               Procedure
;----------------------------------------;
; Print in USER system:;;
;----------------------------------------;
PUSE_W; Print numbers in the set

              MKUSETB system MF-I in HL


        PUSH HL; cast

                               printable

                               number on

                               stack
HL_PUW LD HL, _NULL; address of the end

                               Table

                               degrees
LP_PUW1 DEC HL; load in

                              DE next

        LD D, (HL); degree

                                number

        DEC HL; from the table,

        LD E, (HL); moving

                               top-down

        EX (SP), HL; address table
                               Litsa <->

                               print-e

                               number

        XOR A; zeroing A

                               and reset

                               flag C
LP_PUW2 INC A; compute

                               regular

        SBC HL, DE; digit number
                               la and results
                               result

        JR NC, LP_PUW2; put in

                               A (A = 1 + (HL

                               div DE))

        ADD HL, DE; restored
                               Lebanon (+)

                               value

        ADD A, "0" -1; translate A

                               in ASCII-code

        CP "9" +1, if code

                               less than "9"

        JR C, GO_PUW1; the transition

                               Print

        ADD A, "A" - "9" -1; correction

                               (After the "9"

                               is "A")
GO_PUW1 RST # 10; print obviously
                               anterior digital
                               algebra of

        EX (SP), HL; HL = address

                               table

                               number ->

                               stack

        DEC DE; if the degree
                               stump

        LD A, D; numbers are not

                               equal to unity
                               boundary

        OR E; (most lane
                               first element

                               table)

        JR NZ, LP_PUW1; then continue
                               isplay work

        POP HL; remove from

                               no stack
                               right 0

        RET; exit

                               Procedure
;----------------------------------------;
MKUSETB; Create a table of powers with base
         vaniem in A


        LD HL, USE_TBL; address cos
                               given by

                               Table

        LD DE, # 0001; initialization
                               tion counters
                               ka degree
LP_MUT1 LD (HL), E; record those
                               kuschego

        INC HL; values

                               degree

        LD (HL), D; in the table

                               and the transition

        INC HL; for its next
                               yuschey cell

        PUSH HL; store

                               address on

                               stack

        LD B, A; founded th degree
                               penalties - "in

                               counter

                               cycle

        LD HL, # 0000 reset

                               result
LP_MUT2 ADD HL, DE; counting
                              it results

        JR C, GO_MUT; if HL>

                               65535, then

                               interrupt

                               Account

        DJNZ LP_MUT2; repeat

                               

                               times

        EX DE, HL; result -

                               in DE (New

                               degree)
GO_MUT POP HL; restored
                               Lebanon

                               Address Table
                               Litsa

        JR NC, LP_MUT1; if not

                              interrupted,

                              then repeat

        LD (HL_PUW +1), HL; address of the end

                               Table ->

                               in PUSE_W

        RET; exit

                               Procedure
;----------------------------------------;
USE_TBL DS 32; table degrees are
                      Booths of schis
                      leniya
;----------------------------------------;
; Print in RIM system:;
;----------------------------------------;
PRIM_B; Print numbers in Roman records in A

         (I.. CCLV)



        LD L, A; copy

        LD H, # 00; A in HL
;----------------------------------------;
PRIM_W; Print numbers in Roman entries

           HL (I.. MMMCMXCIX)



        PUSH HL; cast

                               printable

                               number on

                               stack

        LD HL, RIM_TBL; address table
                               Litsa characters

        DB # DD; work with

                               half

                               Register IX

        LD L, # 07; LD XL, the number of

                               characters in p.

                               radix
LP_PRW1 LD E, (HL); read the

                               from the table

                               value

        INC HL; next

                               sign Reams
                               Coy system

        LD D, (HL); reckoning

                               and put

                               in DE

        INC HL; then re
                               Giustra C

                               read the

        LD C, (HL); ASCII-code

                               mark

        INC HL; transition to

                               next

                               sign

        LD (HL_PRW +1), HL; preserved

                               address the following
                               blowing

                               mark

        EX (SP), HL; address -> to

                               stack, HL =

                               pechat.chislo

        XOR A; zeroing

                               counter and

                               Reset CF
LP_PRW2 INC A; in the loop

                               produce

        SBC HL, DE; division HL

                                on DE (you
                                read

        JR NC, LP_PRW2; unavailable

                                overflow
                                line)

        ADD HL, DE; restored
                               Lebanon (+)

                               value

        DEC A; because A 1

                               more HL

                               div DE,

        JR Z, GO_PRW1; then if A = 1

                               - Nothing

                               print

        LD B, A; number

                               print

                               Character
LP_PRW3 LD A, C; character code

        RST # 10; print

                               his

        DJNZ LP_PRW3; how to
                               before - so
                               to and Pec
                               Tai
GO_PRW1 DB # DD; work with

                               half

                               Register IX

        LD A, L; LD A, XL -

                               number of current
                               schego sign

        DEC A; if

                               Last

                               sign (I), then

        JR Z, GO_PRW4; dvuhbukven
                               Nogo soche
                               Tania no

        EX (SP), HL; HL = address

                               sled.znaka,

                               number-> stack

        RRA; if the number

                               current

                               mark parity
                               LIMITED,

        JR C, GO_PRW2; a combination
                               state with the following
                               blowing values
                               com

        INC HL; otherwise - ne
                               reprygnut

                               in one

        INC HL; sign. In

                               result

                               get the hell
                               res

        INC HL; sign for

                                get

                                double
GO_PRW2 LD A, C; znakosoche
                                Tania (IV,

                               CM, XL ...)

        LD C, (HL); taken from

                               Table

                               value

                               for

        INC HL; this sign

                               and received

        LD B, (HL); difference

                               between values
                               cheniem

        INC HL; ground

                               and these values
                               cheniem.

        EX DE, HL; For example,

                               for foundations
                              Nogo mark X

        AND A; additional
                               tive bu
                               children I, and their

        SBC HL, BC; difference

                               corresponding
                               respectively:

        EX DE, HL; 10-1 = 9, ie

                               IX

        LD C, A; code bases
                               Nogo sign

        LD A, (HL); additional code
                               Executive

                               mark

        EX (SP), HL; HL = print
                               my number

        SBC HL, DE; if it is <

                              additional
                              Nogo

        JR C, GO_PRW3; value

                               is not printing
                               Tai

        RST # 10; printing up
                               filler
                               Nogo sign

        LD A, C; main

                               sign

        RST # 10; print

        JR GO_PRW4; result -

                               dvuhbukv.

                               combination
GO_PRW3 ADD HL, DE; reductive
                               Whether (+) y

                               number
GO_PRW4 EX (SP), HL; number -> to

                               stack
HL_PRW LD HL, _NULL; address the following
                               blowing

                               sign in

                               Table

        DB # DD; work with

                               half

                               Register IX

        DEC L; DEC XL -

                               reduce

                               counter

                               signs

        JR NZ, LP_PRW1; twist cycle

                               while there is

                               More characters

        POP HL; not removed
                               must start

                               zero with

                               Stack

        RET; exit

                               Procedure
;----------------------------------------;
RIM_TBL; Table significance of the letters in napisa
         SRI Roman numerals


        DW 1000

        DB "M"; M = 1000; CM = 900

        DW 500

        DB "D"; D = 500; CD = 400

        DW 100

        DB "C"; C = 100; XC = 90

        DW 1950

        DB "L"; L = 50; XL = 40

        DW 1910

        DB "X"; X = 10; IX = 9

        DW 5

        DB "V"; V = 5; IV = 4

        DW 1

        DB "I"; I = 1;-nop 
;-------------------------------------- -; ; End of PDES LIB 
2.0;; ;----------------------------------------;





Other articles:

Aperativchik - On the control of obolochke DEJA VU and the content of 4 issues of the journal

Topic - Immortal SPECCY - "Future Project Speccy".

drop of solder - The emulator ZX-SPECTRUM v3.04 - User's Guide.

drop of solder - The emulator ZX-SPECTRUM v0.20b by LION.

drop of solder - ZX-SPECTRUM NAVIGATOR v1.00beta.

SOFTWARE - The presentation of the game "The Lord of Orion."

SOFTWARE - A Treatise on the Great polzitelnosti some architectural developments.

SOFTWARE - An overview of new games: FISHER pre-reliz, EMPIRE demo, LITTLE GHOST demo, STALKER, ELOPEMENT, WORDLIFE.

SOFTWARE - Overview of new products demoscene: HALLUCINATIONS in OPERA, INFARCT, YER ACHE 2, AMIGA, RAY EURODEMO, ZEST.

CODING - The remix of some procedures in 1993: SCREEN APARAT, umbral path, LOOK BASIC PROGRAMM-2.

CODING - Print numbers in different number systems: print decimal and hexadecimal, binary, and Roman numbers, seal numbers in the radix set by the user.

CODING - the procedure "plasma balls".

CODING - fade out the music at any time.

CODING - THE optimization.

CODING - The rotation of sprites.

ANOTHER WORLD - On a computer Be Box.

ANOTHER WORLD - The arguments and facts (AMIGA vs PC).

Hall of Fame - Official information about the festival FunTop-98.

Hall of Fame - Competition for the best minidemku (1024 bytes).

Seven and 1 / 2 - Lesson Lamer or a hundred and one procedure for cleaning the battery.

Seven and 1 / 2 - April Fools' Day (jokes and humor).

attempt at writing - last tour or VIRTUL-but AMIG-LIMITED syndrome.

attempt at writing - A poem about good and evil.

attempt at writing - The return of Claire.

attempt at writing - Poems: Sleep student Fable of Mattanah, medical board.

attempt at writing - Short Story "The War Continues" (continued, Chapter 6).

Advertising - Advertisements and announcements ...


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

Similar articles:
Iron - ADC in bipolar mode conversion. Audio interface "Sound Driver - 1".
Talents - dough on a computer from BLAZ'a.

В этот день...   3 May