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 12

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 :hang:
4. spustit to na reálném železe :cman:

to vše chci udělat přes víkend a bude to k 45tým narozeninám přítelkyně :candle:
-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 :lamer:
-takže budu keslit minimálně
-hudbu použiji již hotovou
-v programování se nebudu pouštět do žádných velkých :pig: -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:
MujPRG.prg [49.63 KiB]
646 krát


Přílohy:
30letC64.png
30letC64.png [ 378.49 KiB | Zobrazeno 17903 krát ]

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 :whist:
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.
spustit se dá přes SYS 49152
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:
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 :suicide:

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, 13:49 ]
Předmět příspěvku:  Re: Jak udělat krátké demo snadno a rychle krok za krokem

2. krok -vybrat SID a spustit ho

nejlepší je vytvořit si prázdnou disketu a do ní umístit SIDplay a nějaké SIDy a spustit v emulátoru a vybrat si svého favorita

pak si vykopírovat čistá SID data bez hlavičky
SID player ukazuje, kde jsou data uloženy, v mém případě MEM $1000 - $18A1
Pak je důležitá adresa INIT $1000 a PLAY $1003

To se dá udělat více způsoby, já zvolil uložení paměti do souboru z monitoru (alt+H) VIC emulátoru příkazem:
s "SIDDATA" 8 1000 18a1

emulátor to pak uloží na namapovanou disketu, příkaz „s“ ukládá i s počáteční adresou (2 byty navíc), takže se to pak pro test dá nahrát přímo

POZNÁMKA
Samotná data SIDu jsou ve skutečnosti již programem co je potřeba pravidelně volat

K „volání“ stačí zkompilovat toto „mujSIDplay.prg“:


*=$C000

sei
lda #$00
tax
tay
jsr $1000 ; volání INIT

again

lda #$40
cmp $d012
bne *-3
inc $d020
jsr $1003 ;volání PLAY
dec $d020

jmp again


pak nahrát data SIDU a mujSIDplay.prg a sputit SYS49152

Přílohy:
MujSIDplay.png
MujSIDplay.png [ 23.88 KiB | Zobrazeno 17787 krát ]
Sidplay.png
Sidplay.png [ 105.06 KiB | Zobrazeno 17787 krát ]
D64edit.png
D64edit.png [ 46.61 KiB | Zobrazeno 17787 krát ]

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 :scratched:

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...
No, to by som nechcel nahravat z kazety ... :)
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 :scratched:
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:
Pixcen.png
Pixcen.png [ 96.58 KiB | Zobrazeno 17691 krát ]


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:
MojeDemo1.png
MojeDemo1.png [ 168.18 KiB | Zobrazeno 17691 krát ]

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 :pig:
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 :pig:
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
Ano, presne to som myslel - nech to asembler pri kompilacii vytiahne po bajtoch a spocita z nich adresu.

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 :suicide:
$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 :bang: – 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:
WebSpriteEditor.png
WebSpriteEditor.png [ 125.4 KiB | Zobrazeno 17613 krát ]


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 12 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/