Adventurer #04
31 июля 1996

Exchange of experience - "Up ..." : Interrupt; disc feeders.

<b>Exchange of experience</b> -
                    C

               accuracy

                  to ...



         (C), Konstantin Breeders


           (C) Music D. J. MUSIC


                    Accuracy - courtesy

                    Kings


     Hello everyone who reads this article. AND
This time I will carry some sort of "blizzard"
but a little more seriously, a theme. That -
interrupts. Or rather, how to measure
while the program using interrupts. I personally know three 
ways of measuring the time of the program (the expression 
"time" means the number of processor cycles). "Pulling

rubber "will not, and will start immediately" to share 
experiences. "Thus, the crime with. 

     The most accurate and easiest (?) Method is - this method 
(note: the accuracy measurement results will depend on you and 
your well-being). Excellent performance, this method allows for 
small (sub) programs. The essence of this method is as follows: 
download or MONS (1-4), or MON2, or STS, whom they like (or 
have someone that is), its place (well, if so) prog

Rummy to get noticed on any address
memory value set for this
address that includes a disassembler program and
... This is where the fun begins
(Little tip: if you do not remember
how many cycles is one or another team, then take the book with 
these data, but if this book does not have the memory Your let 
you down, this method is not you). So, about the most 
interesting (?). Once was included disassembler, you starts to 
add up bars all the teams taking into account cycles. The 
resulting amount - this is is the time it takes your

program.

     Like, the first method to parse (who
it is not clear, contact the editors). Come on. The second 
method is too simple, but in addition, and not very accurate 
(range + / - 5000 cycles, if not more). In principle, this 
method is designed for you to determine your prog moved 
thousands of ticks that way for 70 or not. And if you use this 
method in conjunction with the method 



house described in the ZX-FORMAT N3 in the article on
Assembler in the head, I do not remember what can be
achieve good results.

    The essence is this: before the start of the procedure
of playfulness which you want to know,
installing the curb in some
color, for example, green or white (or someone that someone 
like). After performing your program, set a border of black

color. But do not forget that this is your
program in place Color change
border should be hung on the termination or, in extreme cases, 
this mess should begin with the command HALT! 


     It looks like this:


         EI
