kbdled .equ 0f6h ; port PC 8255 pro REPRO tempo .equ 11 ; tempo hudby .org 0 ; adresa začátku programu ; ***************************************** ; přehrávání dvouhlasé hudby - inicializace ; ***************************************** start: lxi h,musi01 ; adresu začátku 1. hlasu shld voice1 ; uložit do ukazatele lxi h,musi02 ; adresu začátku 2. hlasu shld voice2 ; uložit do ukazatele call player ; volání přehrávače jmp start ; pro velký úspěch opakovat voice1: .dw 0 ; ukazatel na notu 1. hlasu voice2: .dw 0 ; ukazatel na notu 2. hlasu ; ************************* ; přehrávač dvouhlasé hudby ; ************************* player: lhld voice1 ; načíst ukazatel na 1. hlas mov a,m ; načíst aktuální notu inx h ; ukazatel posunout shld voice1 ; a uložit ana a ; nota 80h rm ; znamená konec skladby call nt2div ; jinak překódovat na děličku sta relo1+1 ; uložit děličku (výšku tónu 1) mov a,b ; modifikace programu sta chanl1+4 ; pro pauzu nebo notu lhld voice2 ; načíst ukazatel na 2. hlas mov a,m ; načíst aktuální notu inx h ; ukazatel posunout shld voice2 ; a uložit call nt2div ; notu 2 překódovat na děličku (reg. D) sta relo2+1 ; uložit děličku (výšku tónu 2) mov a,b ; modifikace programu sta chanl2+4 ; pro pauzu nebo notu call tongen ; generovat dva souběžné tóny jmp player ; další souzvuk dvou tónů ; ******************** ; generování dvou tónů ; ******************** tongen: mvi b,tempo ; tempo melodie (MSB) mvi c,0 ; tempo melodie (LSB) mov h,c ; hodnota "vlny" tónu 1 mov d,c ; hodnota "vlny" tónu 2 mvi l,1 ; inicializace děličky tónu 1 mov e,l ; inicializace děličky tónu 2 chanl1: mov a,h ; načíst hodnotu "vlny" tónu 1 out kbdled ; a vyhodit na reproduktor dcr l ; odpočet půlperiody tónu 1 jnz balanc ; není-li T/2, pak balancer xri 4 ; jinak překlopím mov h,a ; a uložím hodnotu "vlny" tónu 1 relo1: mvi l,0 ; reload děličky tónu 1 balanc: mov a,a ; časový vyvažovač sekvence jmp $+3 ; DCR C/JNZ (mírně zlepšuje zvuk) chanl2: mov a,d ; načíst hodnotu "vlny" tónu 2 out kbdled ; a vyhodit na reproduktor dcr e ; odpočet půlperiody tónu 2 jnz durate ; není-li T/2, pak odpočet délky xri 4 ; jinak překlopím mov d,a ; a uložím hodnotu "vlny" tónu 2 relo2: mvi e,0 ; reload děličky tónu 2 durate: dcr c ; LSB čítač délky tónů jnz chanl1 ; zde je možno vložit krátkou ; proceduru, která potřebuje ; rychlou odezvu dcr b ; MSB čítač délky tónů jnz chanl1 ret ; *************************** ; překódování noty na děličku ; *************************** nt2div: ana a ; pro pauzu se modifikuje program mvi b,0C3h ; (sekvence DCR n/JMP) rz ; a hodnota děličky je irelevantní mvi b,0C2h ; pro tón sekvence (DCR n/JNZ) adi 11 ; transpoziční konstanta mov e,a ; dle čísla tónu mvi d,0 lxi h,ladeni-1 ; se v tabulce dělicích poměrů dad d mov a,m ; načte dělicí poměr pro notu ret ; *********************** ; tabulka dělicích poměrů ; *********************** ladeni: ; kontra (noty 01h až 08h) .db 0FFh,0F1h .db 0E3h,0D7h,0CAh,0BFh,0B4h,0AAh ; velká (noty 09h až 14h) .db 0A1h,098h,08Fh,087h,07Fh,078h .db 072h,06Bh,065h,05Fh,05Ah,055h ; malá (noty 15h až 20h) .db 050h,04Ch,047h,043h,040h,03Ch .db 039h,036h,032h,030h,02Dh,02Ah ; malá jednočárkovaná (noty 21h až 2Ch) .db 028h,026h,024h,022h,020h,01Eh .db 01Ch,01Bh,019h,018h,017h,015h ; malá dvoučárkovaná (noty 2Dh až 34h) .db 014h,013h,012h,011h,010h,00Fh .db 00Eh,00Dh ; *************************** ; tabulka generovaných tónů ; číslo tónu/dělička/freq/tón ; *************************** ; kontra ; 01h / FFh / 41 Hz / E1 ; 02h / F1h / 44 Hz / F1 ; 03h / E3h / 46 Hz / FIS1 ; 04h / D7h / 49 Hz / G1 ; 05h / CAh / 52 Hz / GIS1 ; 06h / BFh / 55 Hz / A1 ; 07h / B4h / 58 Hz / AIS1 ; 08h / AAh / 62 Hz / H1 ; *************************** ; velká oktáva ; 09h / A1h / 65 Hz / C ; 0ah / 98h / 69 Hz / CIS ; 0bh / 8Fh / 73 Hz / D ; 0ch / 87h / 78 Hz / DIS ; 0dh / 7Fh / 82 Hz / E ; 0eh / 78h / 87 Hz / F ; 0fh / 72h / 93 Hz / FIS ; 10h / 6Bh / 98 Hz / G ; 11h / 65h / 104 Hz / GIS ; 12h / 5Fh / 110 Hz / A ; 13h / 5Ah / 117 Hz / AIS ; 14h / 55h / 124 Hz / H ; *************************** ; malá oktáva ; 15h / 50h / 131 Hz / c ; 16h / 4Ch / 139 Hz / cis ; 17h / 47h / 147 Hz / d ; 18h / 43h / 156 Hz / dis ; 19h / 40h / 165 Hz / e ; 1ah / 3Ch / 175 Hz / f ; 1bh / 39h / 185 Hz / fis ; 1ch / 36h / 196 Hz / g ; 1dh / 32h / 208 Hz / gis ; 1eh / 30h / 220 Hz / a ; 1fh / 2Dh / 233 Hz / ais ; 20h / 2Ah / 247 Hz / h ; *************************** ; malá čárkovaná oktáva ; 21h / 28h / 262 Hz / c' ; 22h / 26h / 277 Hz / cis' ; 23h / 24h / 294 Hz / d' ; 24h / 22h / 311 Hz / dis' ; 25h / 20h / 330 Hz / e' ; 26h / 1Eh / 349 Hz / f' ; 27h / 1Ch / 370 Hz / fis' ; 28h / 1Bh / 392 Hz / g' ; 29h / 19h / 415 Hz / gis' ; 2ah / 18h / 440 Hz / a' ; 2bh / 17h / 466 Hz / ais' ; 2ch / 15h / 494 Hz / h' ; *************************** ; malá dvoučárkovaná oktáva ; 2dh / 28h / 523 Hz / c'' ; 2eh / 26h / 554 Hz / cis'' ; 2fh / 24h / 587 Hz / d'' ; 30h / 22h / 622 Hz / dis'' ; 31h / 20h / 659 Hz / e'' ; 32h / 1Eh / 698 Hz / f'' ; 33h / 1Ch / 740 Hz / fis'' ; 34h / 1Bh / 784 Hz / g'' ; *************************** ; 00h / pauza ; 80h / konec zápisu ; *************************** ; *************** ; 1. hlas melodie ; *************** musi01: .db 007h,007h,00eh,00eh,007h,007h,00eh,00eh .db 005h,005h,00ch,00ch,005h,005h,00ch,00ch .db 003h,003h,00ah,00ah,003h,003h,00ah,00ah .db 002h,002h,009h,009h,002h,002h,009h,009h .db 007h,007h,00eh,00eh,007h,007h,00eh,00eh .db 005h,005h,00ch,00ch,005h,005h,00ch,00ch .db 003h,003h,00ah,00ah,003h,003h,00ah,00ah .db 002h,002h,009h,009h,002h,002h,009h,009h .db 007h,007h,00eh,00eh,007h,007h,00eh,00eh .db 005h,005h,00ch,00ch,005h,005h,00ch,00ch .db 002h,002h,009h,009h,002h,002h,009h,009h .db 002h,002h,009h,009h,002h,002h,009h,009h .db 007h,007h,00eh,00eh,007h,007h,00eh,00eh .db 005h,005h,00ch,00ch,005h,005h,00ch,00ch .db 002h,002h,009h,009h,002h,002h,009h,009h .db 002h,002h,009h,009h,002h,002h,009h,009h .db 080h ; *************** ; 2. hlas melodie ; *************** musi02: .db 013h,013h,015h,016h,015h,015h,013h,013h .db 015h,015h,01ah,01ah,015h,015h,015h,015h .db 013h,013h,015h,016h,015h,015h,013h,013h .db 013h,013h,012h,012h,013h,013h,015h,015h .db 013h,013h,015h,016h,015h,015h,013h,013h .db 015h,015h,01ah,01ah,015h,015h,015h,015h .db 016h,016h,018h,01ah,018h,018h,016h,016h .db 018h,018h,01dh,01dh,018h,018h,018h,018h .db 021h,021h,000h,000h,021h,021h,000h,000h .db 021h,021h,000h,000h,021h,01fh,01dh,018h .db 01ah,01ah,01ah,01ah,01ah,01ah,01ah,01ah .db 01ah,01ah,01ah,01ah,01ah,01ah,01ah,01ah .db 021h,021h,000h,000h,021h,021h,000h,000h .db 021h,021h,000h,000h,021h,01fh,01dh,018h .db 01ah,01ah,01ah,01ah,01ah,01ah,01ah,01ah .db 00eh,00eh,00dh,00dh,00eh,00eh,010h,010h .db 080h .end