OldComp.cz http://oldcomp.cz/ |
|
Jak udělat krátké demo snadno a rychle krok za krokem http://oldcomp.cz/viewtopic.php?f=99&t=7447 |
Stránka 1 z 2 |
Autor: | sandokan [ 22.05.2019, 19:47 ] | ||
Předmět příspěvku: | Jak udělat krátké demo snadno a rychle krok za krokem | ||
cíl: vytořit v asembleru program, který 1. zobrazí obrázek-fotku 2. bude přehrávat hudbu (SID) 3. nad obrázkem se bude pohybovat nějaký sprite 4. spustit to na reálném železe to vše chci udělat přes víkend a bude to k 45tým narozeninám přítelkyně -předem jsem byl varován, že tohle ženská asi neocení takže to tu nechám jako kuchařku pro další blázny (a pro mne až to budu opět dělat za několik let znovu), co by si chtěli udělat svoje předem upozorňuji, že nejsem grafik ani skladatel a programátor taky ne -takže budu keslit minimálně -hudbu použiji již hotovou -v programování se nebudu pouštět do žádných velkých -tj žádné rotující vektory, zoomování.. pro komfort použiji PC, kde vše zmastím a otestuji co bude potřeba: libovolný textový editor (např notepad, já používám pspad) kompilátor (použil jsem http://tass64.sourceforge.net/) emulátor C64 (vice) editor obrázků ve formátu C64 (PIXCEN) editor spritů (kdysi jsem nějaký použil, ale nemám ho ) stáhnout si nějaký SID -volba je jasná -hapy birthday to you.. program na editaci disket http://www.d64editor.com pokračování o víkendu.. jinak jsem našel tento program Extreme Demo Maker 100%, který by udělal asi co potřebuji bez použití asembleru https://csdb.dk/release/?id=65444 PS: před pár lety jsem už něco vytvořil, šlo mi hlavně zkusit techniku jak se dostat za kraj, viz příloha Příloha:
|
Autor: | sandokan [ 22.05.2019, 20:40 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
1. krok je otestovat, že kompilátor funguje (hlavně jde o syntaxi) a že to jde nahrát a spustit. jako test bude sloužit změna barvy rámečku na černou: *=$C000 ;počáteční adresa volné RAM -desítkově 49152 znovu lda #$00 ;do akumulátoru ulož nulu=černá barva sta $d020 ;ulož na adresu D020 (53280) =registr grafického čipu pro barvu rámečku jmp znovu ******* spuštění kompilace z příkazového řádku windows: 64tass.exe -C -a -B -i c:\c64\mojedemo\test.asm -o c:\c64\mojedemo.prg výsledný soubor má pak 10 bytů: 00 C0 A9 00 8D 20 D0 4C 00 C0 první 2 byty je startovací adresa C000, akorát v obráceném pořadí pokud se tento soubor nahraje do C64, tak se nic nestane. spustit se dá přes SYS 49152 ve VIC emulátoru je zabudovaný monitor paměti (CTRL+H) akorát nic neukáže a musí se zadat "d C000" tj disasemble + adresa, pak to vypadá takto: (C:$c002) d c000 .C:c000 A9 00 LDA #$00 .C:c002 8D 20 D0 STA $D020 .C:c005 4C 00 C0 JMP $C000 .C:c008 00 BRK .C:c009 00 BRK |
Autor: | sandokan [ 22.05.2019, 20:58 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
jak na SID formát? tady je popis SID formátu http://www.hvsc.c64.org/download/C64Music/DOCUMENTS/SID_file_format.txt detailněji zde http://www.unusedino.de/ec64/technical/formats/sidplay.html -zatím jsem našel tento příklad přehrávací rutiny: kde na $1000 je init a na $1003 rutina play voláno pravidelně od pozice $40 obrazového paprsku -rasterline + efekt změny barvy rámečku (ten vyhodím) sei lda #$00 tax tay jsr $1000 again lda #$40 cmp $d012 bne *-3 inc $d020 jsr $1003 dec $d020 jmp again EDIT: už jsem zkusil a nahrál čistá data SIDu bez hlavičky a hraje to v prvním příspěvku chybí jeden nástroj - přehrávač SIDu - k výběru správného songu použil jsem SIDplay64 https://csdb.dk/release/?id=161475 -dobré je že vám řekne, kde jsou uložena data |
Autor: | Busy [ 23.05.2019, 08:22 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
sandokan píše: kompilátor (použil jsem http://tass64.sourceforge.net/) Ano, ten pouzivam aj ja. Kedysi som skusal aj CBM Studio, ale to bolo na niektore veci uplne nemozne (definicie oblasti v pameti, generovanie listingu a binarky) takze som ho rychlo opustil.sandokan píše: pokud se tento soubor nahraje do C64, tak se nic nestane. Da sa to urobit aj tak aby sa subor spustil automaticky. Staci ak prikaz SYS bude priamo sucastou skompilovaneho programu a cele sa to ulozi na adresu #0801 kde normalne zacina basic:spustit se dá přes SYS 49152 Kód: *=$801
.word basend .word $0000 .byte $9E ;; Kod prikazu SYS .text '2061' ;; spustacia adresa .byte $00 basend .word $0000 start lda #$00 ;; 0 = cierna sta $D020 ;; Nastavenie farby borderu rts |
Autor: | sandokan [ 23.05.2019, 09:45 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
Busy -dík za reakci, ten SYS tam samozřejmě dám taky, použil jsem to jako rychlý test a díky za připomentutí, protože bych to musel hledat. -jsem teď v zahraničí na služebce a nemám u sebe ani zdroják toho dema co jsem před 7mi lety vytvořil (tam ten SYS mám) + ukradl hudbu s rutinou a font. jakákoliv připomínka/nápad je vítán, cíl je velice jednoduchý (nedal jsem tam ani scroll text), hlavně pro člověka, který si občas něco napíše - hodinová záležitost. jde o boj sehnat a nastudovat syntaxi a ovládání různých programů a to mi zabere víc času, než napsat samotný program. pamatuji si že, než jsem vytvořil to první demo, tak jsem 2 dny seděl a dělal reverz inženýring dema co se mi líbilo a to jsem to první den chtěl vzdát, protože to byly různé bitové operace s registry a nechápal jsem proč - než jsem pochopil -respektive jsem si přečetl scroll text v demu, že nejvíc práce dala 4 kanálová rutina pro 3 kanálový SID a v tom jsem se hrabal 1 den budu se snažit to okomentovat, tak, aby to pochopil i někdo, kdo to nikdy nedělal a chtěl by si to sám zkusit. |
Autor: | sandokan [ 23.05.2019, 20:53 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
tady je kod, co vloží SID data tam kde mají být a přidá přehrávač na C000 Kód: sid = "Happy_BirthdayDev.sid" ; jmeno SID souboru init = binary(sid, $0a, 2); z hlavicky vytahni INIT adresu play = binary(sid, $0c, 2); z hlavicky vytahni PLAY adresu *=$801 .word basend .word $0000 .byte $9E ;; Kod prikazu SYS .text '49152' ;; spustacia adresa .byte $00 basend .word $0000 *= binary(sid, $7c, 2); pouzij adresu .binary sid, $7e ; vloz SID data bez hlavicky ;tady bude velka dira nul... *=$C000 sei ; zakaz preruseni lda #$00 ; 0 -> A tax ; A -> X tay ; A -> Y jsr $1000 ; odskoc na INIT again lda #$40 cmp $d012 bne *-3 inc $d020 jsr $1003 ; odskoc na PLAY dec $d020 jmp again nechal jsem se inspirovat helpem assembleru s příkladem init = binary(sid, $0a, 2); z hlavicky vytahni INIT adresu jenže pokud to vložím takto "univerzálně": jsr init ; odskoc na INIT tak je ta adresa po kompilaci obráceně a neumím to otočit |
Autor: | Busy [ 24.05.2019, 07:07 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
sandokan píše: Kód: ;tady bude velka dira nul... V tomto pripade je lepsie vsetko ulozit pekne pokope (aj s basicom) od #0801 a po spusteni to na cielove miesta normalne skopirovat. sandokan píše: tak je ta adresa po kompilaci obráceně a neumím to otočit Vytiahni to po jednotlivych bajtoch a z bajtov rucne spocitaj 16-bitovu adresu pomocou rotacie a bitoveho ORu.
|
Autor: | sandokan [ 24.05.2019, 11:18 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
Busy píše: Vytiahni to po jednotlivych bajtoch a z bajtov rucne spocitaj 16-bitovu adresu pomocou rotacie a bitoveho ORu. ja bych to raději nechal na assembler, aby to udělal při kompilaci |
Autor: | sandokan [ 24.05.2019, 12:11 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
3. krok vložit obrázek -fotku Obrázek bude zobrazen ve formátu MULTICOLOR tj 160x200 bodů. Program Pixcen umí pracovat z různými formáty C64 a zároveň umí celkem slušně převést barvy do barev C64 s patřičnými restrikcemi multicolor modu. Akorát neumí měnit rozlišení, což není problém udělat jinde. Při otevření obrázku v Pixcen stačí jen vybrat formát MULTICOLOR a je hotovo. Je jasné, že vždy záleží na tom jaký je původní obrázek a výsledek je pak různý. Dá se to pak ručně po pixelech doupravit. Příloha: Pak stačí uložit 3 binární soubory -bitmap RAM.bmp -screen RAM.scr -color RAM.col Tyto binárky je pak potřeba načíst do C64 na patřičná místa paměti a nastavit registry grafického čipu VIC-II Kód: sid = "Happy_BirthdayDev.sid" ; jmeno SID souboru bmp = "Pav1.map" ; jmeno BMP souboru 8000 bytes screen = "Pav1.scr" ; jmeno SCREEN souboru 1000 bytes col = "Pav1.col" ; jmeno COLOR souboru 1000 bytes init = binary(sid, $0a, 2); z hlavicky vytahni INIT adresu play = binary(sid, $0c, 2); z hlavicky vytahni PLAY adresu *=$801 .word basend .word $0000 .byte $9E ; Kod prikazu SYS .text '49152' ; spousteci adresa C000 .byte $00 basend .word $0000 *= binary(sid, $7c, 2); vytáhni adresu z hlavičky a nastav adresu .binary sid, $7e ; vloz SID data bez hlavicky ;tady bude velka dira nul... *=$5c00 .binary screen ; vloz SCREEN data *=$6000 .binary bmp ; vloz BMP data ;8000 - BFFF dalsi dira nul :-) *=$C000 sei ; zakaz preruseni lda #$00 ; 0 -> A tax ; A -> X tay ; A -> Y jsr $1000 ; odskoc na INIT ;nastaveni grafiky lda #%00000010 sta $dd00 ; přepni VIC na blok $4000 -$7FFFF lda $d011 ora #%00110000 ;zapni bitmap mod BMM bit 5, bit3 0=25 1=24 radku sta $d011 lda $d016 ora #%00011000 ;zapni multicolor MCM bit 4, bit3 0=38 1=40 sloupcu sta $d016 lda #%01111000 ; 0111 screen RAM +$1C00=>$5C000, bit3 bitmap +$2000=>$6000 sta $d018 ;konec nastaveni grafiky again lda #$40 cmp $d012 bne *-3 inc $d020 jsr $1003 ; odskoc na PLAY dec $d020 jmp again *=$d800 .binary col ; vloz COLOR data Po kompilaci už celkem dlouhej program -je to zatím na kde mezi kodem a daty je spousta nul Příloha:
|
Autor: | sandokan [ 24.05.2019, 13:20 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
výsledek nic moc ladit vstupní obrázek a pak to pixelovat je práce na dlouhé zimní večery.. takže je to tak, jak jsem udělal napoprvé znáte někdo lepší metodu?? |
Autor: | LHS [ 24.05.2019, 14:56 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
sandokan píše: výsledek nic moc ladit vstupní obrázek a pak to pixelovat je práce na dlouhé zimní večery.. takže je to tak, jak jsem udělal napoprvé znáte někdo lepší metodu?? Neznam Pixcen, ale něco podobnýho je Project One. Ten při konvertu umožňuje vybrat z C64 palety barvy, který se použijou. Fotku tváře bych zkusit konvertovat do černo-šedo-bílý. |
Autor: | Busy [ 24.05.2019, 15:36 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
sandokan píše: Busy píše: Vytiahni to po jednotlivych bajtoch a z bajtov rucne spocitaj 16-bitovu adresu pomocou rotacie a bitoveho ORu. ja bych to raději nechal na assembler, aby to udělal při kompilaci |
Autor: | sandokan [ 25.05.2019, 18:53 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
Opravdu ručníkový den – Don’t panic Ten VIC je horší jak sudoku s 5 čísly. Několik hodin jsem se potrápil s obyčejnými sprity. Konkrétně s ukazatelem na adresu spritu, kdy jsem sice správně vypočítal adresu ukazatele sprite0 = VICbase + ScreenRAM + $03f8 , ($4000+$1C00+$03f8=$5c3f8 -z pohledu CPU) sprite1 = VICbase + ScreenRAM + $03f9 , .. Sprite7= VICbase + ScreenRAM + $03ff kde počátek screenRAM je z pohledu VIC dle: $D018 = %0000xxxx -> screenRAM $0000 $D018 = %0001xxxx -> screenRAM $0400 $D018 = %0010xxxx -> screenRAM $0800 $D018 = %0011xxxx -> screenRAM $0c00 $D018 = %0100xxxx -> screenRAM $1000 $D018 = %0101xxxx -> screenRAM $1400 $D018 = %0110xxxx -> screenRAM $1800 $D018 = %0111xxxx -> screenRAM $1c00 ( VICbase + $1c00 = $5c00 -z pohledu CPU) $D018 = %1000xxxx -> screenRAM $2000 $D018 = %1001xxxx -> screenRAM $2400 $D018 = %1010xxxx -> screenRAM $2800 $D018 = %1011xxxx -> screenRAM $2c00 $D018 = %1100xxxx -> screenRAM $3000 $D018 = %1101xxxx -> screenRAM $3400 $D018 = %1110xxxx -> screenRAM $3800 $D018 = %1111xxxx -> screenRAM $3c00 ale pro samotný ukazatel jsem nepřipočetl offset $2000, kyž jsem si nastavil bit3 do 1 $D018 = %xxxx0xxx -> bmpStart $0000 $D018 = %xxxx1xxx -> bmpStart =$2000 ( VICbase + $2000 = $6000 -z pohledu CPU) Pokud Sprite uložíme hned za bmp data (jejichž délka je 320x200/8= 8000 = $1f40 bytů) tj na $2000+$1f40= $3f40 (respektive na $7f40 z pohledu CPU) pak SPRITE0pointer = $3F40 / $40 = $FD (kterou uložíme na adresu $5c3f8) Začátky definice spritů mohou být uloženy jen po +$40 (64 bytů) od počátku adresace VIC (Sprite0RAM = VICbase + Sprite0pointer * $40 -z pohledu CPU) tady velký pozor ! Pokud si uložíme z nějakého editoru data spritů hned za sebe (tak jak jsem poprvé udělal), tak mezi každý sprite musíme vložit 1 byte jinak se další sprite „zrotuje“ o 1/3 doleva. Já se zde http://www.c64.cz/index.php?recenze=assembler11 chytil tohoto popisu: Hires sprit má tedy velikost 24 * 21 bitů, což znamená , že zabírá v paměti místo 4*21 bajtů ( 64 znaků) a vůbec mě nenapadlo si to spočítat, že 64 je špatně Má tam být 3*21 = 63 bytů /znaků Ten 1 byte mě stál několik hodin hledání, kde je chyba – přehození indiáni v assembleru… Škoda že ten 1 byte konstruktéři nevyužili pro individuální nastavení 2 barev (4+4 bity) pro každý sprite zvlášť namístou SHARED multicolor registry MM0 + MM1 |
Autor: | sandokan [ 25.05.2019, 19:00 ] |
Předmět příspěvku: | Re: Jak udělat krátké demo snadno a rychle krok za krokem |
4. krok -nakreslit SPRITY našel jsem perfektní stránku https://www.spritemate.com/ Příloha: kde si v prohlížeči rovnou sprity namalujete a vygenerujete data: Kód: // 2 sprites generated with spritemate on 25/05/2019, 01:33:20
LDA #$07 // sprite multicolor 1 STA $D025 LDA #$01 // sprite multicolor 2 STA $D026 // sprite 0 / multicolor / color: $02 sprite_0: .byte %00000000,%00000000,%00000000 .byte %00000000,%00000000,%00000000 .byte %00000000,%00000000,%00000000 .byte %00000000,%00100000,%00000000 .byte %00000000,%00010000,%00000000 .byte %00000000,%00000000,%00000000 .byte %00000000,%00110000,%00000000 .byte %00000000,%00110000,%00000000 .byte %00001010,%10101010,%10000000 .byte %00000110,%01100110,%01000000 .byte %00001010,%10101010,%10000000 .byte %00010101,%01010101,%01010000 .byte %00010101,%01010101,%01010000 .byte %00101010,%10101010,%10100000 .byte %00101010,%10101010,%10100000 .byte %00010101,%01010101,%01010000 .byte %00101010,%10101010,%10100000 .byte %00101010,%10101010,%10100000 .byte %00101010,%10101010,%10100000 .byte %00100110,%01100110,%01100000 .byte %00000000,%00000000,%00000000 // sprite 1 / singlecolor / color: $0a sprite_2: .byte %00000000,%00000000,%00000000 .byte %00000000,%00000000,%00000000 .byte %00001111,%00000011,%11000000 .byte %00011111,%10000111,%11100000 .byte %00111111,%11001111,%11110000 .byte %00111111,%11111111,%11110000 .byte %01111111,%11111111,%11111000 .byte %01111111,%11111111,%11111000 .byte %01111111,%11111111,%11111000 .byte %00111111,%11111111,%11111000 .byte %00011111,%11111111,%11110000 .byte %00001111,%11111111,%11100000 .byte %00001111,%11111111,%11000000 .byte %00000111,%11111111,%10000000 .byte %00000011,%11111111,%00000000 .byte %00000011,%11111110,%00000000 .byte %00000001,%11111100,%00000000 .byte %00000000,%01111000,%00000000 .byte %00000000,%00110000,%00000000 .byte %00000000,%00000000,%00000000 .byte %00000000,%00000000,%00000000 |
Stránka 1 z 2 | Všechny časy jsou v UTC + 1 hodina [ Letní čas ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |