No permission to create posts
RSS

HLAS - Prográmek na syntézu řeči přes pípák

18/02/2018 - 21:15
Avatar
MilasPce
Pardubice

Nejlepší bude nastudovat jak přes DOS službu INT 21 a její funkce 35h a 25h (get interrupt vector, set interrupt vector) si přesměrovat obsluhu přerušení (nejlépe softwarovou 1C) na sebe a pak stačí mít jednu proměnnou, kterou budeš ve vlastní obsluze přerušení 18,2x za sec. třeba inkrementovat.

V hlavním programu pak budeš čekat až dosáhne určité hodnoty (pak ji vynuluješ pro znovu počítání).

Hlavně nezapomenout na konci programu vrátit pomocí Set interrupt vector obsluhu zpátky na původní hodnotu.

PS: je dobré ve vlastním obslužném programu volat ten původní podprogram, co když nějaký software si to již přesměroval.

PPS: Assembler pro PC jsem si vytáhl před mnoha lety jako otázku u maturity.

Praxe znamená, že vše funguje, ale nevíme proč. Teorie znamená, že vše víme, ale nic nefunguje.

Někdy je teorie spojena s praxí. Znamená to, že nic nefunguje a nikdo neví proč ...

18/02/2018 - 22:06
Avatar

Powerack napsal(a)
Pošli přeloženej com soubor a já to checknu. Mám tady na stole svou 386, takže stačí jen zapnout...  

Nedaří se mi to připojit sem, tak jsem to dal na github:

https://github.com/berk76/hlas/releases/tag/version_1.0.0

Je to v tom souboru Test.zip. Pokud to zafunguje tak se vrátí hned zpátky do příkazové řádky. Pokud ne tak zamrzne.

Tak to pro zajímavost vyzkoušej.

Díky

18/02/2018 - 22:09
Avatar

@MilasPce asi máš pravdu a povede to na to co popisuješ. Bude to pro mě ale trochu maturita :-)

19/02/2018 - 09:55
Avatar
Praha

Do souboru test.zip jsi dal asi špatnej com soubor. 66B místo 921B.

3x 486: MB: 486PIO-3, CPU: Am5x86 P75 @133, RAM: 64MB EDO (!), HDD: 4GB CF, VGA: S3 ViRGE/DX 375 4MB (30ns), OS: Windows 98 SE SP2

WWW: Doupě

19/02/2018 - 10:44
Avatar
MilasPce
Pardubice

Tady je trošku srozumitelnej příklad na obsluhu přerušení:

http://faculty.kfupm.edu.sa/COE/aimane/assembly/pagegen-143.aspx.htm

Praxe znamená, že vše funguje, ale nevíme proč. Teorie znamená, že vše víme, ale nic nefunguje.

Někdy je teorie spojena s praxí. Znamená to, že nic nefunguje a nikdo neví proč ...

19/02/2018 - 20:39
Avatar

Powerack napsal(a)
Do souboru test.zip jsi dal asi špatnej com soubor. 66B místo 921B.  

V tom com-u není celej program hlas, je to jen izolovaná část kódu co mi nefunguje. Zajímá mě jen zda na železe taky vythuhne nebo zda se vrátí do příkaz. řádky.

19/02/2018 - 20:40
Avatar

MilasPce napsal(a)
Tady je trošku srozumitelnej příklad na obsluhu přerušení:

http://faculty.kfupm.edu.sa/COE/aimane/assembly/pagegen-143.aspx.htm  

Nevím proč, ale odkaz mi nefunguje. Zkusím ještě později jestli se nerozeběhne.

19/02/2018 - 20:46
Avatar
MilasPce
Pardubice

už mi taky nefunguje, dneska mám na odkazy špatnej den.

Praxe znamená, že vše funguje, ale nevíme proč. Teorie znamená, že vše víme, ale nic nefunguje.

Někdy je teorie spojena s praxí. Znamená to, že nic nefunguje a nikdo neví proč ...

21/02/2018 - 17:32
Avatar

Tak mám první upravenou verzi.

Nainstaloval jsem vlastní interrupt handler jak navrhoval MilasPce a nastavil mu custom frekvenci. Původní kód založený na měření rychlosti cpu jsem vykostil.

https://github.com/berk76/hlas/blob/master/hlas.asm

Binárka je k dispozici zde. (hlas.com je původní verze, hlas_2.com je upravená)

https://github.com/berk76/hlas/releases/tag/version_1.0.0

V DosBoxu to funguje dobře, ale nedokážu otestovat na reálném železe a porovnat různě rychlé pc-čka.

Pokud to někdo dokážete otestovat a porovnat tak dejte vědět.

21/02/2018 - 18:32
Avatar
MilasPce
Pardubice

Dobrá práce, koukám, že příští soutěž v programovaní bude v asembleru. Zítra to zkusím na mašině.

