Inferno #02
01 мая 2001 |
|
For Coderz - how to programmatically determine the number of strokes in the line of cars equipped with Port # FF.
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
Other articles:
Similar articles:
В этот день... 21 November