Demo or Die #02
31 июля 1999 |
|
Demo-Building - The printing of chunks.
__________________________________________ (C) Devil of eTc / Scene '99 Chanks ... Currently, the domestic demomake'rstve more and more becoming popular for use graphics output on the screen of so-called chunks. The advantages of this technology are great, Among them: - 16 shades of gray (even if Chunks 8 * 8 we can use attributes, then the colors become even too much:) - Relatively fast output to Screen (2-3 int'a), with a rather small scale image of the screen (no more than 3,072 b.); However, there is a drawback, which is almost balances the benefits: - Significantly decreases the screen resolution (If chunks 4 * 4 it is obvious resolution screen will be 64 * 48 that, to put it mildly, not enough ...); Example chunks 4 * 4 you can see in demos such as Refresh, Forever, 5thElement, Goa and many others. First, consider how to derive finished animation on the screen (the effect you can be found in the intro Demo or Die # 01). For This should be very animated in such a format: 1-byte 2-byte OOOO OOOO OOOO OOOO. . . / \ / \ 1 Chunk 2 Chunk 3 Chunk 4 Chunk That is, you have to convert so- image to the first byte in the older half of the code is the first chunk (4 bit - 0 .. 15 shades of gray), and the younger half of the byte code of the next chunk, and so all of Kartika. Following her Memory must be placed second image pictures, then third, etc. Here is a sample program with a detailed description. ORG 25000 CADR EQU 12; SIZE LEN EQU 15; REAL_LEN = (LEN +1) * 4 HGT EQU 48 ;==================================; ; Kidatel chunks by Devil / eTc / sCeNE; ; MoveR cHanKS 4 * 4 pIXels; ;==================================; CHANKS EQU # F000; at this location will , Is launched ; Table. Images of chunks EI: HALT CALL INIT_CH;, expand the floor ; Nuyu Table. chunks CALL INITCH; initialize ; Kidatel chunks CALL INITTAB; create a table. hell ; Ests screen LD A, CADR; in A, the number of ; Animation frames LD LX, A TWERD EI HALT CALL MOVCH; call the procedure , Throwing the image of scr. LD A, # 7F; check press IN A, (# FE); space, and if RRCA; lie then the output RET NC JR TWERD MOVCH ; Procedure for deriving the image of the screen MOVCH1 LD A, LX DEC A AND A JR NZ, MOVCH0 LD A, CADR LD HL, TABLCH; in HL, the address of the image ; Screen MOVCH0 LD LX, A XOR A MOVCH2 LD HX, A LD B, TABLADR [; in B, high byte , Address table ; Address screen ADD A, A LD C, A LD A, (BC) LD D, A INC BC LD A, (BC) LD E, A; in DE, address screen PUSH DE; from which we ; Output chunks LD B, CHANKS [; in B, high byte , Address table , All combinations ; Chunks CALL PUTLIN; draw a line from ; (LEN +1) * 4 chunks POP DE LD A, HX; check, rather than INC A; the last line is CP HGT; we withdraw? JR NZ, MOVCH2 RET ;-----------------------------; ; CREATE DITHER TABLE To the address DTDAT are images of chunks ; Duplicated in older and younger ; Parts bytes. ; Example: ,% 1010 1010 ,% 0100 0100 ,% 1010 1010 ,% 0000 0000 ; Procedure INIT_CH deploys images ; Chunks at # F000, so that ; Get all # FF combinations of chunks. ; Byte address indicates the number ; Chunk and byte for byte number in ; Chunk (from # 0400 bytes) INIT_CH LD HL, CHANKS CRDT0 LD A, L: AND # F0 .2 RRCA LD DE, DTDAT ADD A, E: LD E, A ADC A, D: SUB E: LD D, A LD B, 4 CRDT1 LD A, (DE): INC DE AND # F0 LD (HL), A: INC H DJNZ CRDT1 LD A, L: AND # 0F .2 RLCA LD DE, DTDAT +4 ADD A, E: LD E, A ADC A, D: SUB E: LD D, A LD B, 4 CRDT2 DEC DE: LD A, (DE) AND # 0F DEC H: OR (HL) LD (HL), A DJNZ CRDT2 INC L: JR NZ, CRDT0 RET DTDAT; 16 COLORS DITHER DATA DB # 00, # 00, # 00, # 00 DB # 00, # 00, # 00, # 00 DB # 88, # 00, # 00, # 00 DB # 88, # 00, # 22, # 00 DB # AA, # 00, # 22, # 00 DB # AA, # 00, # AA, # 00 DB # AA, # 44, # AA, # 00 DB # AA, # 44, # AA, # 11 DB # AA, # 55, # AA, # 55 DB # AA, # DD, # AA, # 77 DB # AA, # 77, # AA, # FF DB # AA, # FF, # AA, # FF DB # AA, # FF, # BB, # FF DB # EE, # FF, # BB, # FF DB # EE, # FF, # FF, # FF DB # FF, # FF, # FF, # FF ; Descent to 4 lines on the screen down DOW_DE4 LD A, 4 ADD A, D LD D, A AND 7 RET NZ LD A, E ADD A, 32 LD E, A RET C LD A, D SUB 8 LD D, A RET ;--------------------------- INITTAB LD DE, # 4000; create table LD HL, TABLADR; Address Screen LD B, 48; fast rasINITT1 LD (HL), D; couple addresses INC HL LD (HL), E INC HL CALL DOW_DE4 DJNZ INITT1 RET ;---------------------------; Procedure is created kidatel line ; Chunks of kidatelya four chunks , (Those same four chunks are thrown in ; Screen procedure PUTLIN) INITCH LD B, LEN LD HL, PUTLIN LD DE, ENDPL INITC1 PUSH BC LD BC, ENDPL-PUTLIN LDIR; reproduce a piece of POP BC; PUTLIN to ENDPL DJNZ INITC1; LEN times LD A, # C9; a RET at the end LD (DE), A RET ;--------------------------- ORG ($ -1) / 256 * 256 +256 TABLCH; ship animation INCB "ANIM" ORG ($ -1) / 256 * 256 +256 TABLADR DS 48 * 2; buffer under Table. ; Address screen ;---------------------------; Everything here is quite simple: ; In HL - the image of the screen ; B - byte table ; Chunks (ie, B = # F0) ; DE - address on the screen PUTLIN LD C, (HL); take in C, the code chunk INC HL; in BC, we address ; Image chunk LD A, (BC); toss 1-byte LD (DE), A; chunk of the table ; Screen INC D; dropping down ; Screen INC B; go to the next ; Shem byte LD A, (BC): LD (DE), A: INC D, B ; As 2-byte LD A, (BC): LD (DE), A: INC D, B ; As 3-byte LD A, (BC): LD (DE), A: INC E ; After the 4-th byte We turn right on ; Screen, grab the code and the next chunk ; Begin to climb. LD C, (HL) INC HL LD A, (BC): LD (DE), A: DEC D, B LD A, (BC): LD (DE), A: DEC D, B LD A, (BC): LD (DE), A: DEC D, B LD A, (BC): LD (DE), A INC E ENDPL However, we considered the ideal, ie when We have a single byte codes of two, neighboring chunks. This can be achieved in rare cases (animation, plasma), most often we we have one code by one byte. In this If kidatel slightly modified and unfortunately, becomes significantly Brake: ( PUT_LIN ; HL = BUFFER - the same buffer in which you , Are forming an image before displaying on the ; Screen ; HL '= ADDR_SCREEN - address on the screen ; B = TAB [- table bytes are shifted by 4 bits ; Right ; D '= CHANKS [- byte chunks table LD C, (HL); take the code chunk LD A, (BC); Tab. shifts its , 4 bits to the right INC L LD C, (HL); take the following code ; Chunk OR C; get in one byte ; Codes of two neighboring ; Chunks , Then everything on vysheopisanomu algorithm INC L EXX LD E, A LD A, (DE) LD (HL), A INC H INC D LD A, (DE) LD (HL), A INC H INC D LD A, (DE) LD (HL), A INC H INC D LD A, (DE) LD (HL), A INC L EXX LD C, (HL) LD A, (BC) INC L LD C, (HL) OR C INC L EXX LD E, A LD A, (DE) LD (HL), A DEC H DEC D LD A, (DE) LD (HL), A DEC H DEC D LD A, (DE) LD (HL), A DEC H DEC D LD A, (DE) LD (HL), A INC L EXX That's all. If anything is unclear, the questions send to the address 2:4536 / 100.128 @ FidoNet to Sergey Movchan. __________________________________________
Other articles:
Similar articles:
В этот день... 21 November