Praxe znamená, že vše funguje, ale nevíme proč. Teorie znamená, že vše víme, ale nic nefunguje.

Někdy je teorie spojena s praxí. Znamená to, že nic nefunguje a nikdo neví proč ...

21/02/2018 - 19:22
Avatar
MilasPce
Pardubice

Ještě promysli zda je nutné v rutině int_h schovávat a pak obnovovat všechny registry asi by tam šlo nějaký čas ušetřit. Třeba BX CX DX SI když se tak děje 22000 za sec. tak by to pomalým PC dost ulevilo. 

Praxe znamená, že vše funguje, ale nevíme proč. Teorie znamená, že vše víme, ale nic nefunguje.

Někdy je teorie spojena s praxí. Znamená to, že nic nefunguje a nikdo neví proč ...

21/02/2018 - 19:32
Avatar

Máš samozřejmě pravdu. Naopak by bylo vhodné sejvnout flagy.

21/02/2018 - 20:46
Avatar

berk napsal(a)
Máš samozřejmě pravdu. Naopak by bylo vhodné sejvnout flagy.  

IRET pops from stack: IP,CS and flags.

Takže flagy jsou sejvnutý v přerušení automaticky.

22/02/2018 - 21:57
Avatar

Tak jsem vykrámoval železo a otestoval.

  • Na 386 40Mhz fungují obě verze dobře
  • Na PIII je verze 1 zcela nepoužitelná, verze 2 funguje stejně dobře jako na 386

https://github.com/berk76/hlas/releases

Mission complete :-)

23/02/2018 - 09:18
Avatar
MilasPce
Pardubice

PIII už je na ten program v1 tak rychlý že při měření rychlosti přeteče čítač a počítá znova dokola . Musel by být na více Bajtů aby to fungovalo. Takže je i při přehrávání nepoužitelný.

Praxe znamená, že vše funguje, ale nevíme proč. Teorie znamená, že vše víme, ale nic nefunguje.

Někdy je teorie spojena s praxí. Znamená to, že nic nefunguje a nikdo neví proč ...

23/02/2018 - 13:18
Avatar

Je to tak. Nicméně měření počtu cyklů za časový úsek není v případě moderních procesorů s funkcemi pipeline atp. ideální metoda. Ten tvůj nápad s timerem je spolehlivější.

23/02/2018 - 15:07
Avatar
MilasPce
Pardubice

Používal jsem časovač i když jsem programoval hry, aby běžely na všech PC stejně rychle. V jazyku C je to velice jednoduché:

#define IRQ8 0x08

unsigned int casovac;

void interrupt (*old_ctc1) ( void );

void interrupt far int_ctc1 ( void )
{ casovac++;

old_ctc1();
}

void ini_ctc ( void )
{ old_ctc1=getvect(IRQ8);
setvect(IRQ8,int_ctc1);
}

void vrat_ctc( void )
{ setvect(IRQ8,old_ctc1);
}

Praxe znamená, že vše funguje, ale nevíme proč. Teorie znamená, že vše víme, ale nic nefunguje.

Někdy je teorie spojena s praxí. Znamená to, že nic nefunguje a nikdo neví proč ...

23/02/2018 - 19:35
Avatar

Jo, vzpomínám si když jsem zkoušel svoje první hry, tak běžely na každém počítači jinak rychle a za prase jsem nemohl přijít na to jak to vyladit aby to běželo všude stejně :-)

No permission to create posts
Časové pásmo: Europe/Prague

Nejvíce uživatelů online: 351

Právě online:
179 Host(é)

Právě prohlíží tuto stránku:
1 Host(é)

Nejaktivnejší uživatelé:

LubikCZ: 2165

MilasPce: 1501

Sany: 1498

Neny: 1136

Powerack: 965

Logout: 934

Statistiky uživatelů:

Hosté: 14

Členové: 684

Moderátoři: 0

Administrátoři: 1

Statistiky fóra:

Skupiny: 5

Fóra: 24

Témata: 1415

Příspěvky: 23914

Nejnovější uživatelé:

Pluto, Brbla, VasilijP, Snnsnsnn, Franta, pepapantak, isidor, Wolis, Martin Rulf, bujny, Pavel Pavel, LEON Pilot, Jan “Druid” Schicho, POLÁŠEK TOMÁŠ, Stanos

Administrátoři: Sledge: 5644

Podpořit finančním příspěvkem »

Stát se PATRONEM
high-voltage.cz

25 patronů přispívá částkou 2876 Kč měsíčně

Je to malá dvacka pro čtenáře, ale velká vzpruha pro HV! ;)
Podpořit nákupem na e-shopu »
Placka / odznak C64kPlacka / odznak C64k 18 Kč
Shadow bazar, retro herní džungle