BEGIN HALT

         LD A, 4

         OUT (# FE), A

         CALL PROG

         XOR A

         OUT (# FE), A

         IN A, (# FE)

         CPL

         AND # 1F

         JR Z, BEGIN

         ........
Band of green on the curb and will
shows how much time is spent on
your program. If all the green border,
then your program is moved over 70,000
cycles. If only polbordyura green
then cleaned up in the programm 30000-40000
bars, etc. etc.

     Ok, now seriously. The article, in fact, and was intended 
primarily only because of this method, because with him on

power can be measured execution time
program up to four cycles
CPU! Someone, perhaps, the question arises: "Why, up to four, 
but not before one cycle? I think, first is to answer this 
question in order to avoid any misunderstanding something. 

    Everything basically comes from the interrupt, as method 
designed for their use. When the computer generated signal INT, 
the processor begins to think, that it was time to distract 
from the performance of the main program, and should do 
something other, no less useful. This most

signal INT (interrupt masked) can
enroll at any time, even during
performance processor, any team. But as a "person" honest,
processor first started to perform
end, and then too distracted. And since
every team has a certain number of cycles (at least four), then 
why and not get accurate measurements up to one



Nogo tact. Itself begs another question: "Then why four
rather than seven, ten or twenty strokes? "
In fact, the accuracy of up to four cycles is guaranteed only 
to programs that ubirayutya in the period between interrupts.

Others will simply be broken, but the number of cycles will be 
slightly larger than the number of cycles between interrupts 
(only a few cycles). And why four tact you can learn a little 
farther. 


         DI

         LD A, # FE

         LD I, A

         IM 2

         LD HL, INT

         LD (# FEFF), HL

         EI

         HALT

         ....
END

         DEFS 18000

INT; number of cycles

         PUSH HL; 11

         LD HL, NEXT; 10

         DEC (HL); 11

         POP HL; 10

         EI; 4

         RET NZ; 5

         LD DE, END

         POP HL

         AND A

         SBC HL, DE

         LD (DATA), HL


         IM 1

         RET
DATA

         DEFW 0
NEXT

         DEFB 2

Once this procedure is fulfilled,
DATA appears in the cell number of teams NOP, which had run
after your program. Multiplying this number
four, get the number free of ticks remaining on your program. 
Now, subtracting from the number of cycles between two 
interrupts just calculate the number of plus 51 more stroke, 
get the number of clock cycles occupied by your program. But if 
the cell is the number of DATA large, it means that your 
invention does not want to make their case for 70,000 cycles.



     Note: All steps
after the program listing, you must do
manually on a calculator, because, perhaps,
can get the number is more than possible in native code, ie 
greater than 65535! 



              Ask -


                reply



     And now, little answers to questions arising from the 
people on this or that free programming.

Question: "Why when disables the interrupts of the first kind, 
or jump on the second interruption, the cell LAST_KEY 
information does not change?" Answer: "It's very simple! For 
the first interruption of the procedure hanged poll keypad 
tours, why then does not change the information in LAST_KEY 
when disconnecting the first interruption. So, if you like to 
use this system variable, then let alone the first 
interruption. But if you want to hang something on their

interruption of the second kind, and that the cell you
so cute, that there is no desire
give it up, then at the end of its
procedures for handling interrupts not place
command RET, and JP # 0038. And yet, if you
using the first interrupt, then no
would not touch the register IY! It
must always contain the number 23610,
if you look, and LAST_KEY everything will be OK.
But still, I would advise not to be subverted, and enjoy a 
superior method. Then you would not care about what which is in 
IY and any included termination. It looks like this: 


        CALL # 028E

        CALL # 031E

After performing two of these routines,
in register A is returned core code
keystroke, ie, code is uppercase letters of the alphabet or 
code numbers. But If the battery is the code # 18

then pressed only key SYMBOL SHIFT.
If there is code # 27, then pressed CAPS SHIFT
or if A code # 0E, then pressed and
CAPS SHIFT, and SYMBOL SHIFT. It is worth paying attention to 
the case B. If the It is # 18, then pressed some button with 
SYMBOL SHIFT. And if there (in case B) is the number # 28, then

was pressed with CAPS SHIFT. Well
From this we can draw the appropriate conclusions. "
Question: "In one of the last issues of the journal were 
published ADVENTURER point includes some procedures ROM. Here, 
for example, sub-CLEAR is not working

from the regime of 128K. The following procedure will do the 
same, but works fine in all modes: 


        LD BC, # 1303

        PUSH BC

        LD BC, STACK

        CALL # 1EB7

I would like to receive an explanation for this
about, ie why certain procedures
ROM refuse to work in a 128K. "
Answer: "These bugs are due to the fact that the flash ROM, 
48th in BASIC SPECTRUM 128 was Podpravlena because this

part of the extensive use of BASIC ROM 128.
That's why when you call any procedure from the ROM 48 in BASIC 
mode 128K, begin to execute additional

procedure, which was not originally in
48-m BASIC'e. But in order to avoid such glitches, you need to 
reset only the value in cell 23625. Now about the above 
procedure. The fact that the recorded a stack of BC - is the 
address of the main loop BASIC command processing, and 
introducing on the stack is not necessarily because at this 
address anyway it will be then made the transition integral

terpretatorom BASIC. But the challenge
procedures at # 1EB7 virtually no different from what was 
written in the second issue of our magazine. The difference is 
this: if Register BC is the number "zero" and call the 
procedure at # 1EAF, then number of system variable RAMTOP be 
stored in the BC and cleaned variables BASIC'a. And if a zero 
in the BC program to make a call from the address # 1EB7, then 
it will be made the transition to error "RAMTOP no good"

in BASIC! Now, I hope everyone understands
why in our magazine was given a point
The procedure entry CLEAR at # 1EAF. "
Question: Please tell us about memory
SPECTRUM 128 "
Answer: "I thought this issue long ago
figured in the pages of many publications,
but it seems that very wrong. Too
be briefly touch on this issue. The most important thing is 
that the additional computer memory is switched to port

# 7FFD (32,765). In the 128th included eight


page RAM (from 0 to 7) at 16K each.
Any of the pages of RAM can be installed with
Address # C000 (49152), but it is worth remembering,
that the second and fifth pages are fixed
addresses # 8000 (32768) and # 4000 (16384)
respectively. That is why they can not be used as extra memory. 
So There are also two pages of ROM containing BASIC BASIC 48 
and 128. Any of these pages can only be installed with

address # 0000. In SPECTRUM 128 is still
one screen. It is located on the seventh page since its 
inception. 


     And now, the layout bit port # 7FFD
(32765):

    0-th, 1 st, 2 nd bits of RAM, with their help

     switches to the additional memory;

    The third bit is responsible for what the screen

     at this moment is activated (if

     bit is cleared, then running bases
     Noah screen, or including a second equivalent
     wounds from the seventh page);

    4-th bit - is the choice of ROM (bit enabled

     selected BASIC 48, differently BASIC 128);

    5-th bit - when he turned mean

     you are in SPECTRUM 48, and Paul
     We used more memory, no

     can;

    6 th and 7 th bits are not used. "

     At this point I have finished parsing issues
although these have accumulated a lot because chtoto I have no 
strength to continue this scribbling, I'm not a literary 
figure. And those who have not received an answer, Do not 
worry, I'll answer your questions either orally or in the next 
issues of our magazine. 



                Disc


               Loaders



             (C) Nicolas Viper

From the Editor: This article was prepared as
Read more about disk loaders for the magazine "El Dorado". But 
since this publication ceased its activities,

Condor Soft kindly provided the materials for ADVENTURER'a.


     And I, Nicolas Viper, again with you.
Excuse me, what use the magazine for
personal goals, but if I ever hear that
call me - Nicholas Vampire - offended
and go to "Dendy". Well, if you want to know
a "Viper", among other things translated as "Adder" - Adder 
(zool.). More times wildly sorry, but we digress.


     I hope you have not forgotten my tedious

monologue in the second issue of the journal
"El Dorado"?

     You do remember - I promised to tell you how to make music 
while download (and not just music), like

how it is done in the "INSULT",
"BATTLE COMMAND", etc. Of course, my presentation suffers from 
some awkwardness, But if not me then who? Not

brilliant if our Nicodim?

     I must say that the last time I
in fact, just told the book
Rodionov and Larchenko "ZX-Spectrum 'TRDOS for users and 
programmers." On my own, I added just a description of some 
procedures ROM DOS. I did this with one purpose - to prepare 
you, dear readers, to this article. 

     In general, a program dedicated to
TO, similar to the one we saw last time (taken from the 
"ZX-Review" N4 for 1995). But here is the problem number

time: It is necessary to interrupt were
all the time allowed, and the procedure of Adre
su # 2F1B, accessed by our
"Loader" prevents them (and rightly so). Therefore, we replace 
in the program: 


            ...


         LD IX, # 2F1B

         CALL DOS


            ...

 at:

            ...


         CALL LOA_COM


            ...


     Ie instead of ROM DOS calls its
procedure, which adds at the end:

LOA_COM

         LD A, E; transform nom.

         INC A; sector and POSs
         LD C, # 5F; barking at the port of

         LD IX, # 2A53; # 5F (reg.sekto
         CALL DOS; pa)
TRY_1;

         PUSH HL; save on

         PUSH DE; error

                         ;

         LD A, # 80, # 80, Thurs Sector

         LD C, # 1F; write in reg.ko
         LD IX, # 2A53; cunts

         CALL DOS;

         LD C, # 7F; # 7F-reg. Data

         LD IX, # 3FE5; reading

         CALL DOS; of
{Check for correct reading (CFR)}

         POP DE \

         POP HL} (*)

         RET /


     It is easy to see that this procedure
- Reworking procedures ROM DOS at
# 2F1B. Piece is marked as (*), rather
just go down the procedure for the CFR.

     This raises the most naiofigenneyshaya
(Wrapped in!) Problem - control of accurate reading. " Rely in 
this case on DOS I think not, because there simply

does not provide, such as an option when
procedure at # 3FE5 (see above), MB
interrupted at the beginning, middle or end
their work.

     In short, I want to say what to do
That will have to manually, ie, or write to the sector 254-255 
bytes, and 1.2 removes the checksums (abbreviated "COP"), or 
ship them ("COP") in the initial at boot time when you are 
still using # 3D13, and then the procedure to calculate CFR

"COP" (sounds hilarious, is not it?)
and compare with the read or table.

     How to calculate the "COP"? This is easy.
The usual method - proksorit all the bytes in each
other - the resulting number is the "COP".


     In general, I absolutely precise recipes
Will not give you. If you want, then the next
issue I will give full listing of the working procedures, 
packed and tested by me. 

     In the end, an example of interrupt handler:


         ORG # FEFE

         JP IM2_COM

           ...


         CALL MUS_INIT; bc

         DI; this setting

         LD A, # FD; second interrupt

         LD I, A; (suddenly you do not

         LD HL, # FD00; know how it is

         LD DE, # FD01; do).

         LD BC, 256

         LD (HL), # FE

         LDIR

         IM 2

         EI

           ...

     Here is your (our) loader.


           ...


     At the end add:


           ...

IM2_COM

         LD (STACK), SP

         PUSH AF


           ...


         PUSH ...


         CALL MUS_PLY; music plays

                          ; 
         LD HL, (STACK); see where

         INC HL; we return
         LD A, (HL); schaemsya?

         CP # 40;

         JR NC, RETRAM; in RAM

         LD A, # C3; in ROM
LABEL1 LD (CHANGE), A;

         POP ... ; Code # C3 - JP


           ...


         POP AF
CHANGE NOP; then put JP

         DEFW # 3D2F; or RET

RETRAM LD A, # C9; code RET

         JR LABEL1

STACK DEFW 0



From the Editors: The following is the text boot from the 
magazine "El Dorado" N2, which refers to the author of this 
article. Inputs: HL - address of the boot 

             DE - track and sector,

             B - number of sectors.



     I hope you understand what's what and you
does not require the following article to
write your cool boot.

     I would also like to say a few
words:

     Those of you who have filled and tested
loader probably noticed that he was terribly slow, even when 
prohibited by interrupts. 

     It says only one thing - to seek and
Go for it! Never be afraid to experiment! Within reasonable 
limits, of course! 


                 *





Other articles:

Overview - Overview of new products games: Reckles Rofus, Peeking, Pang, Roy of the Royers.

Overview - Overview of new products: UFOs - 2: The Devils are deep, patrol time. Top Ten games of the month.

Interface - "fiasco of the century" - an article.

Interface - News from the Flex Software, Infosft, Simple Company, Surdakar Group, Auryn Group, Nicodim etc.

Interface - Overview of programs and magazines: ZX Format, Spectrofon, On Line, Speccy, Eldorado, ZX-Magazine, Faultles, Dune, Adventurer.

Interface - Description of the game "Smagli-2.

Novella - "baptism of fire" on the game "Rebel Star".

Exchange of experience - "Up ..." : Interrupt; disc feeders.

Presentation - Presentation Games: Where Time Stood Stile, Craps, Poker, Libra.

Promotion - Description of the game "Starglider 2.

Promotion - Game Description Scorpions Die Machine.

Advertising - Advertising and announcements.

System - Description of system software: XAS, MASM 1.1, Copy v3.3 turbo, Power Assembler v3.0, Turbo Assembler, Rock Disk Service v3.1, LZ-Compressor v1.0, PCX Show v1.0, Memory test v1.3, Digital Music Macker.

System - Spectrum-compatible computers: Pentagon, ATM-Turbo, Scorpion.


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

Similar articles:
Answers to the letter № 44-49.
Entry - Announcement of articles the next issue.

В этот день...   21 November