OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 27.04.2024, 10:15

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 598 ]  Přejít na stránku Předchozí  1 ... 30, 31, 32, 33, 34, 35, 36 ... 40  Další
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.06.2023, 23:06 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
Pokud budu v pravidelnych intevalech posilat 0 a 1 tak me bude (trosku asi v zavislosti na konkretnim 40+ let starem bzucaku) vznikat "vlna" co bude vypadat nejak takto:
Toto ani riesit nemusis. Ten malicky sluchadlovy repracik je dostatocne rychly, membrana sa stiha hybat dostatocne rychlo, aby zahrala kludne aj 20 kHz. No a ked niekto bude mat vystup pripojeny na kvalitny zosik + repraky, tak tam tiez nebude problem s dostatocne rychlo sa pohybujucimi membranami vo (vyskovych) reprakoch :)

Dalej plati, ze cim vyssia frekvencia, tym sa membrane staci hybat na mensej aplitude, aby zvuk znel rovnako hlasno. Vsimni si nejake velke viacpasmove bedne - basaky sa hybu kludne aj centimeter dnu-von, ale pohyb vyskacov uz temer vobec nevidno. A pritom basy aj vysky pocujes rovnako hlasno.

Zabudni na sinusovy priebeh, proste, ber to tak, ze posielanim jedniciek a nul generujes obdlznikovy priebeh a hotovo. A s nim dostanes aj vsetky tie jeho vyssie harmonicke, ktore tomu obdlzniku davaju taky charakteristicky zvuk.

A nakoniec zabudni na nejaku zakladnu poziciu repracku. Z hladiska zvuku je dolezita len zmena polohy membrany repracika. Proste, jednosmerna zlozka tlaku sa z repraku do ucha neprenasa :) Jedine pravidlo ktore je uzitocne dodrziavat je z hladiska spotreby prudu reprackom - aby kludova poloha bola 0 a pokial robis kratke pulzy, tak je lepsie viac casu stravit v 0 a menej casu v 1.

Ohladom PWM mas pravdu - presne takto funguje. Cim vecsi pomer casu 1 voci casu 0, tym bude na vystupe vyssie priemerne napetie. Pokial bude zakladna frekvencia nizka (v pocutelnej oblasti), tak ju sice budes pocut, ale okrem toho budes pocut aj ten priebeh, co pomocou PWM simulujes.

A este jeden tip: Ked generujes obdlznik priamo tej frekvencie, ktoru chces zahrat, tak zmenou striedy 1 voci 0 mozes menit zafarbenie zvuku. Pri 1:1 (t.j. 0 a 1 trvaju rovnako dlho - polperiodu) tak zvuk bude najmohutnejsi, najplnsi, a pokial budes jednej urovni pridavat cas na ukor druhej (az ziskas tenke pulzy) tak zvuk daneho tonu bude taky jemnejsi a menej mohutny.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.06.2023, 23:21 
Offline
Pan Štábní

Registrován: 12.05.2013, 22:24
Příspěvky: 1524
Bydliště: u Prahy
Has thanked: 44 times
Been thanked: 386 times
Pěkná interaktivní simulace, jak funguje ovlivnění barvy zvuku a vícehlas na ZX Spectru, byla na
https://retrocip.cz/symfonie-na-jednom-bitu/

Chodilo to ale jen v Chrome a FireFoxu, tak nevím, jestli je to ještě funnkčí…


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.06.2023, 01:30 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
A este jeden tip: Ked generujes obdlznik priamo tej frekvencie, ktoru chces zahrat, tak zmenou striedy 1 voci 0 mozes menit zafarbenie zvuku. Pri 1:1 (t.j. 0 a 1 trvaju rovnako dlho - polperiodu) tak zvuk bude najmohutnejsi, najplnsi, a pokial budes jednej urovni pridavat cas na ukor druhej (az ziskas tenke pulzy) tak zvuk daneho tonu bude taky jemnejsi a menej mohutny.


Nevim uplne presne co je "strieda" ale pochopil jsem to takhle, ze kdyz mam konstantni soucet taktu pro ...opetovny zacatek 1 tak kdyz to mam (+ je 1 a - je nula), budu to ukazovat pro 16 pismen.
Kód:
1+++++++++++++++ ticho, ale nepouzivat kvuli trvalemu napeti
1++++++++++++++0 hlasitejsi pocit, ale nepouzivat kvuli tomu ze je beeper delsi cas pod napetim
1+++++++++++++0- hlasitejsi pocit, ale nepouzivat kvuli tomu ze je beeper delsi cas pod napetim
1++++++++++++0-- hlasitejsi pocit, ale nepouzivat kvuli tomu ze je beeper delsi cas pod napetim
1+++++++++++0--- hlasitejsi pocit, ale nepouzivat kvuli tomu ze je beeper delsi cas pod napetim
1++++++++++0---- hlasitejsi pocit, ale nepouzivat kvuli tomu ze je beeper delsi cas pod napetim
1+++++++++0----- hlasitejsi pocit, ale nepouzivat kvuli tomu ze je beeper delsi cas pod napetim
1++++++++0------ hlasitejsi pocit, ale nepouzivat kvuli tomu ze je beeper delsi cas pod napetim
0-------1+++++++ nejhlasitejsi pocit, ale nepouzivat protoze to konci v 1
1+++++++0------- nejhlasitejsi pocit
1++++++0-------- jemnejsi pocit
1+++++0--------- jemnejsi pocit
1++++0---------- jemnejsi pocit
1+++0----------- jemnejsi pocit
1++0------------ jemnejsi pocit
1+0------------- jemnejsi pocit
10-------------- jemnejsi pocit
0--------------- ticho


Ok, wiki rika: U periodických signálů, které během jedné periody přecházejí z jedné úrovně do druhé a naopak, znamená střída (anglicky duty cycle) poměr časů, ve kterých je obdélníkový signál v jednotlivých úrovních. Pokud se uvádí střída ve tvaru např. 1:1, je tím myšleno, že obě dvě úrovně signálu trvají stejně dlouho. Pokud je střída udána v procentech, myslí se tím obvykle doba trvání úrovně H „zapnuto“ vůči celkové periodě signálu. (0 % až 100 %, 50 % pro 1:1). Veličina se někdy označuje jako DCL.

PS: Mam dobrou zpravu, stahnul jsem si z repozitare milkytracker a nic... .) ale stahnul jsem pak schismtracker a ten vypada trosku jako IT a tam se me podarilo uz editovat tu hudbu. Je to trosku opruz, dela se to v F4? a na klavesnici mate namapovany dve oktavy, kde Q je vyssi C, 2 je vyssi C# a Z je nizsi C a S je nizsi C#. Pri prepisu VSECH hodnot se automaticky doplnuje ten sampl co je videt vpravo nahore. S tema oktavama se jeste musi cachrovat a menit implicitni hodnotu protoze rozsah dvou je malo (taky vpravo nahore). A pak to pres ESC menu staci ulozit. A znovu zeditovat ve FastTrackeru II na 10 kanalu a postelovat kdyztak hromadne posun oktav.
Jeste jsem nepochopil jaky zvuky vydava pro buben jednotlive CDEFGAB, navic to vypada ze Octode2k16 umi vic bubnu jak pro sampl 2. Je tam v nabidce 3 a 4. Stacilo by me vedet jak je takovy ten pred-uder a pak ten velky. Pripadne kombinace dvou preduderu. Omg to nejde napsat bez diakritiky a nebo pomlcky... předúderů.

Ale porad me prijde asi lepsi upravit ten c++ prevodnik aby nacital vstupni parametry ktery samply jsou jakoby 1 z parametru prikazove radky nez to delat rucne pro kazdy soubor...

PPS: Podle toho odkazu od Dexe bude kratsi dobu trvani 1 lidske ucho vnimat stejne hlasite, ale ostreji. Takze jsem tam mel napsat "nejsytejsi" misto "nejhlasitejsi"

Co když ale zmenšíme dobu, po kterou máme tu logickou 1, o polovinu? Výsledek bude tedy mít střídu 1:3 (25%, tj. čtvrtinu doby 1, tři čtvrtiny 0) a zvuk bude znít jinak, bude ostřejší – i když ho stále budeme vnímat jako „stejně vysoký“. S šířkou střídy pracuje například hradlo Jonathana Smitha, použité v Ping Pongu.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.06.2023, 01:58 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
dex píše:
Pěkná interaktivní simulace, jak funguje ovlivnění barvy zvuku a vícehlas na ZX Spectru, byla na
https://retrocip.cz/symfonie-na-jednom-bitu/

Chodilo to ale jen v Chrome a FireFoxu, tak nevím, jestli je to ještě funnkčí…


Zadnou emulaci navidim, ale ten clanek je polopaticky a fakt super. Diky!
Pokusim se postupne krokovanim pochopit to Octode ver. 2016 kdyz uz jsem ho implementoval.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.06.2023, 03:50 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Mam sesmolenou prvni vlastni konverzi z "alf2_zalza.xm" do Octode2k16!
Pridal jsem ho k tem 3 skladbam co jsem postoval uz predtim, tak koho to bzuceni zajima muze stahovat. .)

Ten konvertor je trosku chytrejsi nez jsem cekal.

XM musi mit 10 kanalu, protoze 8 je jakoby pro cokoliv a posledni dva jsou jen pro bici.
Ale bici muze byt jen jeden najednou a mel by byt "C-5" a v nabidce je: KICK, SNARE a HIHAT. U bubnu lze nastavit hlasitost.
Prevodnik ale pozna kdyz jsou bubny mimo 9 a 10 kanal.

Citace:
Skládání hudby
=================

Hudbu pro přehrávač Octode 2k16 můžete skládat pomocí šablony XM, která
je dodávána společně s Octode 2k16. To však poskytne pouze velmi hrubý
odhad, jak bude hudba znít na skutečném ZX Spectrum.

Při použití šablony XM zvažte následující:

- Počet kanálů nemůžete změnit.
- Tóny musí být v kanálu 1-8.
- Rozsah tónů je omezen od C-0 do B-6. Pozor, aby noty nad C-5 byly aliasovány.
- Bubny by měly být v kanálu 9-10 a můžete použít pouze jeden buben na řádek.
- Bubny mají pevnou výšku tónu, v šabloně namapovanou na C-4.
- Sloupec hlasitosti můžete použít k nastavení hlasitosti bubnu. To je nejúčinnější na hihat, to má malý vliv na kop.
- Změny hodnoty BPM nebo nástrojů se neprojevují.
- Hodnotu rychlosti můžete změnit globálně, nebo kdykoli pomocí příkazu Fxx, kde xx musí být v rozmezí 0-$1f.
- Odladění noty můžete nastavit povelem E5x.
- Pořadovou smyčku lze nastavit povelem Bxx.
- Všechny ostatní příkazy efektu, včetně nastavení hlasitosti tónů, budou ignorovány.


Ve výchozím nastavení se bude oktoda 2k16 opakovat, dokud není stisknuta klávesa.
Formát dat
=============

Oktoda 2k16 používá poněkud neobvyklý formát dat. Vyplývá ze společné posloupnosti-
přístup vzoru, ale ukládá aktuální data poznámek do samostatné délky řádku
nárazníky.


Sekvence skladby musí následovat přímo za štítkem musicData (tedy na
vrchol music.asm). Skládá se ze seznamu ukazatelů na aktuální obrazce,
v pořadí, v jakém se hrají. Sekvence je ukončena 0-slovem.
V určitém bodě posloupnosti musíte zadat popisek „loop“, což je kde
hráč bude skákat do poté, co dokončil sekvenci.


Vzorky a řádkové vyrovnávací paměti mohou být umístěny kdekoliv v hudebních datech. Pokud paměť
je řídký, mohli byste dokonce vmáčknout data do mezer mezi 8 zvukových jader.

Pattery se skládají z jednoho nebo více řádků, které zase obsahují 2-3 délky slova
2-3 slov. První slovo je kontrolní slovo, které je zkonstruováno jako
(rychlost řádku * 256) + bubnová spoušť. Bubnové spouště jsou

0x00 – bez bubnu
0x01 – hihat
0x04 – kick
0x80 – snare

Pokud bubnová spoušť není nulová, dalším slovem je hlasitost bubnu. Vysoký
byte z toho je vždy 0, nízký byte může být libovolná hodnota. Hodnota 0x80
značí nejvyšší hlasitost, nižší i vyšší hodnoty značí nižší
hlasitosti.

Poslední slovo je ukazatel na řádkovou vyrovnávací paměť, obsahující aktuální data poznámek
pro daný řádek vzoru.

Vzorky musí být ukončeny číslem 0x40.


V neposlední řadě by měla být alespoň jedna řádková vyrovnávací paměť. Vyrovnávací paměti řádků
se skládají z 8 slov, představujících 8 hodnot frekvence (čítače). Chcete-li umlčet
kanál, jednoduše nastavte jeho frekvenci na 0. Vyrovnávací paměti řádků nemusí být
ukončeny.


PS: OMG! FastTracker II umi hromadnou zmenu cisla samplu! Je to v "Adv. Edit" a Old Number se nastavuje mysi vpravo kliknutim na prvni sloupec s cisly a New number na druhy sloupec se jmeny...
Ted jeste se naucit jak zmenit pozici primo tech samplu a nebo jak se nahravaji nove.


Přílohy:
test2.tap [15.83 KiB]
20 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.06.2023, 09:43 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Kód:
 1: octode     test
 2: octode2k15 test
3: octode2k16 test
4: alf2_zalza
5: pd_dawn
6: _first_last_
7: exit

Nektere skladby jako _first_last_ to hraje pomaleji. Vypada to, ze nestiha kdyz je to v paternu namackane za sebou a nejsou tam mezery...

Na testovani co to umi to uz asi staci... O mnoho vic stejne do 32k+ nenamackam, aniz bych musel resit nejake ukladani do pomalejsi pameti a prekopirovani pred prehranim.


Přílohy:
test2.tap [30.87 KiB]
21 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 11.06.2023, 18:26 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Kdyz jsem se dival jaky ma Octode2k16 bash skript na kompilaci tak se mi nelibilo jak zachazi s parametry:

https://github.com/utz82/ZX-Spectrum-1-Bit-Routines/blob/master/octode2k16/compile.sh

Kód:
#!/bin/sh

#handle command line options
if [ "$1" = "-t" ]
   then title=$2
   elif [ "$1" = "-a" ]
      then addr="$2"
   elif [ "$1" = "-c" ]
      then composer="$2"
fi

if [ "$3" = "-c" ]
   then composer="$4"
   elif [ "$3" = "-a" ]
      then addr="$4"
fi

if [ "$5" = "-a" ]
   then addr="$6"
fi


predelal jsem to na
Kód:
#!/bin/sh

#check ./xm2octode2k16
if [ ! -f ./xm2octode2k16 ] ; then
   g++ ./xm2octode2k16.cpp -o xm2octode2k16
fi
if [ ! -f ./xm2octode2k16 ] ; then
   echo "File ./xm2octode2k16 not found!" >&2
   exit 2
fi
   
#handle command line options
while [ $# -gt 0 ] ; do
   if [ "$1" = "-t" ] ; then
      title=$2
   elif [ "$1" = "-a" ] ; then
      addr="$2"
   elif [ "$1" = "-c" ] ; then
      composer="$2"
   elif [ "$1" = "-f" ] ; then
      file="$2"
   else
      echo "Bad parameter: $1" >&2
      echo "Use: $0 -t title -a addr -c composer -f file" >&2
      echo "Default:" >&2
      echo "   title: " >&2
      echo "   composer: " >&2
      echo "   file: music.xm" >&2
      echo "   addr: 32768" >&2
      exit 1
   fi
   shift
   shift
done


Hlavni zmena je v tom ze ty parametry mohou byt v jakemkoliv poradi.

Kdybych to chtel pridat do puvodniho projektu tak to nejde kdyz nemam prava a dalsi zpusob je asi udelat fork, ten si zmenit a pozadat o nejake slouceni? Ale ten originalni projekt je rozsahly, protoze ma spoustu adresaru s motory a forknout to jde jen cele... tak jsem se na to vykaslal... Napsat email?

Ale v tom originalnim skriptu pouzival jine triky, jako je vytvoreni basic loaderu a pres zmakebas jeho tapku se spravnou adresou volani binarky a pak spusteni emulatoru fuse-sdl.

Ten nemam nainstalovany tak jsem si s tim hral dal a pridal do skriptu zjisteni zda je emulator naistalovany a pokud ano se spusti. Nakonec jsem si upravil vlastni "compile.sh" co mam pro M4 Forth aby umel krome jedineho parametru ktery je jmeno souboru bez koncovky i druhy parametr, kterym je adresa spusteni a pak vygeneroval nejen binarku ale i tapku a tu pridal k tapce basic loaderu.

Proto jsem uz zacal posilat tapky a ne z80. Ta by mela byt vic univerzalni pro ruzne systemy a emulatory.

Pokud je teda program volan s adresou odkud bezi binarka tak se vytvori spustitelna tapka a pak se zjistit zda dalsi parametr neni spustitelny program a ten se vola s pripadnymi dalsimi parametry. Pokud je to "no_emul" tak se skript ukonci. Pokud za adresou uz nic neni tak se zacne hledat v tomto poradi fuse, fuse-sdl a fbzx. Kdyz neco najde tak to zavola s name.tap.

https://github.com/DW0RKiN/M4_FORTH/blo ... compile.sh
Kód:
#!/bin/sh

# Use:
#   compile.sh name_without_suffix
#   compile.sh name_without_suffix start_addr
#   compile.sh name_without_suffix start_addr no_emul
#   compile.sh name_without_suffix start_addr emulator parameters

# ------------------- Parameter reading

[ $# -lt 1 ] && printf "Error: Need filename!\n" >&2 && exit 1

name=$1
shift

[ ! -s $name.m4 ] && printf "Error: $name.m4 not found!\n" >&2 && exit 2

case $1 in
    0x[0-9a-fA-F]*) addr=$(printf "%d" $1); shift ;;
    ''|*[!0-9]*) ;;
    *) addr=$1; shift ;;
esac

[ ! -z $1 ] && emul=$1 && shift

printf "name: $name.m4\n"
printf "addr: $addr\n"
printf "emul: $emul\n"
printf "parameters: $*\n\n"

# ------------------- Compilation m4>asm

printf "Compilation m4>asm: ...";

m4 $name.m4 > $name.asm

error=$?     
[ $error != 0 ] && printf "fail!\nError: $error\n" && exit 3
printf "ok!\n";

if [ -f $name.bin ] ; then
    old=$(ls -l $name.bin)
else
    old="not exist"
fi

# ------------------- Compilation asm>bin

printf "Compilation asm>bin: ...";

if [ -z $addr ] ; then
    pasmo -d                   $name.asm $name.bin > smaz
    pasmo --tap                $name.asm $name.tap 2>/dev/null
else
    pasmo -d    --equ __ORG=$addr $name.asm $name.bin > smaz
    pasmo --tap --equ __ORG=$addr $name.asm $name.tap 2>/dev/null
fi

error=$?     
[ $error != 0 ] && printf "fail!\nError: $error\n" && exit 4
[ ! -s $name.bin ] && printf "fail!\nError: $name.bin not exist or is empty\n" && exit 5
printf "ok!\n";

printf "old: $old\n"
printf "new: "
ls -l $name.bin

[ -z $addr ] && exit 0

# ------------------- Generate loader if addr exist

if [ ! -f loader.bas ] ; then
    printf "Generate basic loader...\n"
    printf "10 LOAD \"\" CODE\n" > loader.bas
    printf "20 POKE 23672,0: POKE 23673,0: POKE 23674,0\n" >> loader.bas
    printf "30 RANDOMIZE USR $addr\n" >> loader.bas
    printf "40 PAUSE 1: LET s=PEEK 23672+256*PEEK 23673+65536*PEEK 23674: LET s=s/50: LET m=INT (INT s/60): LET h=INT (m/60): PRINT \"Time: \";h;\"h \";m-60*h;\"min \";INT ((s-60*m)*100)/100;\"s \";: PAUSE 0: STOP\n" >> loader.bas
else
    printf "The existing loader.bas will be used\n"
fi

printf "Compilation bas>tap: ...";

zmakebas -o loader.tap loader.bas

error=$?     
[ $error != 0 ] && printf "fail!\nError: $error\n" && exit 6

printf "ok!\n";

# ------------------- Concatenate loader with code and clean

mv ./$name.tap ./${name}_bin.tap
cat loader.tap ${name}_bin.tap > $name.tap
rm loader.tap
rm ${name}_bin.tap

# ------------------- Run the ZX Spectrum emulator

[ "$emul" = "no_emul" ] && exit 0

if [ ! -z $emul ] ; then
    [ ! -x "$(command -v $emul)" ] && printf "Error: $emul not found!\n" >&2 && exit 7
    $emul $* $name.tap
    exit 0
fi

if [ -x "$(command -v fuse)" ] ; then
    fuse -m 48 -t $name.tap
    exit 0
fi

if [ -x "$(command -v fuse-sdl)" ] ; then
    fuse-sdl -m 48 -t $name.tap
    exit 0
fi

if [ -x "$(command -v fbzx)" ] ; then
    fbzx $name.tap
    exit 0
fi

printf "No ZX Spectrum emulator found installed. Tried fuse, fuse-sdl and fbzx."


Treba se to nekomu bude hodit.

PS: Jedna vec co tam delam je zvlastni, kdyz pasmo vytvori tapku tak je uvnitr s nazvem toho souboru. To je videt v ZX pri nacitani tapky. Takze prvne vytvarim tapku s nazvem "file" ktera ma jen binarku. Pak vytvrim novou tapku file.tap ze slouceneho loader.tap a file.tap. To je trosku problem protoze jsou shodne nazvy, takze musim prvne prejmenovat puvodni file.tap obsahujici jen binarku na file_bin.tap a pak uz to jde a pak se maze loader.tap a file_bin.tap, Novy soubor name.tap obsahuje uvnitr "spravne" nazvy.

PPS: Vsimnete si ze ta adresa jde napsat i hexadecimalne a bash si ji prevede na decimalni soustavu.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Naposledy upravil _dworkin dne 11.06.2023, 18:42, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 11.06.2023, 18:37 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
PS: Jedna vec co tam delam je zvlastni, kdyz pasmo vytvori tapku tak je uvnitr s nazvem toho souboru. ...
Dalsi dovod prejst na SjASMPlus ;)
Tam mas vytvaranie tapky, vratane celeho obsahu hlaviciek, plne pod kontrolou. A rovno si tam mozes v zdrojaku napisat aj vlastny zavadzaci basic a tam mat vsetko zjednotene pekne pokope.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 11.06.2023, 18:45 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
_dworkin píše:
PS: Jedna vec co tam delam je zvlastni, kdyz pasmo vytvori tapku tak je uvnitr s nazvem toho souboru. ...
Dalsi dovod prejst na SjASMPlus ;)
Tam mas vytvaranie tapky, vratane celeho obsahu hlaviciek, plne pod kontrolou. A rovno si tam mozes v zdrojaku napisat aj vlastny zavadzaci basic a tam mat vsetko zjednotene pekne pokope.


