Adventurer #09
30 апреля 1999 |
|
Exchange of experience - The procedure for generating sine.
(C) SerzhSoft UC SINUS ZABABAHAT Better in the hands of the chickadee, than under the bed, duck! It is time to talk about sore, and more specifically - about the sinuses. The point that in many megademnyh effects used exactly sinus tablets. This can be unpretentious plasma any body moving in a smooth trajectory, the flight over the mountains, tonnelchik and a lot more of the other, which only one can wish ... Traditionally, and convenient, of course, create a sine plate with a size multiple of 256 bytes, or even better - just # 0100! : -) This plate must begin with the address aligned to a segment that is least significant byte of the address is equal to the toe (#? 00). Create a simple sin-table can be using ordinary BASIC. For example, we need a plaque, located in address 24576 (# 6000), length 256 bytes amplitude (scope) sine -127 to 127 and the size of one period. We get: 10 FOR i = 0 TO 255 20 POKE 24576 + i, SIN (PI/128 * i) * 127 1930 NEXT i Now generated a plate can be stored on disk and embedded in their assembler effects on INSERT, INCBIN and etc. But you decided to tweak amplitude, say from -63 to 63, or you suddenly knocked in the head, that "the median point "should not be 0 and, say, 128. That is, a scatter plate from 128-63 to 128 63. Of course, you can again, "download" BASIC and gain a little another program: 10 FOR i = 0 TO 255 20 POKE 24576 + i, SIN (PI/128 * i) * 63 128 1930 NEXT i Then again, keep everything on the disk, and continue to kodit asm'e. But perhaps even last lameru became clear that there is something wrong. Inefficient, a waste of time, and even space on the disk all sorts of "left" files occupy. Plus, to ensure same Ping compile with podgruzku on INCBIN'u. And keep a sinus period in memory when you can do and four ... No, this must have something to do! And the output is, of course, there is. Not really something We weakly nakodit generation procedure sinus in assembler. Yes, a piece of cake! Clap, and is ready routine using ROM 'Shnogh calculator. A similar thing present in Deja Vu # 03 article "Floating attributes. Here is slightly improved procedure: STACK_A EQU # 2D28 FP_TO_A EQU # 2DD5 ; SINCALC PUSH DE PUSH BC PUSH DE LD A, C CALL STACK_A POP DE LD A, E CALL STACK_A RST # 28; calc DB # A3; stk_pi / 2 DB # 34, # 40, # B0, # 00, # 40, # 40 DB # 05; divide DB # 04; multiply DB # 1F; sin DB # 04; multiply DB # 38; endcalc CALL FP_TO_A JR Z, $ +4; -> NEG; | POP BC; < ADD A, B POP DE LD (DE), A INC E JR NZ, SINCALC RET At the entrance to the register C, we must specify the "scope" sine (amplitude:-P ... + C), the register B - central (How to add), and the register pair DE must contain the address of the buffer under plate. Moreover, this address must must be divisible by 256 (aligned to the segment). And then, after about 15 seconds, we get those treasured 256 bytes! "So up-to-olgo!" - Fair notice and you're right. But what you have like only 39 bytes of memory occupied by the procedure. But, of course, this example was given only for completeness paintings, and this procedure we will examine now. After all, why would you in the demo, write "Please, wait 15 sec ... Decrunching ... "just for a plaque in 256 bytes! And rightly so! So, here high-speed analog above procedure, which works much faster, though he still has 55 bytes + 64 bytes data. Total: 119 bytes. But the speed! SINMAKE INC C LD HL, SIN_DAT PUSH BC LD B, E LP_SMK1 PUSH HL LD H, (HL) LD L, B LD A, # 08 LP_SMK2 ADD HL, HL JR NC, $ +3 ADD HL, BC DEC A JR NZ, LP_SMK2 LD A, H LD (DE), A POP HL INC HL INC E BIT 6, E JR Z, LP_SMK1 LD H, D LD L, E DEC L LD A, (HL) LD (DE), A INC E LP_SMK3 LD A, (HL) LD (DE), A INC E DEC L JR NZ, LP_SMK3 LP_SMK4 LD A, (HL) NEG LD (DE), A INC L INC E JR NZ, LP_SMK4 POP BC LP_SMK5 LD A, (DE) ADD A, B LD (DE), A INC E JR NZ, LP_SMK5 RET ; SIN_DAT DB # 00, # 06, # 0D, # 13, # 19, # 1F, # 25, # 2C DB # 32, # 38, # 3E, # 44, # 4A, # 50, # 56, # 5C DB # 62, # 67, # 6D, # 73, # 78, # 7E, # 83, # 88 DB # 8E, # 93, # 98, # 9D, # A2, # A7, # AB, # B0 DB # B4, # B9, # BD, # C1, # C5, # C9, # CD, # D0 DB # D4, # D7, # DB, # DE, # E1, # E4, # E7, # E9 DB # EC, # EE, # F0, # F2, # F4, # F6, # F7, # F9 DB # FA, # FB, # FC, # FD, # FE, # FE, # FF, # FF Now when you install any Your FX'a enough to cause SINMAKE required parameters, and after a second plate is ready! Can generates a number of different plates ... Or one, but consisting of different periods of sinus with different amplitudes ... And then, say, to put on the table scroller and torn on all cylinders ... In the Appendix you will find the assembler source with the two procedures. AND remember: Better Playing sinus than megademe glitches! P.S. But you can do without plate data SIN_DAT! Who would guess - how? : -)
Other articles:
Similar articles:
В этот день... 23 November