|
Optron #33
20 ноября 1999 |
|
Likbez - Assembler view from afar: On block teams, work c ports.

Assembler - a view from afar
Continued.
Beginning at | | 20, 21, 24, 25, 28-30, 32
{} Infarh, 1999
Let's talk about block commands
Consider the following example. Required
transfer the data block length in bytes # 1B00,
located at # C000, at the address
# 4000.
Program that performs an action,
might look something like this:
LD HL, # C000
LD DE, # 4000
LD BC, # 1B00
LOOP LD A, (HL)
LD (DE), A
INC HL
INC DE
DEC BC
LD A, B
OR C
JR NZ, LOOP
RET
This snippet to solve our problem
well suited, if the transfer
should occur relatively quickly. But
if the speed for you - not the most important, it
and can be shortened. But at the same time - learn a new
command assembler LDI. Onaya performs steps:
LD (DE), (HL); such a team to
; Do not really have a Z80
INC HL
INC DE
DEC BC
Moreover, if the contents of BC is zero,
the flag P / V is set to 0.
Now let's rewrite the example of
light of new information:
LD HL, # C000
LD DE, # 4000
LD BC, # 1B00
LOOP LDI
JP PE, LOOP
RET
Thus, the program has already received
shorter.
But the developers did not stop at Z80
progress and provided the team LDIR,
designed to transfer the whole block.
As in the previous example, the beginning of the block
placed in the register pair HL, length -
in BC, and the address where proizoydt transfer is in DE.
Sketch of its action:
LOOP LDI
JP PE, LOOP
Now, our example can now be written as follows:
LD HL, # C000
LD DE, # 4000
LD BC, # 1B00
LDIR
RET
Area of the display memory in our example
was not chosen by chance. Load a
display file (# 1B00 B) at # C000
and follow the example. The result is intuitive. By the way, so
you can not only to create screens and clean and
memory area. Try:
LD HL, # 4000
LD DE, # 4001
LD BC, # 1800
LD (HL), L
LDIR
LD BC, # 2FF
LD (HL), 7
LDIR
RET
So, what is it? Beginning of course, is
Configuring HL at the beginning of the on-screen memory. But
in the DE value is placed on the unit
more, and at # 4000 is placed "0"
(Blank screen). Teper starts working team LDIR. Although it is
designed to work with blocks, but the transfer is still one
byte. Thus, every time the team will carry at the following
address soderimoe previous (0), and so on until such time as BC
does not acquire a zero value.
Here is the screen and cleaned. But it is concerned
only the graphics area, were also
attributes. The second half of the procedures used for them.
There is no longer must specify a value for the HL and DE, it
left from the first LDIR'a. It is only necessary
specify the length of the # 300-1 (a
why is it so - think for yourself) and its
beginning to put the attribute byte. We used 7, and hence, the
screen will be black "paper" and white "ink".
And now ... Now comes the
p-p-Rashnu!
LDI team and LDIR - not only to work with blocks. There are
still LDD and LDDR.
But do not worry! Razobrtsya with them
quite simple. The fact that they produce have almost completely
similar LDI teams and LDIR, but the values of DE and HL
not increase and decrease. About
as follows:
; Team LDD
LD (DE), (HL)
DEC HL
DEC DE
DEC BC
; Team LDDR
LOOP LDD
JP PE, LOOP
Ask, why is it necessary?
A very simple!
Indeed, if the transfer of blocks
they do not overlap each other, no difference there. But
imagine that "Block the receiver covers the beginning of his
the end of the block of the source. " Then transfer
by LDIR damage information. Exit
of the situation and serves as the team LDDR.
Just need to set the DE and HL-block addresses
not the initial and final. Length of course, remains unchanged.
Well, with one koshamrom we understood, now move on to
another. So ...
Working with ports
So - it appears to work with the ports also have their tricky
group operations!
First, consider the team of mutants
IN. Let's start with something simpler, eg, INI:
; Example command INI
IN (HL), (C); (he thought)
INC HL
DEC B
Clear enough, sort of. Occurs
Reading from a port to the specified address in the register C,
the resulting byte is sent to the memory at the address
specified in the register pair HL, and register B suffers from
a decrement, resulting in the Z flag, or reset, or install.
Now look at the more perverted
Revised:
; Example command INIR
LOOP INI
JR NZ, LOOP
There is a clear analogy with the LDI and LDIR.
And to Sia analogy was more complete,
talk about teams IND and INDR:
; Example command IND
IN (HL), (C)
DEC HL
DEC B
; Example command INDR
LOOP IND
JR NZ, LOOP
That's all the complexity. As far as I think the problems in
development of these teams have You should not occur.
But these were mutants command IN, and is
also on OUT. Without going into an empty argument, just bring
them:
OUTI, OUTD, OTIR, OTDR
And considering the fact that their action seems to disgust
at all the things you've learned try to do without excessive
detail. Of the schemes of the commands you are likely all will
become clear:
; Example command OUTI
OUT (C), (HL)
INC HL
DEC B
; Example command OTIR
LOOP OUTI
JR NZ, LOOP
; Example command OUTD
OUT (C), (HL)
DEC HL
DEC B
; Example command OTDR
LOOP OUTD
JR NZ, LOOP
Well, what did I say? All hideously clear. But if you still
have any questions, ask. As much as they try to
answer.
So, with the group operation we understand. It remains only
for our long-standing tradition, to tell ...
The effect of group operations on flags
As always, the table we help you.
Mnemonic Flags
operation
C Z P / V S N H
LDI. . x. 0 0
LDD. . x. 0 0
LDIR. . 0. 0 0
LDDR. . 0. 0 0
INI. x? ? 1?
IND. x? ? 1?
INIR. 1? ? 1?
INDR. 1? ? 1?
OUTI? x? ? 1?
OUTD? x? ? January 1
OTIR? 1? ? 1?
OTDR? 1? ? 1?
And now it's really all ... today. Generally speaking, we
with you for a long time to "Learn, learn, and learn."
But it later, but for now - bye!
To be continued ...
Other articles:
Similar articles:
В этот день... 15 November