TEST LINE
(C) Gris
Hello Dear Readers.
Now I'll tell you, those who do not
knows how to programmatically determine how many cycles in a
row at the car, equipped with Port # FF.
A bit of history. I liked the creepy toy Ivan cool
"TetrisSokoban" may have seen it (there is another curb the
inscription "TESO"). Since I Scorpion, the inscription was my
worst "kozyavilas" that I really lacked. So I decided to alter
the conclusion on the curb. Eventually I got and I wanted to do
a remix of this game with custom curb effect, but there
found that even Scorrion'ov length
lines are different. With the words ZS'a have options of
lengths of lines Screen: 216, 224, 232 cycles. I thought about
it and decided to make the auto-tuning for cars,
which is the port # FF.
Talk about the construction of the screen I do not
I will - see the ZX-REVIEW, electronic
facilities. The essence of this method is simple, although
Our coders did not understand my implementation
thereof. The essence of port # FF is
that after he read the attributes that are being read are drawn
on the beam screen. To determine the length of the string in
cycles necessary to calculate the cycle
prorisovaniya line. You can do this
using a variety of attributes. ZS offered to introduce an
attribute of the top screen (E = 22528 # 5800) and read # FF
port to until you see the attribute
twice, they say, sure we would get to it. I think that you can
not rely on the case, because the beam may skip this attribute.
Therefore, should some portion of the screen (row 4, I think
enough) to fill the attributes individalnymi for each column of
familiarity, since ray from the beginning of the screen can get
on 1 st and 2 nd, and on the other familiarity within the first
few. But the rest of familiarity, we need to also specifically
designated as our task at this stage is to determine the screen
space with which we begin measure the progress of the beam.
Short algorithm:
1. Fill area attributes
increasing value from # 00 to # 1F
for each row.
2. Form a semiconductor read from the port -
block of commands INI, pieces 100 (and you can lower yourself
surely there) with RET at the end.
3. Making EI: HALT and skipping the top of the curb.
4. Transfers control to the semiconductor from p.2
5. Analyze the resulting data point 4 (block # FF with a
small number of individual attributes):
- The end of each block "FF'ov" means the transition to a
new line of the image;
- First byte is different from # FF and address in which he
met, it is necessary "Remember";
- Looking for the next one and the same byte
determine how many bytes to him from the first, calculating
way, how many just run INI, while the beam
drew a line;
- Multiply that number by the duration of the team INI - by
16 and divide by number of blocks # FF - the number of lines.
But the implementation of the algorithm (izvintilyayus, the
program does not optimized):
; (C) Gris 24.12.2000g.
; Test tacts in screen line.
; Enter: no data,
; Exit: A = number of tacts in line.
ORG # 6000
DELAY EQU # 0210
ReadFF EQU # 8000
CALL FilAtr
CALL MakeINI
EI
HALT
DI
WAIT LD BC, DELAY; # 0210
WTLP DEC BC
LD A, B
OR C
JR NZ, WTLP
LD HL, ReadFF
LD C, # FF
CALL ReadFF
CALL ANALIZ
EI
RET
FilAtr PUSH BC
PUSH HL
LD HL, # 5800
LD B, 8
MFilLP PUSH BC
LD B, # 20
LD C, 0
FilLP LD (HL), C
INC HL
INC C
DJNZ FilLP
POP BC
DJNZ MFilLP
POP HL
POP BC
RET
MakeINI LD HL, ReadFF
LD A, # ED; INI
LD C, # A2;
LD B, # 0
MKLP LD (HL), A
INC HL
LD (HL), C
INC HL
DJNZ MKLP
LD (HL), # C9
RET
ANALIZ LD HL, ReadFF
LD BC, 0
LD A, # FF
L1 CP (HL)
JR NZ, AN1
INC HL
JR L1
AN1 LD A, (HL); LOAD ZM
LD D, A; STORE ZM TO D
INC HL
INC B
L2 LD A, (HL)
CP D
JR Z, AN2
CP # FF
JR Z, AN3
E_AN3 INC B; COUNT ALL BYTES
INC HL
JR L2
AN3 INC C; COUNT LINES
LD A, # FF
L3 CP (HL)
JR NZ, L2
INC B; COUNT ALL BYTES
INC HL
JR L3
AN2 LD H, 0
LD L, B
DUP 4;
ADD HL, HL; MUL 1916 (INI time).
EDUP;
EX DE, HL
LD H, 0
LD L, C
CALL DIVB2
LD A, E
RET
; Here we have used part of the mat.
; Library B. Mednonogova.
; MATHEMATICAL LIBRARY MATH-ZX
; (C) Corer Feet
FREE16 DEFS 16
DIVB LD D, 0; E / L - E (MOD in D)
DIVB2 PUSH HL; DE / L - E
PUSH BC
LD B, 8
EX DE, HL
LD D, E
LD E, 0
DIV1B OR A
RR D
RR E
SBC HL, DE
JR NC, MDIVB
ADD HL, DE
MDIVB RLA
DJNZ DIV1B
CPL
LD D, L
LD E, A
POP BC
POP HL
RET