OldComp.cz

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


Právě je 19.04.2024, 21:40

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 17 ]  Přejít na stránku 1, 2  Další
Autor Zpráva
 Předmět příspěvku: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 10:15 
Offline
Stydlín

Registrován: 27.02.2023, 10:11
Příspěvky: 9
Has thanked: 0 time
Been thanked: 7 times
Ahojte,

volakedy davno som si na Foreveri poznacil tento kod, lebo robil nieco zaujimave a hlavne to mala byt celkom originalna metoda. Bohuzial som si nepoznacil, ze co. ;-)

Moja znalost Z80 assembleru je cista nula, ale skusil som tomu dat sancu cez prvy zoznam instrukcii, ktory som nasiel (bezvysledne).

Neviete mi niekto helpnut s vysvetlenim?


Přílohy:
IMG_20190316_114707.jpg
IMG_20190316_114707.jpg [ 47.8 KiB | Zobrazeno 1909 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 12:46 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3663
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 797 times
Jedna prosba: Prosim vzdy pri takychto otazkach ten kod normalne napis ako text. Nedavaj obrazky - jednak zbytocne zaplacavaju miesto na oldcomp-e, a dvak, ten kod sa z nich tazko copy-pastuje...

Tento kod na vstupe ocakava hodnoty v registroch B a C, urobi s nimi vypocet a vysledok bude v A a C. B bude na vystupe nulove.
Vypocet je nasledujuci: Uplne na zaciatku sa hodnota z C vlozi do A. B je pocet iteracii, na zaciatku kazdej iteracie sa od A odcita pocet kolko iteracii este zostava urobit. Ak bol tento pocet vyssi nez hodnota v A na zaciatku iteracie, tak sa zvysi o 1 cislo v C a pripocita k A. Potom sa tento postup opakuje tolkokrat, kolko iteracii treba urobit.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 12:51 
Offline
Stydlín

Registrován: 27.02.2023, 10:11
Příspěvky: 9
Has thanked: 0 time
Been thanked: 7 times
No, mal som to tiez ako fotku a ano, priznavam, nechcelo sa mi to prepisovat. :-) Ale beriem na vedomie.

Chapem to teda tak, ze z danej rutiny jej funkcionalitu vycitat nevies, lebo k hentomu zaveru som prisiel aj ja. :-P

Malo by to byt bud nieco na styl rychleho nasobenia proste nieco super-obvious, jeden z programatorov na Foreveri prezentoval ako super objav poslednych rokov.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 13:30 
Offline
Kecka
Uživatelský avatar

Registrován: 27.07.2021, 12:46
Příspěvky: 71
Bydliště: Valašsko
Has thanked: 8 times
Been thanked: 34 times
Tady je to polopaticky vysvětleno:

http://www.valachnet.cz/lvanek/diy/rc2014/elzet/

elzet1.pdf strana 102-103

_________________
RC2014 Pro, RC2014 LittleBro, RC2014 Zed, RC2014 Mini


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 13:58 
Offline
Stydlín

Registrován: 27.02.2023, 10:11
Příspěvky: 9
Has thanked: 0 time
Been thanked: 7 times
Asi som to zle formuloval - ja samozrejme rozumiem, co tie instrukcie robia (programujem v assembleri bezmala 20 rokov, len nie Z80), cize to som si nastudovat vedel.

Ale nevedel som to z toho "prepisu" (ktory aj Busy / flyingbird poskytujete), pochopit, cize som dosiel k zaveru, ze to bude asi az moc vychytrala rutina, kde treba poznat jemnejsie nuansy na pochopenie.

Napr ak by som videl rutinu na rychle nasobenie, tak to spoznam ihned, aj keby to bolo Z80. Ale tu pozeram a nechapem, vobec netusim, co ta rutina moze robit.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 14:41 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3663
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 797 times
mikro píše:
jeden z programatorov na Foreveri prezentoval ako super objav poslednych rokov.
Ktory ? Nepametas sa ? Na Foreveri sa ti najlepsi programatori obvykle pozname, tak by sme sa ho mohli spytat :)