A umi to pri kompilaci vytvorit i binarku a tapku najednou?
V pasmu to delam ted tak ze to kompiluji 2x s tim ze jednou posilam chybove hlasky na dev/null. Protoze jsem nenasel ani silent parametr... .)

PS: Jeste dalsi drobna zmena ve skriptu, z tech 3 pominek u hledani emulatoru jsem udelal smycku. A pak opravil ze kazdy emulator ma jine parametry... .)

https://github.com/DW0RKiN/M4_FORTH/commit/57611286e550a1e82487183fa95fef7edf28c0ab

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 11.06.2023, 20:21 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
A umi to pri kompilaci vytvorit i binarku a tapku najednou?
Samozrejme.
Na konci zdrojaku si skompilovany kod mozes ulozit do viacerych formatov naraz. Takto vyzera typicky koniec zdrojaku pri mojich programoch:

SAVESNA "subor.sna" , start_adresa ; Ulozenie tvojho kodu do snapu
SAVESNA "subor.bin" , start , dlzka ; Ulozenie bloku dat do binarky bez hlaviciek

SAVETAP "subor.tap" , BASIC , "Loader" , basic_zaciatok , basic_dlzka , startovaci_riadok
SAVETAP "subor.tap" , CODE , "Code-1" , start1 , dlzka1
SAVETAP "subor.tap" , CODE , "Code-2" , start2 , dlzka2

Z mojho kodu mi vytvori testovaci snap pre rychle spustenie a otestovanie v emulatore, dalsi prikaz mi ulozi moj kod do binarky bez akychkolvek hlaviciek takze ho mozem dodatocne prilepit kam chcem alebo napr. spakovat, no a posledne tri prikazy mi do tapky ulozia zavadzaci basic a dva "Bytes:" bloky. Samozrejme pocet blokov ukladanych do tapky (kludne aj viacerych tapiek) je lubovolny, v tomto pripade "Code-1" bol obrazok a "Code-2" samotny program.

Proste, SjASMPlus umoznuje dva sposoby generovania kodu. Prvy je klasicky jednoduchy sekvencny, kedy kompiluje a co skompiluje rovno zapisuje do zvolenych vystupnych suborov, a druhy sposob (softistikovanejsi) je ze si vytvoris virtualny pametovy model (48k, 128k, Pentagon, ZX Next...), do neho si skompilujes svoj kod ktory si potom mozes vyssie uvedenymi prikazmi lubovolne ukladat do vystupnych suborov. A samozrejme oba sposoby mozno kombinovat a pouzit naraz v ramci jednej kompilacie.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 12.06.2023, 03:27 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
V tom bashi jsem mel jeste dalsi chybu... pokud to nekdo budete chtit pouzit tak pouzijte odkaz na github a ne z oldcompu.

Zapomnel jsem mazat vygenerovany loader.bas, takze v pristi kompilaci se natvrdo pouzival i se starou adresou pocatku.
Takze nove si zapamatuje zda ho vytvoril a pokud ano, tak ho maze.
Pokud najde existujici tak se predpoklada ze ho nekdo vytvoril rucne nebo upravil a pouzije se ten... nic se na nem nemeni, ani ta adresa.

PS: Pridal jsem dalsi skladbu algar_thegermansroom.xm. Ta zabira monstroznich 0x38f3 bajtu (a asi 2m11s), takze aby se me vlezla k ostatnim musel jsem smazat vsechny _test_ soubory i alf2_zalza.
I tak program zacina pod 0x8000, ale data a hudebni rutina jsou presne od 0x8000 a je tam asi 6*16 bajtu rezerva od zasobniku. .)


Přílohy:
music2.tap [33.18 KiB]
20 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 13.06.2023, 00:49 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Postupnym vylepsovanim se me podarilo upravit vystup z c++ programu prevadejicim xm na zdrojovy soubor plny "dw" tak, ze ten vystup je "realokovatelny". A zaroven zpetne kompatibilni (po malych upravach).

Original vypadal nejak takto:
Kód:
loop
     dw ptn0
     dw 0
ptn0
     dw #300,row0
     dw #380,#0080,row1
     db #40
row0
     dw #200,#400,#300,#0,#0,#0,#0,#0
row1
     dw #0,#200,#e41,#0,#0,#0,#0,#0

Prvne jsem prejmenoval labely podle nazvu souboru a odstranil znak #, ktery je pro M4 znak komentare:
Kód:
filename_loop:
     dw filename_ptn0
     dw 0
filename_ptn0:
     dw 0x300,filename_row0
     dw 0x380,0x0080,filename_row1
     db 0x40
filename_row0:
     dw 0x200,0x400,0x300,0x0,0x0,0x0,0x0,0x0
filename_row1:
     dw 0x0,0x200,0xe41,0x0,0x0,0x0,0x0,0x0

Pak to udelal realokovatelny:
Kód:
  ifndef filename
filename equ $
  endif
filename_loop equ filename+0x0
     dw filename_ptn0
     dw 0
filename_ptn0 equ filename+0x4
     dw 0x300,filename_row0
     dw 0x380,0x0080,filename_row1
     db 0x40
filename_rows equ filename+0x9
filename_row0 equ filename_rows+0x0
     dw 0x200,0x400,0x300,0x0,0x0,0x0,0x0,0x0
filename_row0 equ filename_rows+0x1
     dw 0x0,0x200,0xe41,0x0,0x0,0x0,0x0,0x0

Ale mel jsem stale problem s tim ze potrebuji aby M4 FORTH po pripojeni znal velikost souboru (po kompilaci), abych to mohl spravne umistit do VARIABLE_SECTION a vedet kolik to zabralo mista.

