Árok Party 21.

Hírek, érdekességek, melyekben felbukkan a kis fekete doboz is...
Avatar
Zozosoft
Hozzászólások: 784
Csatlakozott: 2012.01.06. 14:03
Kapcsolat:

Re: Árok Party 21.

Hozzászólás Szerző: Zozosoft » 2019.08.14. 12:40

Engem is érdekel!

Avatar
Zimi
Hozzászólások: 164
Csatlakozott: 2013.08.13. 13:34
Tartózkodási hely: Budapest
Kapcsolat:

Re: Árok Party 21.

Hozzászólás Szerző: Zimi » 2019.08.15. 15:37

Köszi a részletes magyarázatot, grat a demóhoz. Ijesztően más, mint ahogy az ember csak úgy nekiállna kódolni. :)
10-féle ember van, aki érti a bináris aritmetikát és aki nem.

TomCat
Hozzászólások: 4
Csatlakozott: 2019.08.05. 19:05

Re: Árok Party 21.

Hozzászólás Szerző: TomCat » 2019.08.19. 09:14

Jöjjön a második rész... a számolósdi rutint tweakelem többféleképpen, hogy kihozzak belőle pár érdekes variációt. Azért kell, hogy ez precalc legyen (mert ugye 3,5MHz nem sok) és hogy a zene meg ne akadjon amikor partot vált az intró.

Kód: Egész kijelölése

; A minták 1024 bájt hosszúak lesznek, mert az kettő hatványa és nagyobb egyenlő,
; mint a screen attr terület mérete :) a  középpontól vett távolság adja majd ki a szinek értékét
; illetve inkább a távolság négyzete (gyökvonó utasítás híjján)

; Azért, hogy több variáció legyen, ezért a középpontot eltolom ide-oda,
; majd két eltolt mintát még valamilyen logikai művelettel összegzem (OR vagy XOR)
; Lássuk hogy készülnek a minták:

L_A00D: LD (HL), B               ; A00D 70 $07Ts
        LD DE, $0002             ; A00E 11 02 00 $0ATs

; (HL)-re írom majd mintát, de egyelőre kinullázom, mert átmenetileg egy gyűjtő lesz
; D eltolás vizszintesen vagyis a centerX (kezdetben nulla),
; E pedig cikluszámláló (2x fut, 2 mintát fogunk összegezni)

L_A011: PUSH HL                  ; A011 E5 $0BTs
        LD A, L                  ; A012 7D $04Ts

; elmentem HL-t, ide jön majd a számolás eredménye, vagyis a minta egy "pixele"
; az A regiszterbe is elteszem L-t vagyis, hogy hol tartok a mintában illetve az adott sorban,
; mert a sorhossza 2 hatványa (32)

        ADD HL, HL               ; A013 29 $0BTs
        ADD HL, HL               ; A014 29 $0BTs
        ADD HL, HL               ; A015 29 $0BTs

; Ha eltolom 3 bittel az offsetet, akkor H regiszterben lesz az Y kordináta

        LD BC, $0200             ; A016 01 00 02 $0ATs

; C gyüjtő regiszter lesz, ebben összegezzük az X és Y távolságok négyzetét
; B pedig ciklusszámláló (2x fut, 2 kordináta miatt)

L_A019: AND $1F                  ; A019 E6 1F $07Ts

; A-ből leválasztom az alsó 5 bietet, ezzel megkapom az X kordinátát

        SUB D                    ; A01B 92 $04Ts
        JR NC, L_A020            ; A01C 30 02 $07/$0CTs
        CPL                      ; A01E 2F $04Ts
        INC A                    ; A01F 3C $04Ts

; vesszük a centerX és az aktuális X kordináta távolságát (abszolút értékben)

L_A020: ADD A, A                 ; A020 87 $04Ts
        ADD A, A                 ; A021 87 $04Ts