V kazdom pripade, program sem hod ako text, vyskusame ho a uvidime, ci sa tie vysledky nebudu na nieco podobat.

(inak uz tusim co by to mohlo robit)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 14:48 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3663
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 797 times
flyingbird píše:
Tady je to polopaticky vysvětleno:
Tam ziadne polopatisticke vysvetlenie vyznamu tejto rutinky nevidim... :shrug:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 16:17 
Offline
Profík

Registrován: 28.07.2018, 14:37
Příspěvky: 923
Has thanked: 43 times
Been thanked: 411 times
Nebude to část aproximace sinusovky?

Kód:
   .org 0

   mvi a,1ch   ; CLS
   call 8500h

   mvi b,1      ; FOR X = 1 to 127
   mvi c,128   ; parametr

Cykl   push b

   mov h,b      ; X

   mov a,c
L1   sub b
   jnc L2
   inr c
   add c
L2   dcr b
   jnz L1

   mov l,c      ; Y
   call pixadr   ; vypočítat adresu a bitovou masku
   ora m      ; - na vypočtenou adresu zapíšu
   mov m,a      ;   masku (funkce OR zachová okolí)

   pop b
   inr b
   jp Cykl
   ret

   #include "L01_pixadr.asm"

   .end


Přílohy:
graf.png
graf.png [ 1.15 KiB | Zobrazeno 1805 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 16:51 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1114
Has thanked: 100 times
Been thanked: 160 times
Oftopic alert!

flyingbird píše:
Tady je to polopaticky vysvětleno:

http://www.valachnet.cz/lvanek/diy/rc2014/elzet/

elzet1.pdf strana 102-103


Vubec jsem to tam na tech poslednich stranach nenasel. Ale zaujala me tahle cast na strane 102:
Kód:
------- Převedení programového řízení (větvění, skoky) ---------
        na adresu obsaženou:
- ve dvou spodních bajtech zásobníku ................. RET
- v reg.HL ........................................... JP (HL)
- v reg.DE ........................................... EX DE,HL
                                                       JP (HL)
- v index.reg. .......................... JP (IX); resp. JP (IY)
- ve dvou místech paměti ADR a ADR+1 ................. LD HL,ADR
                                                       JP (HL)
- v tabulce skokových adres (na vetupu reg.A obsahuje pořadové
číslo - počítáno od nuly - adresy v tabulce):
        LD HL,SKOTAB  ;Adresa tabulky do reg.HL
        ADD A,A       ;Pořadové číslo hledané adresy krát 2
        LD E,A        ;Přenos obsahu reg.A do reg.E
        LD D,00       ;Vynulování reg.D
        ADD HL,DE     ;Nalezení místa uložení hledané adresy
        LD E,(HL)     ;Přenos obsahu nižšího (do reg.E) a
        INC HL        ;vyššího (do reg.D) bajtu hledané adresy
        LD D,(HL)
        EX DE,HL      ;Výměna obsahů reg.DE s reg.HL
        JP (HL)       ;Skok na hledanou adresu
SKOTAB  DEFW NULTA    ;Tabulka skokových adres
        DEFW PRVNI
        DEFW DRUHA
        ...
-  (alternativa  předchozího  příkladu  s  použitím   programové
modifikace):
        LD HL,SKOTAB  ;Totéž jako výše
        ADD A,A
        LD C,A        ;Přenos obsahu reg.A do reg.c
        LD B,00       ;Vynulování reg.B
        ADD HL,BC     ;Nalezení místa uložení hledané adresy
        LD C,2        ;Inic.reg.C pro přenos 2 bajtů (B=0)
        LD DE,SKOK+1  ;Do reg. DE adresa o 1 vyšší než SKOK
        LDIR          ;Přenos na adresy SKOK+1 a SKOK+2
SKOK    JP 0000       ;Místo instrukce JP možno použít i CALL
  Pro vlastní přenos dat lze v tomto případě použít i jiný  sled
instrukcí, např.:
        LD C,(HL)
        INC HL
        LD B,(HL)
        LD (SKOK+1),BC

Prvne tam je chyba v casti
Kód:
- ve dvou místech paměti ADR a ADR+1 ................. LD HL,ADR
                                                       JP (HL)

melo tam byt
Kód:
- ve dvou místech paměti ADR a ADR+1 ............... LD HL,(ADR)
                                                       JP (HL)

Jednou tam uvadi registr malym pismenem C, ale to nevadi.

Proc tam pise ze jde pouzit i jiny sled instrukci? Kdyz to spocitame:
Kód:
        LD C,2        ; 2:7      Inic.reg.C pro přenos 2 bajtů (B=0)
        LD DE,SKOK+1  ; 3:10     Do reg. DE adresa o 1 vyšší než SKOK
        LDIR          ; 2:21/16  Přenos na adresy SKOK+1 a SKOK+2
                      ;[7:17+21+16=54]

oproti
Kód:
        LD C,(HL)     ; 1:7
        INC HL        ; 1:6
        LD B,(HL)     ; 1:7
        LD (SKOK+1),BC; 4:20
                      ;[7:40]

Tak druha varianta vzdy vyhrava!
Ke vsemu jde tu prvni vylepsit, protoze opakovani je pouze 2x
Kód:
        LD DE,SKOK+1  ; 3:10     Do reg. DE adresa o 1 vyšší než SKOK
        LDI           ; 2:16     Přenos na adresu SKOK+1
        LDI           ; 2:16     Přenos na adresu SKOK+2
                      ;[7:42]

V tomhle pripade lze posledni LDI optimalizovat trikem ktery jsem nasel teprve nedavno a obe varianty uz budou ekvivalentni.
Kód:
        LD DE,SKOK+1  ; 3:10     Do reg. DE adresa o 1 vyšší než SKOK
        LDI           ; 2:16     Přenos na adresu SKOK+1
        LD A,(HL)     ; 1:7
        LD (DE),A     ; 1:7      Přenos na adresu SKOK+2
                      ;[7:40]


A kdyz si spocitate cele varianty:
Kód:
        LD HL,SKOTAB  ; 3:10     Adresa tabulky do reg.HL
        ADD A,A       ; 1:4      Pořadové číslo hledané adresy krát 2
        LD E,A        ; 1:4      Přenos obsahu reg.A do reg.E
        LD D,00       ; 2:7      Vynulování reg.D
        ADD HL,DE     ; 1:11     Nalezení místa uložení hledané adresy
        LD E,(HL)     ; 1:7      Přenos obsahu nižšího (do reg.E) a
        INC HL        ; 1:6      vyššího (do reg.D) bajtu hledané adresy
        LD D,(HL)     ; 1:7
        EX DE,HL      ; 1:4      Výměna obsahů reg.DE s reg.HL
        JP (HL)       ; 1:4      Skok na hledanou adresu
                     ;[13:64]

Kód:
        LD HL,SKOTAB  ; 3:10     Totéž jako výše
        ADD A,A       ; 1:4
        LD C,A        ; 1:4      Přenos obsahu reg.A do reg.c
        LD B,00       ; 2:7      Vynulování reg.B
        ADD HL,BC     ; 1:11     Nalezení místa uložení hledané adresy
        LD C,(HL)     ; 1:7
        INC HL        ; 1:6
        LD B,(HL)     ; 1:7
        LD (SKOK+1),BC; 4:20
SKOK    JP 0000       ; 1:4      Místo instrukce JP možno použít i CALL
                     ;[16:80]

Tak ta samoprepisujici se je nejen nevhodna pro ROM, ale i delsi a pomalejsi... uf!

Pri blizsim pohledu zjistite ze pocita s tim ze SKOTAB muze lezet kdekoliv. Kdyby byla na sudych adresach tak nemusi resit 16 bitovy inc. A kdyby rovnou lezela na nulovem ofsetu tak
Kód:
        ADD A,A       ; 1:4
        LD ($+4),A    ; 3:13     změna offsetu načítané adresy
        LD HL,(SKOTAB); 3:16     SKOTAB ma nulovy offset
        JP (HL)       ; 1:4      Skok na hledanou adresu
                      ;[8:37]
ORG 0x8000
SKOTAB

Pokud je to prilis tezka podminka tak staci aby nedelila segment
Kód:
        ADD A,A         ; 1:4
        ADD A,low SKOTAB; 2:7      vlastne to low je zbytecne protoze se to stejne orizne
        LD ($+4),A      ; 3:13     změna offsetu načítané adresy
        LD HL,(SKOTAB)  ; 3:16     SKOTAB ma nulovy offset
        JP (HL)         ; 1:4      Skok na hledanou adresu
                       ;[10:44]
ORG 0x8033
SKOTAB

To se da osetrit snadno pres makro, aby se pripadne na zacatek dala vypln. Tehdy asi rucne.

Velka skoda ze Ladislav Zajicek umrel. :/ Bylo by zajimave a inspirujici si s nim promluvit.

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 17:21 
Offline
Profík

Registrován: 28.07.2018, 14:37
Příspěvky: 923
Has thanked: 43 times
Been thanked: 411 times
Ještě k vlastní funkčnosti toho kódu. Protože se jedná o výpočet iterační, lze jednotlivé pixely křivky "vypočítávat" na základě znalosti pixelu předešlého jen jedním průchodem smyčkou a není zapotřebí celý výpočet nechat proběhnout od min do max.

S využitím výše uvedeného lze kreslení části sinusovky zrychlit:

Kód:
; *****************************************
; Iterační varianta výpočtu části sinusovky
; verze pro PMD-85
; *****************************************

        .org 0

        mvi a,1ch       ; CLS
        call 8500h

        mvi b,1         ; FOR X = 1 to 127
        mvi c,128         ; parametr
        lxi h,0e000h    ; ekvivalent bodu [0,0]
        mvi d,1         ; bitová maska uvedeného bodu
        lxi sp,64       ; přírůstek dY

        mov e,c         ; akumulátor
Cykl    mov a,e
L1      sub b
        jnc L2
        inr c           ; při přetečení Y:=Y+dY
        add c
        dad sp

L2      mov e,a
        mov a,m         ; vykreslit pixel [x,y]
        ora d
        mov m,a

        mov a,d         ; X:=X+1
        add a
        ani 3fh
        jnz L3
        inr a
        inx h
L3      mov d,a

        inr b           ; další bod sinusovky
        jp Cykl
        jmp $           ; hotovo...

        .end


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 20:13 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Tak ten neznámý kód by mohl počítat aproximaci pro sqrt( b*b + c*c ).

Výsledek neznámé funkce (v registru c).
Kód:
    0  1  2  3  4  5  6  7  8  9 10
    :  :  :  :  :  :  :  :  :  :  :
 1: 1, 1, 2, 3, 4, 5, 6, 7, 8, 9,10
 2: 1, 2, 3, 3, 4, 5, 6, 7, 8, 9,10
 3: 1, 3, 4, 4, 5, 6, 6, 7, 8, 9,10
 4: 1, 2, 5, 5, 6, 6, 7, 8, 9,10,10
 5: 1, 2, 6, 6, 6, 7, 8, 8, 9,10,11
 6: 1, 2, 3, 7, 7, 8, 8, 9,10,11,11
 7: 1, 2, 3, 5, 8, 9, 9,10,11,11,12
 8: 1, 2, 3, 4, 9,10,10,11,11,12,13
 9: 1, 2, 3, 4, 6,10,11,11,12,13,13
10: 1, 2, 3, 4, 5, 7,12,12,13,13,14
Očekávaný výsledek pro sqrt( b*b + c*c ), zaokrouhlený na celé číslo.
Kód:
    0  1  2  3  4  5  6  7  8  9 10
    :  :  :  :  :  :  :  :  :  :  :
 1: 1, 1, 2, 3, 4, 5, 6, 7, 8, 9,10
 2: 2, 2, 3, 4, 4, 5, 6, 7, 8, 9,10
 3: 3, 3, 4, 4, 5, 6, 7, 8, 9, 9,10
 4: 4, 4, 4, 5, 6, 6, 7, 8, 9,10,11
 5: 5, 5, 5, 6, 6, 7, 8, 9, 9,10,11
 6: 6, 6, 6, 7, 7, 8, 8, 9,10,11,12
 7: 7, 7, 7, 8, 8, 9, 9,10,11,11,12
 8: 8, 8, 8, 9, 9, 9,10,11,11,12,13
 9: 9, 9, 9, 9,10,10,11,11,12,13,13
10:10,10,10,10,11,11,12,12,13,13,14


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 27.02.2023, 20:42 
Offline
Profík

Registrován: 28.07.2018, 14:37
Příspěvky: 923
Has thanked: 43 times
Been thanked: 411 times
Výše uvedená odmocnina z (B^2 + C^2) je implicitní rovnice kružnice, z toho pak pro parametrický růst B vychází souřadnice C (tedy kosinus úhlu). A protože kosinus je jen maskovaný sinus, asi výše uvedené příspěvky konvergují k tomu, že je to něco kolem funkcí sinus či kosinus. Záleží na fázovém posunu, od jakého úhlu ten sinus aproximujeme.

Nechal jsem běžet registr B od 1 do 127 a výslednou funkci (výsledek v reg. C) porovnal s fázově posunutým sinem. Odchylka kolísala od -2% do +2% (konkrétně -1..+1 pixel), což je na dvojí zaokrouhlování super výsledek. Ještě jsem měl podezření, že se jedná o aproximaci paraboly, ale tam už jsou odchylky neznámé funkce až 6%.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 28.02.2023, 12:45 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3663
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 797 times
lukz píše:
Tak ten neznámý kód by mohl počítat aproximaci pro sqrt( b*b + c*c ).
Presne toto som si myslel aj ja, ked som pisal ze uz tusim co to bude. Len som cakal pokym to sem mikro hodi ako plaintext, aby som to mohol overit (a rucne opisovat sa mi to nechcelo).

Totiz, uz na prvy pohlad bolo vidno, ze ta slucka funguje ako bresenhamov algoritmus - odcitava mensiu konstantu a ked vysledok pretecie, tak pripocita vecsiu konstantu. Akurat s tym rozdielom, ze jedna z konstant sa pri preteceni inkremetne - toto mi zase pripomenulo bresenhama pre kruznice (ktory som kedysi pouzival pre kreslenie kruznic a kruhov). Takze cela ta rutinka by mohla pocitat nieco, co sa tyka kruznice, napr. zo suradnic bodu na kruznici polomer tejto kruznice, alebo inymi (ucenymi) slovami napisane, velkost vektora kde vstupom su suradnice vektora.

Podla tych tabuliek, co tu dal lukz, ma ale male obmedzenie - vstupna suradnica v B nesmie byt vecsia, nez suradnica v C. Takze este pred touto rutinkou je vhodne porovnat suradnice a ak je B vecsie, tak ich vymenit. Vysledna velkost vektora je potom v C.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 28.02.2023, 16:27 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 902
Has thanked: 51 times
Been thanked: 230 times
Tak som kód odsimuloval na celom rozsahu B a C, ako aj naopak, C a B, výsledné hodnoty spojil, naimportoval do Excelu a zobrazenie zmenšil tak, až bol z toho obrazec, a vyšla z toho...

Označ text -->
....1/8 kružnice....
Teda lukz mal pravdu, kód počíta preponu pravouhleho trojuholnika

<-- až sem a uvidíš čo, ak to nevidíš na obrázku.


Přílohy:
fbc1.jpg
fbc1.jpg [ 30.69 KiB | Zobrazeno 1537 krát ]
fcb1.jpg
fcb1.jpg [ 42.02 KiB | Zobrazeno 1537 krát ]
what.zip [1.08 KiB]
50 krát
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Co robi tento kod?
PříspěvekNapsal: 01.03.2023, 12:06 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 902
Has thanked: 51 times
Been thanked: 230 times
Skúsil som zvizualizovať odchýlku skutočnej (zaokrúhlenej) hodnoty výsledku Pytagoroej vety od aproximačnej hodnoty získanej daným kódom. Žlté sú zhoda, zelené sa líšia o 1.
M1


Přílohy:
dfbc.jpg
dfbc.jpg [ 9.83 KiB | Zobrazeno 1479 krát ]
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ů: 17 ]  Přejít na stránku 1, 2  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 7 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