Takze jsem nakonec jeste pridal

; define({filename_size}, 0x29)

No a jeste jsem mel problem s carkama, takze je uplne zrusil a kazda polozka je na samostatnem radku.

Tim jsem dosahl toho, ze krome zmeny jmena "label" na "filename_label" je to zpetne kompatibilni a M4 FORTH s tim umi pracovat jako s promennou.

Uz jsem se tesil jak pouziji i spodni cast pameti, protoze jsem udelal slovo co to uklada postupne do promennych, ale tak ze to ukazuje na buffer co lezi 0x8000+ s tim ze nez se to prehraje tak to tam jen umistim pomoci PUSH3_MOVE.
Je po kompilaci pasmo nevytvorilo binarku a nic nevypsalo... sjasmplus byl sdilnejsi na chyby. Takze ty jsem upravil kdyz mu vadilo ze EQU nezacinalo na zacatku radku a pak se dival proc me to orezava adresy...

Pretekl jsem 64k!

Jak je to mozne kdyz jsem pridal jen jednu skladbu???

Aha... pod 32k mam jen cca 8kb volneho prostoru pokud nebudu nejak cachrovat s obrazovkou nebo to zazipovavat... To jsem si nejak neuvedomoval ze je to tak malo...

A ta velka skladba ma skoro 16kb, a to same potrebuji pro buffer takze ve vysledku mam mene pameti nez predtim... ach jo.

PS: Kdybych mel jistotu ze pred kazdou carkou bude hex hodnota zacinajici # tak bych ty carky odstranovat nemusel. (asi)

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 14.06.2023, 01:42 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Nova skladba bacon_sandwitch!

Podarilo se me narvat 50685 bajtu dat do cca 40 kb volne pameti ram ZX Spectra a to jsem jeste k tomu musel udelat misto na minimalne 14581 bajtovy buffer v "horni" pameti (bance?).

Zatim je to tak napul rucni prace a napul psany v M4 FORTHu.

Ale bylo to fakt narocny, porad same chyby a u nekterych jsem se az divil, ze ten cpp zdrojak nikdo nekompiloval v g++... .) Nejsem odbornik na c++ takze zjistit co je dulezite a co ne neni pro me lehke.

Pak jsem musel "inkludovat" uz binarky, takze dalsi zmena ve slovech. A udelat zmenu ve formatu hudby, protoze kdyz nacitam binarku, tak nedostanu informaci kde lezi LOOP, ktery se predtim zjistil tak ze existoval label s presne danym jmenem. Ted mam jen jendicky a nuly. Takze prvni 2 bajty jsou navic a je to ta adresa pro LOOP.

To ze se nacitaji binarky, taky znamena ze se to musi prvne zkompilovat a uz v te dobe musim znat adresu na ktere to bude lezet az se to bude hrat... Protoze delat nejakou realokaci za behu se me fakt nechtelo. Je to ZX Spectrum a ne nejaky EXE file.

Jo a ta adresa nejde udelat jednotne pro vsechno, protoze je to nejaky buffer do ktereho se musi vlezt nejdelsi song.

Budu asi spamovat v jinem vlakne rano. https://oldcomp.cz/viewtopic.php?f=45&t=4982


Přílohy:
music.png
music.png [ 3.76 KiB | Zobrazeno 462 krát ]
music.tap [24.35 KiB]
20 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 14.06.2023, 04:01 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Koukam ze kdyz jen prohodim poradi tech tri subrutin tak usetrim jeden skok a dva bajty.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/LZE_test$ ../check_word.sh 'define({USE_LZE})'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Busy soft ;; LZE optimized depacker ;; 08.07.2016 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DEPREP_LZE:             ;           depack_lze
    push BC             ; 1:11      depack_lze      Save block length
    ld    A, 0x7F       ; 2:7       depack_lze
    call DEPNUM_LZE     ; 3:17      depack_lze      Get relative offset of packed sequence
    ex  (SP),HL         ; 1:19      depack_lze
    push HL             ; 1:11      depack_lze
    ld    H, D          ; 1:4       depack_lze      DE = destination address
    ld    L, E          ; 1:4       depack_lze
    sbc  HL, BC         ; 2:15      depack_lze      HL = begin of source sequence in already unpacked data
    pop  BC             ; 1:10      depack_lze      BC = length of sequence
    ldir                ; 2:16/21   depack_lze      Copy sequence
    pop  HL             ; 1:10      depack_lze
   
;; Input:
;;  HL = address of source packed data
;;  DE = address of destination to depack data
DEPACK_LZE:             ;           depack_lze   
    bit   6,(HL)        ; 2:12      depack_lze      Get identification of block: 0=unpacked, 1=packed
    push AF             ; 1:11      depack_lze
    ld    A, 0x3F       ; 2:7       depack_lze   
    call DEPNUM_LZE     ; 3:17      depack_lze      Get length of block
    pop  AF             ; 1:10      depack_lze
    jr   nz, DEPREP_LZE ; 2:7/12    depack_lze      If packed block then jump
    ld    A, B          ; 1:4       depack_lze
    or    C             ; 1:4       depack_lze      If length = 0 then end of depacking
    ret   z             ; 1:5/11    depack_lze
    ldir                ; 2:16/21   depack_lze      Copy unpacked data block
    jr   DEPACK_LZE     ; 2:12      depack_lze
DEPNUM_LZE:             ;           depack_lze
    and (HL)            ; 1:7       depack_lze      Mask one-byte value or high byte of two-byte value
    ld    C, A          ; 1:4       depack_lze
    ld    B, 0x00       ; 2:7       depack_lze      BC = value or high type of value
    bit   7,(HL)        ; 2:12      depack_lze
    inc  HL             ; 1:6       depack_lze
    ret   z             ; 1:5/11    depack_lze      If short value then return
    ld    B, C          ; 1:4       depack_lze
    ld    C,(HL)        ; 1:7       depack_lze      Get low byte of two-byte value
    inc  HL             ; 1:6       depack_lze
    ret                 ; 1:10      depack_lze
                       ;[46:]
   