; Távolságot megszorzom néggyel, ezzel skálázom, hogy jól látszanak a színátmenetek
; (ne legyenek mondjuk túl sűrűn a színek)

        EXX                      ; A022 D9 $04Ts

; elmentem a regisztereket, hogy a szorzáshoz legyen több szabad regiszterem

        LD H, A                  ; A023 67 $04Ts
        LD L, $00                ; A024 2E 00 $07Ts
        LD D, L                  ; A026 55 $04Ts
        LD E, A                  ; A027 5F $04Ts

; H és E a szám, amit megszorzunk önmagával, L és D az nulla

        LD B, $08                ; A028 06 08 $07Ts

; a B cikluszámláló, végig megy a 8 biten

L_A02A: ADD HL, HL               ; A02A 29 $0BTs
        JR NC, L_A02E            ; A02B 30 01 $07/$0CTs
        ADD HL, DE               ; A02D 19 $0BTs
L_A02E: DJNZ L_A02A              ; A02E 10 FA $08/$0DTs

; a szorzást úgy végezzük, ahogy írásban is végeznénk.
; ha van bit, akkor hozzáadjuk a számot az eredményhez, az adott helyiértéken

        LD A, H                  ; A030 7C $04Ts
        EXX                      ; A031 D9 $04Ts

; az eredményt beteszük A-ba és a többi regisztert visszállítjuk a korábbi értékére.

        ADD A, C                 ; A032 81 $04Ts
        LD C, A                  ; A033 4F $04Ts

; a kiszámolt négyzetszámot hozzáadjuk a gyűjtőhöz (második futás után dX2+dY2 lesz majd C).

        LD A, H                  ; A034 7C $04Ts
        ADD A, $04               ; A035 C6 04 $07Ts
        DJNZ L_A019              ; A037 10 E0 $08/$0DTs

; most Y koordináta + 4 kerül az X távolság helyére
; és ezzel a másik irányban is négyzetre emeljük a centertől vett távolságot

        POP HL                   ; A039 E1 $0ATs

; visszakérjük, hogy hová is kell írnunk majd a minta aktuális elemét

        LD A, D                  ; A03A 7A $04Ts
        XOR $00                  ; A03B EE 00 $07Ts
        LD D, A                  ; A03D 57 $04Ts

; első 4 minta esetén nincs eltolás különbség a 2 összegzett frame-nél 

        LD A, (HL)               ; A03E 7E $07Ts
L_A03F: OR C                     ; A03F B1 $04Ts
        LD (HL), A               ; A040 77 $07Ts

; valamilyen logikai műveletettel összegezzük a gyűjtőbe a két frame eredményét
; kezdetben OR (logikai vagy)

; ha nincs eltolás, akkor az OR művelet 2 azonos érték között, olyan mintha
; nem is lenne 2 frame hanem csak egy. 

        DEC E                    ; A041 1D $04Ts
        JR NZ, L_A011            ; A042 20 CD $07/$0CTs

; kétszer fut a generálás, mert két frame-t probálunk összegezni

        LD A, (HL)               ; A044 7E $07Ts
        ADD A, A                 ; A045 87 $04Ts
        ADD A, A                 ; A046 87 $04Ts
        ADD A, A                 ; A047 87 $04Ts
        LD C, A                  ; A048 4F $04Ts
        LD A, (HL)               ; A049 7E $07Ts
        AND $07                  ; A04A E6 07 $07Ts
        ADD A, C                 ; A04C 81 $04Ts
        LD (HL), A               ; A04D 77 $07Ts

; a kapott pixel értéket úgy tároljuk le, hogy átkonvertáljuk paletta index-é

; ULA plus palettában 32 szín van, de szerencsétlenül úgy, hogy a border színt a 3-5 bitek adják
; ezért feltoljuk a 7-8 bitbe az érték 2 felső bitjét, az alsó 3 bitet pedig újra hozzá adjuk. 

        INC HL                   ; A04E 23 $06Ts

; léphetünk a minta következő "pixelére"

        LD A, H                  ; A04F 7C $04Ts
        AND $03                  ; A050 E6 03 $07Ts
        OR L                     ; A052 B5 $04Ts
        JR NZ, L_A00D            ; A053 20 B8 $07/$0CTs

; ha az offset felső bájtjának alsó 2 bitje nulla, és az alsó bájt is nulla,
; akkor pont 1024 elemet generáltunk a mintába

; következő mintához itt-ott önmódosítjuk a kódot

        LD BC, L_A03F            ; A055 01 3F A0 $0ATs
        LD A, H                  ; A058 7C $04Ts
        CP $98                   ; A059 FE 98 $07Ts
        LD A, $A9                ; A05B 3E A9 $07Ts
        JR C, L_A060             ; A05D 38 01 $0C/$07Ts
        LD (BC), A               ; A05F 02 $07Ts

; az utolsó két mintában majd OR helyett XOR lesz a logikai művelet a 2 frame között
; (utolsó 2 minta címe: $9800 és $9C00. A "XOR C" utasítás kódja: $A9)

L_A060: LD C, $10                ; A060 0E 10 $07Ts
        LD A, (BC)               ; A062 0A $07Ts
        ADD A, C                 ; A063 81 $04Ts

; Az véletlen, hogy pont a 32 ($10) offseten kell módosítani és pont 32-vel szeretnénk növelni
; az eltolást (ceneterX) - ezért kell átfésülni a kódot nem csak forrás szíinten, hanem
; debuggerben is, ezzel nyerhettünk 1 bájtot (ADD $10 helyett, jó az ADD A, C is)

        AND $30                  ; A064 E6 30 $07Ts

; kimaszkolunk 2 bitet, ezzel csak 4 érték között fogunk lépegetni körbe-körbe
; ($00..$10..$20..$30..és újra $00..)

        LD (BC), A               ; A066 02 $07Ts
        JR NZ, L_A00D            ; A067 20 A4 $07/$0CTs

; a 4. minta után nem ugrunk vissza rögtön, hanem akkor még kell egy kis módosítás:

        LD C, $3C                ; A069 0E 3C $07Ts
        LD A, (BC)               ; A06B 0A $07Ts
        XOR $20                  ; A06C EE 20 $07Ts
        LD (BC), A               ; A06E 02 $07Ts

; az a lényeg, hogy ki/bekapcsoljuk az eltolást a 2 frame között,
; vagyis hogy a 2. frame-be számolt értéknek lesz értelme vagy se 

        JR NZ, L_A00D            ; A06F 20 9C $07/$0CTs

; a 8. minta után, már nem ugrunk vissza, kész a precalc, indulhat a show!


Avatar
Bali
Alapító tag
Hozzászólások: 2302
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

Re: Árok Party 21.

Hozzászólás Szerző: Bali » 2019.08.19. 23:13

Akkor most a 111. bájtnál tartunk, ha jól számolom. :)
-= Bali =-
(c) 1983-2017 Evil-Soft

TomCat
Hozzászólások: 4
Csatlakozott: 2019.08.05. 19:05

Re: Árok Party 21.

Hozzászólás Szerző: TomCat » 2019.08.20. 08:35

No és itt a vége...

Lehet nem ártott volna még egy szótár ilyenekről, hogy frame=egy kirajzolt kép, part=egy része az intrónak, precalc=előre kiszámolt részeredmény, amit főprogram futáskor gyorsan tud használni... stb.
de legjobb volna ha kérdeznétek, ha valami nem világos :-)

Kód: Egész kijelölése

L_A071: LD A, H                  ; A071 7C $04Ts
        AND $9F                  ; A072 E6 9F $07Ts
        LD H, A                  ; A074 67 $04Ts

; A következő letárolt mintára címzek HL regiszterrel (L az mindig nulla)
; ezzel az utolsó után, újra az elsőre áll majd a mutató.

        LD D, $58                ; A075 16 58 $07Ts
        LD BC, $0300             ; A077 01 00 03 $0ATs
        LDIR                     ; A07A ED B0 $10/$15Ts

; Átmásolok 768 bájtot a screen attr területre (E is nulla).

        INC H                    ; A07C 24 $04Ts

; lépek még 256 bájtot a memóriában (mert egy-egy minta 1024 bájt hosszú 768 helyett)

L_A07D: EXX                      ; A07D D9 $04Ts

; elmentem az árnyék regiszterekbe, hogy melyik mintánál is tartok (minden part előtt)

        LD D, $40                ; A07E 16 40 $07Ts

; 64+1 OUT utasítás kell majd később az ULA plusz paletta feltöltéséhez.

        EX AF, AF'               ; A080 08 $04Ts
        PUSH HL                  ; A081 E5 $0BTs

; A és HL regiszterek értékét elmentem (minden frame előtt).

        HALT                     ; A082 76 $08Ts

; Időzítésként várunk az 50Hz-es interruptra

        LD A, ($5C78)            ; A083 3A 78 5C $0DTs

; A IM1 interrupt ezen címen léptet egy frame számlálót (ez a legalsó bájtja).
; Ezen érték felhasználásával előkészítjük a hangregisztereket a kód elején.

        LD HL, L_A000            ; A086 21 00 A0 $0ATs
        LD C, A                  ; A089 4F $04Ts
        OR $3F                   ; A08A F6 3F $07Ts
        LD (HL), A               ; A08C 77 $07Ts

; A frame számláló 2 felső bitje lesz az első csatorna hangmagassága
; 63-at még hozzáadunk és az kerül a freki osztó alacsonyabbik bájtjára (a felső fix nulla)

        LD A, C                  ; A08D 79 $04Ts
        LD L, $B9                ; A08E 2E B9 $07Ts
        LD (HL), A               ; A090 77 $07Ts

; Ezt az értéket, haszáljuk a border színének beállításához is.

        CPL                      ; A091 2F $04Ts
        AND $0F                  ; A092 E6 0F $07Ts
        LD C, A                  ; A094 4F $04Ts

; A növekvő frame számlálóból csökkenőt csinálok és az alsó négy bit lesz a hangerő.

        RLD                      ; A095 ED 6F $12Ts
        LD (HL), A               ; A097 77 $07Ts

; A border színt módosítom, a felső 4 bit kerül így alulra
; így a kék komponens mindkét bitje és a piros komponens 2 alsó bitje lesz így beállítva.

        AND $03                  ; A098 E6 03 $07Ts
        LD B, A                  ; A09A 47 $04Ts

; A frameszámláló 4.-5. bit pedig skálázza még a hangerőt (ami a C regiszterben van).

        JR Z, L_A0A1             ; A09B 28 04 $0C/$07Ts
L_A09D: SRL C                    ; A09D CB 39 $08Ts
        DJNZ L_A09D              ; A09F 10 FC $08/$0DTs

; így kapjuk meg a visszhang hatást.

L_A0A1: LD A, (HL)               ; A0A1 7E $07Ts
        CPL                      ; A0A2 2F $04Ts
        AND $0C                  ; A0A3 E6 0C $07Ts
        LD (HL), A               ; A0A5 77 $07Ts

; Még mindig variálunk a borderen, csak a piros komponens tartjuk meg végül
; és megfordítom a biteket, hogy jobban passzoljon a hangmagassághoz a szín.
; (talán lehetett volna gazdaságosabban is beállítani a bordert, de ez már
; az utolsó mozzanat volt a kódban és végülis belefért így is a 256 bájtba). 

        LD L, $08                ; A0A6 2E 08 $07Ts
        LD (HL), C               ; A0A8 71 $07Ts

; Hangerő végre belekerül a megfelelő hangregiszterbe.

L_A0A9: LD BC, $FFFD             ; A0A9 01 FD FF $0ATs
        OUT (C), L               ; A0AC ED 69 $0CTs
        LD B, $BF                ; A0AE 06 BF $07Ts
        OUTD                     ; A0B0 ED AB $10Ts
        JR NC, L_A0A9            ; A0B2 30 F5 $07/$0CTs

; Az AY hang chip regisztereit sorban mind feltöltjük a 8-as regiszterrel kezdve
; egészen a nullás regiszterig.

; itt a JR NC utasítás megérne még egy misét :-)
; mert minden Z80 dokumentációnak ellentmondóan használjuk, hiszen azok szerint
; itt egyik utasítás sem válthatna ki CARRY-t.

; de valójában az OUTD mégis beállítja a CARRY flaget, ráadásul több okból is megtehetné
; Amikor a címszámláló (konkrétan L regiszter 255-ből nullába megy át)
; $A000-ból $9FFFF címre lép, akkor jön CARRY.
; DE vigyázat! ha a portra kiküldött érték olyan volna, akkor az is generálhatna CARRY-t

        POP HL                   ; A0B4 E1 $0ATs
        EX AF, AF'               ; A0B5 08 $04Ts

; Visszatöltjük az elmentett A és HL regisztereket, kellenek a paletta feltöltéshez.

L_A0B6: BIT 3, D                 ; A0B6 CB 5A $08Ts
        LD E, $05                ; A0B8 1E 05 $07Ts
        JR NZ, L_A0E7            ; A0BA 20 2B $07/$0CTs

; az E regiszterbe kerül a sokat paszírozott border szín
; és a színregiszterek felébe ezt az értéket fogjuk beállítani egységesen
; (amikor a D ciklusszámláló 3. bitje épp nulla)

        ADD A, $08               ; A0BC C6 08 $07Ts
        LD C, A                  ; A0BE 4F $04Ts

; Az A regiszterben van a zöld komponens számlálója, amit 8-asával léptetgetek
; Aztán elmentem C regiszterbe, mert az A regisztert elhasználom a számolgatáskor

        ADD A, A                 ; A0BF 87 $04Ts
        JR NC, L_A0C3            ; A0C0 30 01 $07/$0CTs
        CPL                      ; A0C2 2F $04Ts

; Mielőtt kivenném a számláló releváns 3 bitjét, a lineárisan növekvő számlálóból
; oda/vissza számlálót csinálok (háromszög jel).


L_A0C3: AND $E0                  ; A0C3 E6 E0 $07Ts
        LD E, A                  ; A0C5 5F $04Ts

; Az E regiszterbe kezdjük összerakni a paletta egy színét, aminek 3 felső bitje a zöld

        INC L                    ; A0C6 2C $04Ts
        INC L                    ; A0C7 2C $04Ts
        LD A, L                  ; A0C8 7D $04Ts

; Az L registreben van a piros komponens számlálója, amit 2-esével léptetgetek

        BIT 5, L                 ; A0C9 CB 6D $08Ts
        JR Z, L_A0CE             ; A0CB 28 01 $0C/$07Ts
        CPL                      ; A0CD 2F $04Ts

; Mielőtt kivenném a számláló releváns 3 bitjét, a lineárisan növekvő számlálóból
; oda/vissza számlálót csinálok (háromszög jel).

L_A0CE: AND $1C                  ; A0CE E6 1C $07Ts
        ADD A, E                 ; A0D0 83 $04Ts
        LD E, A                  ; A0D1 5F $04Ts

; Az összerakott szín középső 3 bitje lesz a piros.

        LD A, H                  ; A0D2 7C $04Ts
        ADD A, $08               ; A0D3 C6 08 $07Ts
        LD H, A                  ; A0D5 67 $04Ts

; A H regiszterben van a kék komponens számlálója, amit 8-asával léptetgetek

        ADD A, A                 ; A0D6 87 $04Ts
        JR NC, L_A0DA            ; A0D7 30 01 $07/$0CTs
        CPL                      ; A0D9 2F $04Ts

; Mielőtt kivenném a számláló releváns 2 bitjét, a lineárisan növekvő számlálóból
; oda/vissza számlálót csinálok (háromszög jel).

L_A0DA: RLCA                     ; A0DA 07 $04Ts
        RLCA                     ; A0DB 07 $04Ts
        AND $03                  ; A0DC E6 03 $07Ts
        ADD A, E                 ; A0DE 83 $04Ts
        LD E, A                  ; A0DF 5F $04Ts

; Végül a legalsó 2 bitet a kék komponens adja

        LD A, C                  ; A0E0 79 $04Ts

; Az elmentett zöld számláló visszatöltése az A regiszterbe.

        BIT 6, D                 ; A0E1 CB 72 $08Ts
        JR Z, L_A0E7             ; A0E3 28 02 $0C/$07Ts
        LD E, $01                ; A0E5 1E 01 $07Ts

; Talán ez se a leggazdaságosabb megoldás, de maratoni agyalás után se jutott
; eszembe rövidebb megoldás.
; Simán megnézem, hogy először futik-e a ciklus, és akkor 1-et fogok kiküldeni
; az ULA plusz portjára, ami a 64 színes paletta mód bekapcsolásának parancsa.

L_A0E7: LD BC, $BF3B             ; A0E7 01 3B BF $0ATs
        OUT (C), D               ; A0EA ED 51 $0CTs
        LD B, $FF                ; A0EC 06 FF $07Ts
        OUT (C), E               ; A0EE ED 59 $0CTs

; Az E regiszter értékét kiküldöm a ULA plusz portjára, ami vagy parncs, vagy egy szín. 

        DEC D                    ; A0F0 15 $04Ts
        JP P, L_A0B6             ; A0F1 F2 B6 A0 $0A/$0ATs

; Ez a ciklus 64+1-szer fut (D értéke: 64...0)

        EXX                      ; A0F4 D9 $04Ts
        DJNZ L_A07D              ; A0F5 10 86 $08/$0DTs

; Amíg árnyék B körbe nem pörög, addig tart egy part, szóval 256 frame

        EXX                      ; A0F7 D9 $04Ts
        LD DE, $2170             ; A0F8 11 70 21 $0ATs
        ADD HL, DE               ; A0FB 19 $0BTs
        EXX                      ; A0FC D9 $04Ts
        JP L_A071                ; A0FD C3 71 A0 $0ATs

; A partok között annyi változás van még (azonkívül, hogy másik mintát fog a
; képernyőre másolni), hogy a 3 színszámláló, egymáshoz viszonyított fázisát
; (különbségét) megváltoztatom. Így a 3 színkomponens másfelé fog járni,
; ergo más színeket fogunk kapni.

; Egész pontosan, az zöld színszámlálót nem bántom, hagyom futni tovább.
; (mivel egy part alatt pont körbeér, gyakorlatilag ez ugyanazokat az értékeket
; járja be mindig).

; Viszont a piros és a kék számlálóhoz hozzáadok egy értéket, amik pedig olyanok,
; hogy a 8 part alatt fognak körbeérni ugyanoda.

; Illetve majdnem, mert amikor az L regiszter körbepörögne, akkor lesz egy átvitel
; és H regiszter kap egy extra növelést. Aminek az lesz az eredménye, hogy szép
; lassan elcsúsznak egymástól a színkomponensek. Vagyis minél tovább nézi valaki
; az intrót, annál inkább más színeket fog látni, mint kezdetben :-)


csaba
Alapító tag
Hozzászólások: 254
Csatlakozott: 2012.01.09. 19:18
Rádióamatőr hívójel: HG5BMU
Tartózkodási hely: Surány
Kapcsolat:

Re: Árok Party 21.

Hozzászólás Szerző: csaba » 2019.08.21. 10:03

Nagyon szép bőven kommentelt lista!
Viszont bevezetőnek jó lenne valami egyszerű elvi folyamatábra szerű dolog a működésről.
Így azért elég "sűrű". :)

Avatar
Bali
Alapító tag
Hozzászólások: 2302
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

Re: Árok Party 21.

Hozzászólás Szerző: Bali » 2019.08.21. 11:18

Nyilván emészteni is kell, lehet csak 256 bájt, de kb. "bájtonként" kell venni. :)

Addig is egy kérdés, mi volt az apropója, hogy nekiálltál? Hisz mostanában inkább a PC-s vonalon alkotsz.
-= Bali =-
(c) 1983-2017 Evil-Soft

TomCat
Hozzászólások: 4
Csatlakozott: 2019.08.05. 19:05

Re: Árok Party 21.

Hozzászólás Szerző: TomCat » 2019.08.22. 21:17

Jogos, ha újságcikk lett volna, akkor lenne bevezetője. De majd most a motiváción keresztül bevezetem az alapokba az olvasót :-)

Szóval 1991-es PC-re váltás előtt a kisujjunkban volt a ZX Specrum illetve a Z80 Assembly, amit aztán teljesen elfelejtettem. 2016-ban tértem vissza a demoscene-re és az eltelt időben láttam, mennyire aktívak ZX Spectrum versenyek is, főleg az orosz partykon (most is lesz egy ilyen a hétvégén). Aztán például a kedvenc kategóriámban legsikersebb 256 byte intró szerzője is mostanában inkább csak a Spectrumra kódolgat. Idén februárban a Demobit party már sóvárogva néztem a szlovák kollégák Speccy klónjain futó debugger képernyőket. Köszöhetően annak is, hogy G.o.D. megbütykölte az a karácsonyi intrót. Azt hiszem még egy utolsó lökést adott az is, hogy a húsvéti német party oldskool introversenyét egy olyan Spectrum 4kb-os intró nyerte meg, amit kétes, hogy valaha is lelökhetnek a trónjáról. Aztán augusztus első hétvégéjére két tervem volt, vagy irány Helszinki és viszek egy 1kb-os windows intrót, vagy ha nem megyek, akkor viszont Árok, oda pedig nem lehet PC-s produkciót vinni, itt az ideje, hogy újra készüljön valami Spectrumra.

Tudtam, hogy valami olyat akarok, ami kicsit új. Tetszett a sok szín a KKU-ban és G.o.D. odaadta az ULA pluszos cikket. Gondoltam, ha szép színes, akkor szóljon is jól, AY zene kell bele. A júliusi demoshow-n már a kedvenc ZX 256 byte intróm AY kódját fejtettük vissza Dáviddal. Előbb a vizuállal foglalkoztam, azt képzeltem, hogy generálok valami szép 64 bites palettát, ahogy iq-tól tanultuk, csak persze cosinus nélkül :-) Aztán X,Y koordinátára számolok valami nagyon egyszerűt, mint egy pixel shaderben. Ja, persze-persze... 3,5MHz-en hogy? Bárhogy turbóztam a kódot még 2 frames sebességgel is necces volt. Főleg, hogy eleinte nem karakterenként akartam állítani a színeket, hanem félkarakterenként. Sokadikra el is készült a 64x24-es felbontású ULA plusz megjelenítő rutinom, ami nagyon szép volt, de a megfelelő futási sebességhez kellett pár előkalkulált táblázat, azok előállítása pedig mind elvett a mérethatárnak kitűzött 256 bájtból. Végül kipróbáltam a 32x24 karakteres felbontással is a rutinjaimat és nem volt annyira gáz, úgyhogy lemondtam inkább a dupla felbontásról a több tartalom javára. Aztán rájöttem, hogy a "pixelshaderem" nem számol semmi mást csak a színindexet változtatom az idő függvényében. Akkor meg a pixel kalkulációk helyett legenerálhatjuk előre az egész képet, aztán csak a palettában tologatjuk odébb a színeket, épp úgy, ahogy anno a PC-n a VGA monitorok megjelenésekor mindeki megörült a 256 színű palettának.

Tehát a program úgy működik, hogy előszőr feltölti 255 értékkel (csupa 1-es bit) a képernyőt és a színeket is, azért lesz bright fehér a precalc alatt az egész képernyő. Aztán kiszámol 8 képet ugyanazzal a rutinnal kicsit variálva, kép alatt ez esetben az attribútum bájtokat kell érteni. 32x24 attr érték, ami ULA plusz esetén a színindex a palettában (bár elég kifacsart módon). A kép nem más mint koncentrikus körök, tehát egy középpontól vett távolság adja a színindexet. Ezt a középpontot lehet ide-oda eltolni. Aztán meg még két különböző képet összekombinálni, OR vagy XOR logikai művelettel. Ha kész vannak a képek, akkor az elsővel feltöltőm a screen attr területet, aztán 256 képrajzolásig nem bántom, csak a paletta színeit állítgatom (vándorolnak a színek a palettában). A 64 színes palettából 32 színt rotálok csak igazából, a másik 32-t minden képnél azonos értékre állítom be, mert ezek közül kerül ki a border színe és nem szeretném, hogy a borderen is fusson valami szín. Épp ellenkezőleg a zene illetve hanghoz szinkronizálva szeretném a bordert állítgatni.

Szóltam ern0-nek, hogy jó volna valami AY-s zene, de mivel végül nem lett, így a partira autózás közben találtam ki, hogy a frameszámlálót hogyan fogom felhasználni az AY regiszterek feltöltésére. 256 framem van egy parton belül. Eldöntőttem, hogy legyen a számláló felső 2 bitje, ami 4 hang közül fog választani, az alsó 4 bit legyen a hangerő, a maradék 2 bit pedig a visszhang, így az első hang hangereje induljon 15-ről, majd 7-ről, majd 3-ról, majd 1-ről és jöhet a következő hang. A 4 hang magasságához pedig hozzáigazítottam a border színét is a piros sötétebb árnyalataival. Ez hamar elkészült a partin és megmutattam a szervezőknek, hogy itt egy 256 bájtos intró, amit beadnék. Poison mondta hogy ok, de mindenképpen kell neki egy bináris fájl is, nem csak a forrás. Puff, nem csináltam még ilyet se, úgyhogy G.o.D. nyarlását megzavarva távirányításos segítséget kértem. Szerencsére Dávid időben előkerült és megbütyköltem első TAP fájlomat is. Az intró végül 3 ponttal maradt le a dobogóról úgy, hogy vetítéskor nem szólt a hangja, és sokan nem is szavaztunk rá, mert az intrónkat utolsónak vetítették és után szinte rögtön véget is ért a szavazás... de nem bánkódunk, mert végre újra kódoltam Speccyre!

csaba
Alapító tag
Hozzászólások: 254
Csatlakozott: 2012.01.09. 19:18
Rádióamatőr hívójel: HG5BMU
Tartózkodási hely: Surány
Kapcsolat:

Re: Árok Party 21.

Hozzászólás Szerző: csaba » 2019.08.23. 11:14

Így teljes a történet, köszi!
és szuper a sok link is.

Avatar
Bali
Alapító tag
Hozzászólások: 2302
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

Re: Árok Party 21.

Hozzászólás Szerző: Bali » 2019.08.24. 17:58

Szerintem lesz ebből cikk is. 😂
Köszi a sok utalás is, harmadszorra is találtam még érdekességet.
-= Bali =-
(c) 1983-2017 Evil-Soft

Válasz küldése

Ki van itt

Jelenlévő fórumozók: TomCat valamint 4 vendég