; ********************************************************* ; Sada rutin pro generování pseudonáhodných posloupností ; s právě jedním výskytem každého prvku a s délkou (2^N-1), ; kde N je počet bitů. Uvedeny rutiny pro N = 8 až 16 bitů. ; Generované posloupnosti neobsahují poslední prvek, tedy ; hodnoty 255,511,1023,2047,4095,8191,16383,32767 a 65535. ; Záměnou instrukcí JPE namísto JPO budou posloupnosti ; obsahovat i poslední prvek, ovšem tentokrát bez nuly. ; ********************************************************* prevo1 .equ 8125h ; rutina BIOSu pro tisk čísla getkey .equ 84a1h ; rutina BIOSu pro čekání na klávesu prtout .equ 8500h ; rutina BIOSu pro tisk ASCII znaku beep .equ 88a3h ; rutina BIOSu pro pípnutí prnpos .equ 0c03eh ; proměnná BIOSu - pozice tisku .org 0 ; začátek překladu ; ********************************************** ; Smyčka pro demonstraci generované posloupnosti ; jednotlivých rutin s grafickým zobrazením ; ********************************************** mvi a,0 ; začínáme u délky 8 bitů loop: push psw ; uschovat pořadí rutiny mov e,a mvi d,0 ; dle pořadí rutiny lxi h,rndpro ; a tabulky jejich začátků dad d dad d mov e,m ; načtu adresu rutiny inx h mov d,m xchg shld getrnd+1 ; a uložím do instrukce CALL call prtlev ; vytisknu popis "LEVELU" lxi h,1 ; někde začít musím a tak shld rndnum ; prvním číslem bude jednička next: call pixel ; číslo zobrazím v matici pixelů getrnd: call rnd16 ; vygenerují další pseudonáhodné číslo lhld rndnum ; testuji postupně generátory mov a,h ; pro 8,9,10,11,12,13,14,15 a 16 bitů ana a jnz next mov a,l cpi 1 jnz next call beep ; upozorním na konec posloupnosti call getkey ; počkám na stisk klávesy pop psw ; obnvovit pořadí rutiny inr a ; další rutina na řadě cpi 9 ; jsou už všechny? jc loop ; NE => běž na další ret ; ANO => konec dema ; adresy začátků generátorů rndpro: .dw rnd08,rnd09,rnd10,rnd11,rnd12 .dw rnd13,rnd14,rnd15,rnd16 ; *************************************************** ; Pro generátory 4-7 bitů jsou uvedeny jen polynomy.. ; *************************************************** ; *************************************************** ; Generátor pseudonáhodných čísel (4-bitový registr) ; zpětnovazební polynom: X[4]+[3]+1 ; maska výpočtu polynomu: 0000 1100 (0Ch) ; výstupní maska hodnoty: 0000 1111 (0Fh) ; *************************************************** ; *************************************************** ; Generátor pseudonáhodných čísel (5-bitový registr) ; zpětnovazební polynom: X[5]+[3]+1 ; maska výpočtu polynomu: 0001 0100 (14h) ; výstupní maska hodnoty: 0001 1111 (1Fh) ; *************************************************** ; *************************************************** ; Generátor pseudonáhodných čísel (6-bitový registr) ; zpětnovazební polynom: X[6]+[5]+1 ; maska výpočtu polynomu: 0011 0000 (30h) ; výstupní maska hodnoty: 0011 1111 (3Fh) ; *************************************************** ; *************************************************** ; Generátor pseudonáhodných čísel (7-bitový registr) ; zpětnovazební polynom: X[7]+[6]+1 ; maska výpočtu polynomu: 0110 0000 (60h) ; výstupní maska hodnoty: 0111 1111 (7Fh) ; *************************************************** ; *************************************************** ; Generátor pseudonáhodných čísel (8-bitový registr) ; zpětnovazební polynom: X[8]+[6]+[5]+[4]+1 ; maska výpočtu polynomu: 1011 1000 (B8h) ; výstupní maska hodnoty: 1111 1111 (FFh) ; *************************************************** rnd08: lda rndnum ; z předchozího čísla ani 0b8h ; vypočtu hodnotu polynomu jpo rnd08c ; do příznaku parity P stc ; a převedu na příznak CY rnd08c: lda rndnum ; z předchozího čísla dělám nové ral ; rotací vlevo a nasouváním CY ;ani 0FFh ; u generátorů 4-7 bitů ; nutno dopnit výstupní masku, ; omezující rozsah hodnot sta rndnum ; uložím novou hodnotu čísla ret ; *************************************************** ; Generátor pseudonáhodných čísel (9-bitový registr) ; zpětnovazební polynom: X[9]+X[5]+1 ; maska výpočtu polynomu: 0000 0001 0001 0000 (0110h) ; výstupní maska hodnoty: 0000 0001 1111 1111 (01FFh) ; *************************************************** rnd09: lhld rndnum ; z předchozího čísla mov a,h ; z vyššího bajtu ani 001h ; vypočtu hodnotu dílčího mov b,a ; polynomu a uložím ji do B mov a,l ; rovněž z nižšího bajtu ani 010h ; vypočtu dílčí polynom xra b ; a sloučím z mezivýsledkem z B dad h ; předchozí číslo posouvám vlevo jpo rnd09c ; a hodnotu celého polynomu inx h ; nasunu do registru HL zprava rnd09c: mov a,h ; aplikací výstupní masky ani 001h ; omezím rozsah hodnot mov h,a ; na 0..511 shld rndnum ; uložím novou hodnotu čísla ret ; *************************************************** ; Generátor pseudonáhodných čísel (10-bitový registr) ; zpětnovazební polynom: X[10]+X[7]+1 ; maska výpočtu polynomu: 0000 0010 0100 0000 (0240h) ; výstupní maska hodnoty: 0000 0011 1111 1111 (03FFh) ; *************************************************** rnd10: lhld rndnum ; z předchozího čísla mov a,h ; z vyššího bajtu ani 002h ; vypočtu hodnotu dílčího mov b,a ; polynomu a uložím ji do B mov a,l ; rovněž z nižšího bajtu ani 040h ; vypočtu dílčí polynom xra b ; a sloučím z mezivýsledkem z B dad h ; předchozí číslo posouvám vlevo jpo rnd10c ; a hodnotu celého polynomu inx h ; nasunu do registru HL zprava rnd10c: mov a,h ; aplikací výstupní masky ani 003h ; omezím rozsah hodnot mov h,a ; na 0..1023 shld rndnum ; uložím novou hodnotu čísla ret ; *************************************************** ; Generátor pseudonáhodných čísel (11-bitový registr) ; zpětnovazební polynom: X[11]+X[9]+1 ; maska výpočtu polynomu: 0000 0101 0000 0000 (0500h) ; výstupní maska hodnoty: 0000 0111 1111 1111 (07FFh) ; *************************************************** rnd11: lhld rndnum ; z předchozího čísla mov a,h ani 005h ; vypočtu hodnotu polynomu dad h ; předchozí číslo posouvám vlevo jpo rnd11c ; a hodnotu celého polynomu inx h ; nasunu do registru HL zprava rnd11c: mov a,h ; aplikací výstupní masky ani 007h ; omezím rozsah hodnot mov h,a ; na 0..2047 shld rndnum ; uložím novou hodnotu čísla ret ; *************************************************** ; Generátor pseudonáhodných čísel (12-bitový registr) ; zpětnovazební polynom: X[12]+X[6]+X[4]+X[1]+1 ; maska výpočtu polynomu: 0000 1000 0010 1001 (0829h) ; výstupní maska hodnoty: 0000 1111 1111 1111 (0FFFh) ; *************************************************** rnd12: lhld rndnum ; z předchozího čísla mov a,h ; z vyššího bajtu ani 008h ; vypočtu hodnotu dílčího mov b,a ; polynomu a uložím ji do B mov a,l ; rovněž z nižšího bajtu ani 029h ; vypočtu dílčí polynom xra b ; a sloučím z mezivýsledkem z B dad h ; předchozí číslo posouvám vlevo jpo rnd12c ; a hodnotu celého polynomu inx h ; nasunu do registru HL zprava rnd12c: mov a,h ; aplikací výstupní masky ani 00fh ; omezím rozsah hodnot mov h,a ; na 0..4095 shld rndnum ; uložím novou hodnotu čísla ret ; *************************************************** ; Generátor pseudonáhodných čísel (13-bitový registr) ; zpětnovazební polynom: X[13]+X[4]+X[3]+X[1]+1 ; maska výpočtu polynomu: 0001 0000 0000 1101 (100Dh) ; výstupní maska hodnoty: 0001 1111 1111 1111 (1FFFh) ; *************************************************** rnd13: lhld rndnum ; z předchozího čísla mov a,h ; z vyššího bajtu ani 010h ; vypočtu hodnotu dílčího mov b,a ; polynomu a uložím ji do B mov a,l ; rovněž z nižšího bajtu ani 00dh ; vypočtu dílčí polynom xra b ; a sloučím z mezivýsledkem z B dad h ; předchozí číslo posouvám vlevo jpo rnd13c ; a hodnotu celého polynomu inx h ; nasunu do registru HL zprava rnd13c: mov a,h ; aplikací výstupní masky ani 01fh ; omezím rozsah hodnot mov h,a ; na 0..8191 shld rndnum ; uložím novou hodnotu čísla ret ; *************************************************** ; Generátor pseudonáhodných čísel (14-bitový registr) ; zpětnovazební polynom: X[14]+X[5]+X[3]+X[1]+1 ; maska výpočtu polynomu: 0010 0000 0001 0101 (2015h) ; výstupní maska hodnoty: 0011 1111 1111 1111 (3FFFh) ; *************************************************** rnd14: lhld rndnum ; z předchozího čísla mov a,h ; z vyššího bajtu ani 020h ; vypočtu hodnotu dílčího mov b,a ; polynomu a uložím ji do B mov a,l ; rovněž z nižšího bajtu ani 015h ; vypočtu dílčí polynom xra b ; a sloučím z mezivýsledkem z B dad h ; předchozí číslo posouvám vlevo jpo rnd14c ; a hodnotu celého polynomu inx h ; nasunu do registru HL zprava rnd14c: mov a,h ; aplikací výstupní masky ani 03fh ; omezím rozsah hodnot mov h,a ; na 0..16383 shld rndnum ; uložím novou hodnotu čísla ret ; *************************************************** ; Generátor pseudonáhodných čísel (15-bitový registr) ; zpětnovazební polynom: X[15]+X[14]+1 ; maska výpočtu polynomu: 0110 0000 0000 0000 (6000h) ; výstupní maska hodnoty: 0111 1111 1111 1111 (7FFFh) ; *************************************************** rnd15: lhld rndnum ; z předchozího čísla mov a,h ani 060h ; vypočtu hodnotu polynomu dad h ; předchozí číslo posouvám vlevo jpo rnd15c ; a hodnotu celého polynomu inx h ; nasunu do registru HL zprava rnd15c: mov a,h ; aplikací výstupní masky ani 07Fh ; omezím rozsah hodnot mov h,a ; na 0..32767 shld rndnum ; uložím novou hodnotu čísla ret ; *************************************************** ; Generátor pseudonáhodných čísel (16-bitový registr) ; zpětnovazební polynom: X[16]+X[15]+X[13]+X[4]+1 ; maska výpočtu polynomu: 1101 0000 0000 1000 (D008h) ; výstupní maska hodnoty: 1111 1111 1111 1111 (FFFFh) ; *************************************************** rnd16: lhld rndnum ; z předchozího čísla mov a,h ; z vyššího bajtu ani 0d0h ; vypočtu hodnotu dílčího mov b,a ; polynomu a uložím ji do B mov a,l ; rovněž z nižšího bajtu ani 008h ; vypočtu dílčí polynom xra b ; a sloučím z mezivýsledkem z B dad h ; předchozí číslo posouvám vlevo jpo rnd16c ; a hodnotu celého polynomu inx h ; nasunu do registru HL zprava rnd16c: shld rndnum ; uložím novou hodnotu čísla ret ; ****************** ; Tisk popisu levelu ; ****************** prtlev: push psw ; uschovat číslo "levelu" mvi a,1ch ; vymazat obrazovku call prtout lxi h,0f011h ; pozice tisku na obrazovku shld prnpos call prtstg ; tisk první části .db "POCET BITU: ",0 pop psw ; obnovit číslo "levelu" adi 8 ; číslo 0..8 převést na 8..16 mov h,a ; a provést BCD korekci xra a dad h dad h dad h dad h adc a daa dad h adc a daa dad h adc a daa dad h adc a daa dad h adc a daa call prevo1 ; tisk délky registru 8..16 call prtstg ; tisk druhé části popisu .db 0dh," " .db "STISKNI LIBOVOLNOU KLAVESU",0 ret ; *********************************** ; Tisk textu za volací instrukcí CALL ; *********************************** prtstg: xthl ; HL = adresa za CALL mov a,m ; načíst z ní znak inx h ; a posunout se za něj xthl ; HL uložit zpět do zásobníku ana a ; test znaku rz ; je-li 00h => konec tisku call prtout ; jinak ASCII znak vytisknout jmp prtstg ; a načtení dalšího znaku ; ******************************** ; Inverze pixelu dle obsahu rndnum ; ******************************** pixel: lhld rndnum ; H = souřadnice Y pixelu mvi h,0 ; L = souřadnice X pixelu mov b,h mov c,l ; následuje výpočet adresy inx h ; videoram a bitové masky mov e,l ; pro souřadnice pixelu X,Y mov d,h ; což jsou hodnoty reg. HL dad h ; a to je generované číslo.. dad h dad d ; procedura převzata dad h ; z BIOSu PMD 85-2 dad h dad d dad h dad h dad d mvi a,0feh ana h rrc mov e,a add a add e add a sub c cma inr a mov c,a mvi d,0c0h inr e inr e lxi h,bitpos dad b mov b,m lhld rndnum+1 mvi h,0 dad h dad h dad h dad h dad h dad h dad d mov a,m ; finální inverze pixelu xra b ; na vypočtené adrese mov m,a ret bitpos: .db 01h,02h,04h,08h,10h,20h ; bitové masky rndnum: .dw 1 ; poslední vygenerované číslo .end