;; Format of packed data
;; ~~~~~~~~~~~~~~~~~~~~~
;; <Block><Block>...<Block><EndMark>
;;
;; Unpacked data blk:  <BlockLength> <Data..>
;; Repeated sequence:  <BlockLength> <Offset>
;;
;; <BlockLength>
;;   bit 6 ..... Identification: 0 = unpacked data, 1 = repeated sequence
;;   bit 7 ..... Length store: 0 = 6-bit length 0..63, 1 = 14-bit length 0..16383
;;   bit 0-5 ... whole 6-bit length  or  high byte of 14-bit length
;;   Additonal second byte: low byte of length in case of 14-bit length
;;
;; <Data..>
;;   Data bytes what are directly copied by LDIR
;;
;; <Offset>
;;   bit 7 ..... Offset store: 0 = 7-bit offset 0..127, 1 = 15-bit offset 0..32767
;;   bit 0-6 ... whole 7-bit offset  or  high byte of 15-bit offset
;;   Additonal second byte: low byte of offset in case of 15-bit offset
;;
;; Length = 0 means end mark.
; seconds: 0           ;[46:297]

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 14.06.2023, 18:41 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Myslim ze se me podarilo zkratit jeste tu rozbalovaci rutinu z 46 bajtu na 41 bajtu a zaroven urychlit.
Zkousel jsem nekolik metod a nektere slibne v jednom smeru selhavaly na tom ze se nacita jednou bajt a podruhe dvoubajt, ale tahle metoda co popisi je lepsi pokud nekde nedelam chybu.

Original (uz zkraceny o 2 bajty a -12 taktu):
Kód:
DEPREP_LZE:             ;           depack_lze
    push BC             ; 1:11      depack_lze      Save block length
    ld    A, 0x7F       ; 2:7       depack_lze
    call DEPNUM_LZE     ; 3:17      depack_lze      Get relative offset of packed sequence
    ex  (SP),HL         ; 1:19      depack_lze
    push HL             ; 1:11      depack_lze
    ld    H, D          ; 1:4       depack_lze      DE = destination address
    ld    L, E          ; 1:4       depack_lze
    sbc  HL, BC         ; 2:15      depack_lze      HL = begin of source sequence in already unpacked data
    pop  BC             ; 1:10      depack_lze      BC = length of sequence
    ldir                ; 2:16/21   depack_lze      Copy sequence
    pop  HL             ; 1:10      depack_lze
                       ;[16:124]
;   ...fall down to depack_lze


Nove je to o bajt kratsi, ale stejne pomale (ve skutecnosti je to rychlejsi protoze DEPNUM_LZE bezi rychleji)
Kód:
DEPREP_LZE:             ;           depack_lze
    push BC             ; 1:11      depack_lze      Save block length
    ld    A,(HL)        ; 1:7       depack_lze      A = %6543210D; D = Double bit
    call DEPNUM_LZE     ; 3:17      depack_lze      Get relative offset of packed sequence
    ex  (SP),HL         ; 1:19      depack_lze      Load block lengt and save address of source packed data
    push HL             ; 1:11      depack_lze      Save block length
    ld    H, D          ; 1:4       depack_lze      DE = destination address
    ld    L, E          ; 1:4       depack_lze
    sbc  HL, BC         ; 2:15      depack_lze      HL = begin of source sequence in already unpacked data
    pop  BC             ; 1:10      depack_lze      BC = length of sequence
    ldir                ; 2:16/21   depack_lze      Copy sequence
    pop  HL             ; 1:10      depack_lze
                        ;[15:124]

Rozdil je v tom ze original nastavuje masku do A a nove se rovnou nacita (HL) s tim ze carry je celou dobu vynulovan.

Hlavni smycka v originale vypada takhle:
Kód:
;# Input:
;#  HL = address of source packed data
;#  DE = address of destination to depack data
;# ===========================================
DEPACK_LZE:             ;           depack_lze   
    bit   6,(HL)        ; 2:12      depack_lze      Get identification of block: 0=unpacked, 1=packed
    push AF             ; 1:11      depack_lze
    ld    A, 0x3F       ; 2:7       depack_lze   
    call DEPNUM_LZE     ; 3:17      depack_lze      Get length of block
    pop  AF             ; 1:10      depack_lze
    jr   nz, DEPREP_LZE ; 2:7/12    depack_lze      If packed block then jump
                       ;[11:64]

    ld    A, B          ; 1:4       depack_lze
    or    C             ; 1:4       depack_lze      If length = 0 then end of depacking
    ret   z             ; 1:5/11    depack_lze

    ldir                ; 2:16/21   depack_lze      Copy unpacked data block
    jr   DEPACK_LZE     ; 2:12      depack_lze
                       ;[18:105]

Je to zalozene na tom ze 7. bit obsahuje informaci o tom zda je to jednobajtovy nebo dvoubajtovy token obsahujici delku bloku a 6. bajt ma informaci o tom jestli je ten blok komprimovany (=nasledujici cast co se ma "rozbalit" uz byla jednou pouzita v rozbalene casti, takze zdroj misto tech dat obsahuje jen dalsi token s relativnim ofsetem vzhledem k DE = aktualni index za posledniho zkopirovany bajt (je posuvan jen pres ldir)) nebo se jen budou kopirovat data o tehle delce ze zdroje.
Aby to fungovalo tak se musi ten 7. a 6. bit vynulovat.

