OldComp.cz

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


Právě je 29.03.2024, 16:08

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 67 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5
Autor Zpráva
PříspěvekNapsal: 16.11.2019, 22:37 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2063
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
Keď už optimalizujete, napadá ma:
Vynechať slučku (JR ...) pre 8 bitov, namiesto toho to rozpísať pekne 8x pod seba. Získame takty z JR naviac, ktoré sa dajú využiť užitočnejšie. Potom do medzier namiesto čakacích inštrukcií možno rozdistibuovať také prkotinky ako INC IX, DEC DE, kontrolu DE na nulu, a pod. Prípadne to skombinovať, spraviť kratšiu slučku, plus rozpísať podľa potreby.

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
PříspěvekNapsal: 17.11.2019, 02:58 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2332
Has thanked: 303 times
Been thanked: 637 times
Rozvinutí cyklu není nutné. Dá se to zrychlit i bez toho, přikládám dvě skoro shodné varianty - 04 načítá rovnou do VRAM a i to funguje docela spolehlivě, 03 načítá do rychlé RAM a pak udělá ldir. Dvě varianty proto, abyste mohli do ZXS zkusit rovnou hotovou TAPku.

Funguje s tímto nastavením
Kód:
stty -F /dev/ttyS0 57600 cs8 clocal cread -cstopb -parenb -parodd -crtscts raw
takže s jedním stop bitem, jestli chápu -cstopb správně.

Se sekundární sadou registrů to jde o pár taktů rychleji než s IX.

Přesunul jsem dec de a inc de před cyklus, kde se jen čeká, zároveň jsem to čekání využil k nastavení sekundárního bc a hlavně snížení počítadla, odskok po načtení MSB jsem posunul co nejblíž in a,(c) a přeskakuju zbytečné čekání.

Přenesl jsem monoskop nejmíň 10x a zdá se ok. Teď už jen to ukončení, když nepřijdou data...

Resp. není tam žádná kontrola bloků a parity, takže se to dá poblbnout a poslat data tak, že se obrázek zobrazí chybně. Ale to už je další úroveň problému.


Přílohy:
04 pokus rovnou do VRAM.tar.bz2 [7.65 KiB]
349 krát
03 funguje a mozna rychlejsi.tar.bz2 [7.78 KiB]
371 krát

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS
Nahoru
 Profil  
 
PříspěvekNapsal: 17.11.2019, 08:33 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
zxcygnus píše:
Rozvinutí cyklu není nutné.

Přesunul jsem dec de a inc de před cyklus, kde se jen čeká, zároveň jsem to čekání využil k nastavení sekundárního bc a hlavně snížení počítadla, odskok po načtení MSB jsem posunul co nejblíž in a,(c) a přeskakuju zbytečné čekání.


Rozvinutie naozaj nie je nutné, je tam 21T rezerva v každom cykle, až na jednu výnimku a to načítanie MSB, kde sa tým skráti celková doba.
Tým som to zrýchlil tak, že by sa mala stihnúť aj kontola linky.

Mal si tam chybičku, posledný bajt Ti ignorovalo, zabudol si navýšiť počítadlo.

M1

Kód:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; k ukládání bude použit registr hl
RECEIVE57600    dec     hl                      ; 6T    bude zvýšeno během čekání
                inc     de                      ; 6T    dtto
                ld      bc,65533                ; 10T   datový port AY-3-8912 do BC

;kontrola jestli nezačal přenos - pak by byla špatně synchronizace se startbitem
RECEIVE_START   in      a,(c)                   ; 12T   čti port, nastaví sign flag dle MSB
                jp      p,RECEIVE_ERROR         ; 10T   chyba, RxD má být v log. 1 (klidový stav/stop bit)


; zpoždění detekcí 12+10 = 22T

; caka sa na start bit
RECEIVE_WFSB    in      a,(c)                   ; 12T   čti port
                rla                             ; 4T    bit 7 do carry flagu
                jp      c,RECEIVE_WFSB          ; 10T   opakuj do start bitu

; smyčka čekání 12+4+10 = 26T

; zacal start bit, pocka sa na bit 0
; dlzka cakania je zvolena tak, aby bit 0 bol niekde vo svojej polovici
; od hrany startbitu uplynulo najmenej 15T, najviac 41T, berieme priemer 28T
; treba este cakat 1.5 x 61T - 28T = 63.5T (z toho 11T na dalsiu instrukciu IN)

                dec     de                      ; 6T    sniž počítadlo bytů
                inc     hl                      ; 6T    zvyš adresu v RAM, kam se byte uloží
                exx                             ; 4T    sekundární sada
                ld      bc,65533                ; 10T   datový port AY-3-8912 do BC' (a zpoždění zároveň)
                inc     hl                      ; 6T    zpoždění
                dec     hl                      ; 6T    zpoždění
                ld      a,0                     ; 7T    zpoždění
                ld      h,7                     ; 7T    čte se 7+1 bytů

; 6+6+4+10+6+6+7+7 = 52T

; teraz je bit 0 niekde v polovici, mozme citat 7 krat s odstupom 61T

RECEIVE_LOOP    in      a,(c)                   ; 12T   nacitaj port
                rlca                            ; 4T    bit 7 do carry flagu
                rr      l                       ; 8T    buduj bajt v L
                dec     h                       ; 4T    pocitadlo
                ld      a,0                     ; 7T    zpoždění spolu 21T
                ld      a,0                     ; 7T    zpoždění
                ld      a,0                     ; 7T    zpoždění
                jr      nz,RECEIVE_LOOP        ; 12/7T  čti další bity

; 12+4+8+4+7+7+7+12 = 61T jedna smyčka

; načtení MSB
                ret     nz                      ; 5T    dočasování na 61T z cyklu, ret nikdy nenastane (možno použít i nop 4T)
                in      a,(c)                   ; 12T   načti port (MSB je někde v půlce trvání, do stopbitu cca 31 ± 13T ± 2T odchylka přesnosti 3%)
                rlca                            ; 4T    bit 7 do carry flagu
                ld      a,l                     ; 4T    téměř sestavený byte do A
                rra                             ; 4T    dočti MSB do A.7

; 12+4+4+4 = 24T

; konecne je cely bajt nacitany, treba ho len ulozit

RECEIVE_STOPBIT exx                             ; 4T    primární sada
                ld      (hl),a                  ; 7T    ulož byte do RAM
                ld      a,d                     ; 4T    vsetky data prijate?
                or      e                       ; 4T    skontroluj
                jp      nz,RECEIVE_START        ; 10T   cakaj na dalsi bajt
                ret                             ; 10T

; uložení bytu trvá 4+7+4+4+10 = 29T

; celkem 24+29=51T do skoku na detekci stavu linky (stopbit stále trvá)

; jinak lze rovnou čekat na další startbit


Nahoru
 Profil  
 
PříspěvekNapsal: 17.11.2019, 12:33 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2332
Has thanked: 303 times
Been thanked: 637 times
Martin1 píše:
Tým som to zrýchlil tak, že by sa mala stihnúť aj kontola linky.
Super, funguje spolehlivě.

Kdybych chtěl být extra puntičkář, tak by bylo fajn to ověřit analyzerem i s pohledem na signály BDIR, BC1, BC2, aby bylo vidět v který okamžik opravdu AY čte bity vůči TxD. Možná že časem udělám.
Martin1 píše:
Mal si tam chybičku, posledný bajt Ti ignorovalo, zabudol si navýšiť počítadlo.
inc de? Nezapomněl. Funguje to správně, jinak by se mi nepřenesl poslední atribut obrázku a viděl bych tam chybějící čtverec, To se nestává. Jen inc hl musí nastat až po uložení načteného bytu, dec de může nastat kdykoli před testováním na nulu.

Mimochodem, docela by mě zajímalo, jak by to asi vypadalo, kdyby každý program prošel podobnou optimalizací. Možná bychom se divili, jak třeba některé hry mohou běhat lépe.

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 17.11.2019, 12:36 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
zxcygnus píše:
Nezapomněl. Funguje to správně, jinak by se mi nepřenesl poslední atribut obrázku a viděl bych tam chybějící čtverec, To se nestává. Jen inc hl musí nastat až po uložení načteného bytu, dec de může nastat kdykoli před testováním na nulu.

Mimochodem, docela by mě zajímalo, jak by to asi vypadalo, kdyby každý program prošel podobnou optimalizací. Možná bychom se divili, jak třeba některé hry mohou běhat lépe.


Ano, chcel som to práve opraviť, ale si ma o 10 sekund predbehol, písal som to ráno, a ešte mozog nešiel na 100%.
Je to správne, to DEC DE je už vo vnútri cyklu.

M1


Nahoru
 Profil  
 
PříspěvekNapsal: 17.11.2019, 12:54 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
zxcygnus píše:
Mimochodem, docela by mě zajímalo, jak by to asi vypadalo, kdyby každý program prošel podobnou optimalizací.


A trochu vyčistený kód od toho RET NZ.

Kód:
                dec     h                       ; 4T    pocitadlo
                ld      a,0                     ; 7T    zpoždění spolu 21T
                ld      a,0                     ; 7T    zpoždění
                ld      a,r                     ; 9T    zpoždění
                jp      nz,RECEIVE_LOOP         ; 10T/10T   čti další bity

; 12+4+8+4+7+7+9+10 = 61T jedna smyčka

; načtení MSB
                in      a,(c)                   ; 12T   načti port (MSB je někde v půlce trvání, do stopbitu cca 31 ± 13T ± 2T odchylka přesnosti 3%)
                rlca                            ; 4T    bit 7 do carry flagu
                ld      a,l                     ; 4T    téměř sestavený byte do A
                rra                             ; 4T    dočti MSB do A.7

; 12+4+4+4 = 24T


Nahoru
 Profil  
 
PříspěvekNapsal: 17.11.2019, 19:15 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2332
Has thanked: 303 times
Been thanked: 637 times
Martin1 píše:
A trochu vyčistený kód od toho RET NZ.
Může být, vypadá to lépe. Jenom dec h musí být až po ld a,r, protože ld a,r nastavuje flag z/nz.

Mimochodem, zkusil jsem i s DG192k a ten se definitivně chová jinak. Ale musím koupit další konektory a možná se na to budu muset podívat osciloskopem, tzn. asi až příští sobotu, až vezmu DG do dílny. Mimochodem nefunguje ani sercp P.Vymetálka, problém je opravdu v hardwaru.

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


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ů: 67 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5

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 13 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