Nova uprava vypada takto:
Kód:
;# Input:
;#  HL = address of source packed data
;#  DE = address of destination to depack data
;# ===========================================
DEPACK_LZE:             ;           depack_lze   
    ld    A,(HL)        ; 1:7       depack_lze      A = %P543210D; P = Packed bit; D = Double bit
    or    A             ; 1:4       depack_lze      Reset carry and set sign and zero flag
    rla                 ; 1:4       depack_lze      A = %??????D0; sign unaffected
    rrca                ; 1:4       depack_lze      A = %0??????D; sign unaffected, reset carry
    call DEPNUM_LZE     ; 3:17      depack_lze      Get length of block; sign and zero flag unaffected
    jp    m, DEPREP_LZE ; 3:10      depack_lze      If packed block then jump
                        ;[10:46]

    ret   z             ; 1:5/11    depack_lze      If zero then end of depacking

    ldir                ; 2:16/21   depack_lze      Copy unpacked data block
    jr   DEPACK_LZE     ; 2:12      depack_lze

Nove je signalizace dvoubajtu v 7. bitu presunuta do nulteho bitu a signalizace "komprimace" v 6. bitu je nyni v 7. bitu.
Vtip je v tom ze DEPNUM_LZE rutina co nacita bajt nebo dvoubajt je napsana tak ze zachovava SIGN a ZERO flag( ale carry musi byt vynulovan).
Takze se nacte hodnota do A, nastavi se SIGN flag pro signalizaci "komprimace" a peclivou kombinaci instrukci zachovavajici priznaky se 7. bit vynuluje.
Tady se usetri bajt a 18 taktu (+ ta rychlejsi subrutina)

Nasleduje ukonceni rutiny (posunul jsem to az za odskok aby to nezpomalovalo pokud je to komprimovany).
Nevim jak je napsana ta komprimacni cast, ale tohle zvladne jen jeden nulovy bajt jako znacku(mark?) ze je konec.
Protoze puvodne je to psane obecne jako "A=B a OR C". Ale pokud je to psane jako jeden nulovy bajt tak by to nemelo nacist dalsi bajt v podrutine, takze by melo stacit "OR C", protoze v A je bud C a B=0 a nebo v A je B a C je druhy bajt. Takze to staci jednou instrukci i kdyby ten pakovac delal zbytecne nulovy dvoubajt.

No minimalne tohle usetri 2 bajty a 8 taktu.

Posledni nejdulezitejsi cast protoze se vola opakovane pro kazdy token je v originale:
Kód:
DEPNUM_LZE:             ;           depack_lze
    and (HL)            ; 1:7       depack_lze      Mask one-byte value or high byte of two-byte value
    ld    C, A          ; 1:4       depack_lze
    ld    B, 0x00       ; 2:7       depack_lze      BC = value or high type of value
    bit   7,(HL)        ; 2:12      depack_lze
    inc  HL             ; 1:6       depack_lze
    ret   z             ; 1:5/11    depack_lze      If short value then return
                       ;[ 8:41]
   
    ld    B, C          ; 1:4       depack_lze
    ld    C,(HL)        ; 1:7       depack_lze      Get low byte of two-byte value
    inc  HL             ; 1:6       depack_lze
    ret                 ; 1:10      depack_lze
                        ;[4:27]


Nove je to o dost kratsi protoze to nacitani je castecne v kazdem volani:
Kód:
;# Input:
;#      reset carry
;#      A  = (HL)
;#      HL = address of source packed data
;# Output1:
;#      carry and sign and zero flag unaffected
;#      BC = %0000 0000 0s?? ????
;#      HL++
;# Output2:
;#      carry and sign and zero flag unaffected
;#      BC = %0s?? ???? ???? ????
;#      HL+= 2
DEPNUM_LZE:             ;           depack_lze     
    inc  HL             ; 1:6       depack_lze
    rra                 ; 1:4       depack_lze      6543210D -> .6543210 carry=D
    ld    C, A          ; 1:4       depack_lze
    ld    B, 0x00       ; 2:7       depack_lze
    ret  nc             ; 1:5/11    depack_lze      If short value then return BC = %0000 0000 0??? ????
                       ;[ 6:26]

    ccf                 ; 1:4       depack_lze
    ld    B, C          ; 1:4       depack_lze
    ld    C,(HL)        ; 1:7       depack_lze      Get low byte of two-byte value
    inc  HL             ; 1:6       depack_lze
    ret                 ; 1:10      depack_lze      BC = %0??? ???? ???? ????
                        ;[5:31]

Tady se setri 1 bajt a hlavne 11 nebo 15 taktu pro kazdy token. Nevyhoda je ze kvuli odcitani "sbc HL,BC" se musi nulovat carry.

Ta uprava je zpetne nekompatibilni. Algoritmus pro baleni je stejny (mozna se lisi nulovy exit token) ale binarni soubory jsou jiny. Kazdy prvni bajt co se nacita DEPNUM_LZE musi byt o 1 bit rotovany vlevo.

Pro zpetnou kompatibilitu to jde vylepsi tou zmenou na "or C" o jeden bajt a 4 takty.

PS: Tady https://encode.su/threads/3001-State-of-the-art-byte-compression-(for-8-bit-computers) nekdo popisuje ty komprimacni rutiny modernim zpusobem ze dela graf jak moc to zmensuje a kolik stoji cas to rozbalit. Zajimalo by me jak si asi vede busyho (omg pise se to s malym pocatecnim? Hm.. tak s velkym B je spravne) rutina LZE a jak tahle vylepsena modifikace.

PPS: Pro pobaveni clanek z roku 1999. http://zxm.cz/zxm/1999-2.pdf

Citace:
..ale ta Busyho rutina od Matsofta byla fakt d e b i l n i.


Omg stesti ze nejsem nikdo tak znamy... tohle bych si mozna bral osobne. .)))

PPPS: Proc me to nahrazuje to slovo na D jako "jedinec s IQ 60". Cenzura :o

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 598 ]  Přejít na stránku Předchozí  1 ... 30, 31, 32, 33, 34, 35, 36 ... 40  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 29 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz