OldComp.cz

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


Právě je 18.04.2024, 17:27

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 156 ]  Přejít na stránku Předchozí  1 ... 6, 7, 8, 9, 10, 11  Další
Autor Zpráva
PříspěvekNapsal: 17.02.2020, 16:20 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 901
Has thanked: 51 times
Been thanked: 230 times
Busy píše:
Samozrejme s tabulkou by to bolo najrychlejsie, ale moznost tabulky spomenul Martin1 uz vo svojej povodnej otazke

Tabulka je super (v tomto pripade ma len 8 bytov). Ma to vsak aj svoje "ale", aby bola rychla, musi byt zarovana v pamati, a hlavne musi byt k dipozicii volny registrovy par, lebo odkladanie registrov by rychlost degradovalo.
Pri kresleni ciar vyuzivam A => 2^(7-A) iba na vykreslenie prveho bodu, pri kazdom dalsom kroku je to len jedna rotacia (pokial sa nevyuzivaju suradnice bodov, ale sa priamo modifikuje videoRAM adresa).
M1


Nahoru
 Profil  
 
PříspěvekNapsal: 17.02.2020, 18:23 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Ech pozde... .) Chtel jsem jen pripomenout ze ta tabulka fakt nevezme 256 bajtu.
Kód:
; ----------- nici B
    ld      B, A        ; 1:4
    ld      A, $01      ; 2:7
    rlca                ; 1:4
    djnz    $-1         ; 2:13/8
                        ; 6:23/8+(256+0+1+2+3+4+5+6)*17/8=(23+277*17)/8=591.5T
; ----------- nici B
    ld      B, A        ; 1:4
    inc     B           ; 1:4
    ld      A, $80      ; 2:7
    rlca                ; 1:4
    djnz    $-1         ; 2:13/8
                        ; 7:27/8+(0+1+2+3+4+5+6+7)*17/8=(27+28*17)/8=62.875T
; -----------
    add     A, A        ; 1:4
    add     A, A        ; 1:4
    add     A, A        ; 1:4
    or      $c7         ; 2:7
    ld      (lnset+1), A; 3:13
    xor     A           ; 1:4
lnset:
    set     0, A        ; 2:8
                        ;11:44T
; ----------- nici HL
    ld      L, A        ; 1:4
    ld      H, segment  ; 2:7       tabulka musi byt na adrese delitelne 256
    ld      A, (HL)     ; 1:7
                        ;12:18T
; -----------
    ld      (self+1), A ; 3:13
self:
    ld      A, (tab)    ; 3:13      tabulka musi byt na adrese delitelne 256
                        ;14:26T
; ----------- nici HL
    add     A, offset   ; 2:7
    ld      L, A        ; 1:4
    ld      H, segment  ; 2:7       tabulka muze byt kdekoliv, jen nesmi prelezt "segment"
    ld      A, (HL)     ; 1:7
                        ;14:25T
; -----------
    add     A, offset   ; 2:7
    ld      (self+1), A ; 3:13
self:
    ld      A, (tab)    ; 3:13      tabulka muze byt kdekoliv, jen nesmi prelezt "segment"
                        ;16:33T

; ----------- nici HL
    add     A, offset   ; 2:7
    ld      L, A        ; 1:4
    adc     A, segment  ; 2:7
    sub     L           ; 1:4
    ld      H, A        ; 1:4       tabulka muze byt kdekoliv
    ld      A, (HL)     ; 1:7
                        ;16:33T
A pokud to mas v kodu 2x, tak tabulku stale jen jednou...

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


Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 08:47 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
A este cisto do poctu:
Kód:
     add  a,low tabulka
     ld   (read+1),a
     adc  a,high tabulka
     sub  low tabulka
     ld   (read+2),a
read ld   a,(hocico)
Nemeni ziadne ine registre a tabulka moze byt kdekolvek, moze aj preliezt segment.
(PS (off-topic): Preco mi tento sposob programovania silno pripomina 6502 ?)


Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 14:48 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
To uz jsem tam nepsal protoze to "boli"... .) Jde to totiz napsat s danymi podminkami rychleji a kratsi.
Kód:
; -----------
    add     A, low tabulka  ;  2:7
    ld      (read+1), A     ;  3:13
    adc     A, high tabulka ;  2:7
    sub     low tabulka     ;  2:7
    ld      (read+2), A     ;  3:13
read:
    ld      A, (hocico)     ;  3:13
                            ; 23:60T
; -----------
    push    HL          ; 1:11
    add     A, offset   ; 2:7
    ld      L, A        ; 1:4
    adc     A, segment  ; 2:7
    sub     L           ; 1:4
    ld      H, A        ; 1:4       tabulka muze byt kdekoliv
    ld      A, (HL)     ; 1:7
    pop     HL          ; 1:10
                        ;18:54T
; ----------- nici HL'
    exx                 ; 1:4
    add     A, offset   ; 2:7
    ld      L, A        ; 1:4
    adc     A, segment  ; 2:7
    sub     L           ; 1:4
    ld      H, A        ; 1:4       tabulka muze byt kdekoliv
    ld      A, (HL)     ; 1:7
    exx                 ; 1:4
                        ;18:41T

Jinak by tech zpusobu bylo "nekonecne" mnoho. Pres switch. Nebo elegantne :D bez tabulek a posunu:
Kód:
R = 1;
if ( A & 0x04) R = 16;
if ( A & 0x02) R *= 4;
if ( A & 0x01) R *= 2;

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


Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 15:04 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
_dworkin píše:
To uz jsem tam nepsal protoze to "boli"... .) Jde to totiz napsat s danymi podminkami rychleji a kratsi.
Pokym v danych podmienkach nie je nepouzivanie zasobnika a alternativnych registrov :)
Napriklad SP moze zrovna ukazovat na nejake data, alebo ho mozem pouzit ako uschovu nejakej obecnej konstanty pretoze vsetky ostatne registre su obsadene (uz viackrat som tak urobil - na ZX a aj na PMD).


Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 16:12 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
challenge accepted!
Kód:
LD      ($+6), A    ; 3:13
LD      A, $80      ; 2:7
JR      $           ; 2:12
RRCA                ; 1:4
RRCA                ; 1:4
RRCA                ; 1:4
RRCA                ; 1:4
RRCA                ; 1:4
RRCA                ; 1:4
RRCA                ; 1:4
                    ;14:32+(0+4+8+12+16+20+24+28)/8=32+112/8=46T
Nejpomalejsi varianta je 60T. Ok, uznavam ze je to sice rychlejsi a kratsi, ale nema to zase vyrovnane casy. A pokud by nejcastejsi varianty vstupu nizsi hodnoty tak by se to muselo napsat jinak, pomaleji.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 17:05 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
A nebo jeste rychleji kdyz nechate udelat praci prekladac (funguje v prekladaci pasmo)
Kód:
    if ((low $) <= 256-8)
DATA:
        db      $01, $02, $04, $08, $10, $20, $40, $80
    endif
SHIFT:
    add     A, DATA%256 ; 2:7
    ld      (self+1), A ; 3:13
self:
    ld      A, (DATA)   ; 3:13
                        ;16:33T
    RET
    if not defined DATA
DATA:
        db      $01, $02, $04, $08, $10, $20, $40, $80
    endif
Funguje to, protoze ma rutina stejnou, nebo vetsi delku nez data. Pokud by to bylo soucasti kodu tak by se to muselo udelat trosku jinak.

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


Naposledy upravil _dworkin dne 18.02.2020, 17:06, celkově upraveno 1

Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 17:06 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
_dworkin píše:
A pokud by nejcastejsi varianty vstupu nizsi hodnoty tak by se to muselo napsat jinak
Napriklad tak ze by sa pouzilo XOR #07, LD A,#01 a opacne rotacie :)


Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 17:12 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Busy píše:
_dworkin píše:
A pokud by nejcastejsi varianty vstupu nizsi hodnoty tak by se to muselo napsat jinak
Napriklad tak ze by sa pouzilo XOR #07, LD A,#01 a opacne rotacie :)
Pekne. A ja premyslel jak vyresit to odcitani... .) A zda to neudelat spis skokem navic, neco jako
Kód:
...rrca
rrca
rrca
ret
skok_sem_navic:
jr $

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


Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 22:18 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
A jak toto funguje? To snad s ruznym "a" ma vždy jiny high-byte v instrukci ld a,(hocico), takze to potřebuje několik tabulek najednou?

Busy píše:
A este cisto do poctu:
Kód:
     add  a,low tabulka
     ld   (read+1),a
     adc  a,high tabulka
     sub  low tabulka
     ld   (read+2),a
read ld   a,(hocico)
Nemeni ziadne ine registre a tabulka moze byt kdekolvek, moze aj preliezt segment.


Nahoru
 Profil  
 
PříspěvekNapsal: 18.02.2020, 22:36 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2089
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 327 times
A je vstup, A je výstup. Pre lepšie vysvetlenie predpokladajme že je tabuľka na HL, potom:
Kód:
     add  a,low tabulka         -   spočíta A s L
     ld   (read+1),a            -   uloží L
     adc  a,high tabulka        -   pripočíta H, a +1 pokiaľ predošlé sčítanie pretieklo
     sub  low tabulka           -   odpočíta L, takže ostane H alebo H+1
     ld   (read+2),a            -   uloží H
read ld   a,(hocico)            -   z (HL) načíta A  <---sem sa ukladá H aj L

Tabuľka má 256 bytov a podľa vstupného A vyberie jeden byt z tabuľky. Snáď som to vysvetlil zrozumiteľne. Pokiaľ tomu niekto stále nerozumie, tak jeho problém. :twisted:

_________________
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: 18.02.2020, 22:55 
Offline
Kecálek

Registrován: 10.07.2014, 01:57
Příspěvky: 169
Has thanked: 25 times
Been thanked: 225 times
PotPalo píše:
A je vstup, A je výstup. Pre lepšie vysvetlenie predpokladajme že je tabuľka na HL, potom:
Kód:
     add  a,low tabulka         -   spočíta A s L
     ld   (read+1),a            -   uloží L
     adc  a,high tabulka        -   pripočíta H, a +1 pokiaľ predošlé sčítanie pretieklo
     sub  low tabulka           -   odpočíta L, takže ostane H alebo H+1
     ld   (read+2),a            -   uloží H
read ld   a,(hocico)            -   z (HL) načíta A  <---sem sa ukladá H aj L

Tabuľka má 256 bytov a podľa vstupného A vyberie jeden byt z tabuľky. Snáď som to vysvetlil zrozumiteľne. Pokiaľ tomu niekto stále nerozumie, tak jeho problém. :twisted:

omyl, problem je tvoj ;] "odpocita L, takze zostane H alebo H+1" nie je pravda, pretoze zostane H+A alebo H+A+1. len to sa snazil lukz povedat ;]


Nahoru
 Profil  
 
PříspěvekNapsal: 19.02.2020, 01:10 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2089
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 327 times
A vieš že máš pravdu? :D To A by to nemalo pripočítavať, je tam chyba.
Namiesto
Kód:
     adc  a,high tabulka        -   pripočíta H, a +1 pokiaľ predošlé sčítanie pretieklo
     sub  low tabulka           -   odpočíta L, takže ostane H alebo H+1
by tam malo byť
Kód:
     ld   a,0   (nie xor a, potrebujeme zachovať Carry)
     adc  a,high tabulka

_________________
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: 19.02.2020, 05:22 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
ub880d píše:
PotPalo píše:
A je vstup, A je výstup. Pre lepšie vysvetlenie predpokladajme že je tabuľka na HL, potom:
Kód:
     add  a,low tabulka         -   spočíta A s L
     ld   (read+1),a            -   uloží L
     adc  a,high tabulka        -   pripočíta H, a +1 pokiaľ predošlé sčítanie pretieklo
     sub  low tabulka           -   odpočíta L, takže ostane H alebo H+1
     ld   (read+2),a            -   uloží H
read ld   a,(hocico)            -   z (HL) načíta A  <---sem sa ukladá H aj L
Tabuľka má 256 bytov a podľa vstupného A vyberie jeden byt z tabuľky. Snáď som to vysvetlil zrozumiteľne. Pokiaľ tomu niekto stále nerozumie, tak jeho problém. :twisted:
omyl, problem je tvoj ;] "odpocita L, takze zostane H alebo H+1" nie je pravda, pretoze zostane H+A alebo H+A+1. len to sa snazil lukz povedat ;]
Ano, pravda je to, na to som zabudol. A mne bolo hned od zaciatku divne preco ma toto riesenie nikdy nenapadlo (a vzdy som pouzival poctive ld a,0 : adc a,high adr) - no proste pretoze nefunguje :)


Nahoru
 Profil  
 
PříspěvekNapsal: 25.02.2020, 06:57 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Jak nejlepe emulovat stinovy zasobnik na Z80?
Kód:
    ld      SP, HL      ; 1:6
    ld      SP, **      ; 3:10
    ld      SP, (**)    ; 4:20
    ld      SP, IX      ; 2:10
    ex      (SP), IX    ; 2:23
    ld      SP, IY      ; 2:10
    ex      (SP), IY    ; 2:23

    ld      (**), SP    ; 4:20
    ld      HL, **      ; 3:10
    ld      HL, (**)    ; 3:16   
    ld      (**), HL    ; 3:16
    ld      IY, **      ; 4:14
    ld      IY, (**)    ; 4:20   
    ld      (**), IY    ; 4:20   
    ld      IX, **      ; 4:14
    ld      IX, (**)    ; 4:20   
    ld      (**), IX    ; 4:20   
   
    add     HL, SP      ; 1:11   
    add     IX, SP      ; 2:15
    add     IY, SP      ; 2:15
    or      A           ; 1:4
    adc     HL, SP      ; 2:15
    sbc     HL, SP      ; 2:15
   
    inc     SP          ; 1:6
    dec     SP          ; 1:6
   
    ex      (SP), HL    ; 1:19
    ex      (SP), IX    ; 2:10
    ex      (SP), IY    ; 2:10

Musi se pohlidat kde budeme priste pouzivat stinovy zasobnik.
Kód:
    ld      HL, $0000   ; 3:10
    add     HL, SP      ; 1:11      save first
    ld      SP, second  ; 3:10      load second
...
    ld      (next+1), SP; 4:20      save second
    ld      SP, HL      ; 1:6       load first
...
    ld      HL, $0000   ; 3:10
    add     HL, SP      ; 1:11      save first
next:
    ld      SP, $0000   ; 3:10      load second
                        ; 7+5+7:31+26+31

Musi se pohlidat kde budeme priste pouzivat stinovy zasobnik.
Kód:
    ld      (next+1), SP; 4:20      save first
    ld      SP, second  ; 3:10      load second
...
    ld      (nxt2+1), SP; 4:20      save second
next:
    ld      SP, $0000   ; 3:10      load first
...
    ld      (nxt3+1), SP; 4:20      save second
nxt2:
    ld      SP, $0000   ; 3:10      load first
...
                        ; 7+7+7:30+30+30

Musi se pohlidat kde budeme priste pouzivat stinovy zasobnik.
Kód:
    ld      IX, $0000   ; 4:14
    add     IX, SP      ; 2:15      save first
    ld      SP, second  ; 3:10      load second
...
    ld      (next+1), SP; 4:20      save second
    ld      SP, IX      ; 2:10      load first
...
    ld      HL, $0000   ; 4:14
    add     IX, SP      ; 2:15      save first
next:
    ld      SP, $0000   ; 3:10      load second
                        ; 9+6+9:39+30+39

Musi se pohlidat jen konec, abychom skoncili na puvodnim a ne stinovem.
Kód:
    ld      HL, $0000   ; 3:10
    add     HL, SP      ; 1:11      save first
    ld      SP, second  ; 3:10      load second
...
    ld      ($+6), SP   ; 4:20      save new
    ld      SP, HL      ; 1:6       load old
    ld      HL, $0000   ; 3:10      load new=>old
...
    ld      ($+6), SP   ; 4:20      save new
    ld      SP, HL      ; 1:6       load old
    ld      HL, $0000   ; 3:10      load new=>old
                        ; 7+8+8:31+36+36

Musi se pohlidat kde budeme priste pouzivat stinovy zasobnik a i jak se posunul jeho ukazatel.
Kód:
                        ;           no save first, because it's pre-calculated
    ld      SP, second  ; 3:10      load second
...
                        ;           no save second, because it's pre-calculated
    ld      SP, ????    ; 3:10      load first
...
                        ;           no save first, because it's pre-calculated
    ld      SP, ????    ; 3:10      load second
                        ; 3+3+3:10+10+10

Pomale, ale snadne pro obcasne pouziti.
Kód:
                        ;           no save first, because it's pre-calculated
    ld      HL, second  ; 3:10      load second
...
    dec     HL          ; 1:6
    ld      (HL), D     ; 1:7
    dec     HL          ; 1:6
    ld      (HL), E     ; 1:7
...
    ld      (HL), E     ; 1:7
    inc     HL          ; 1:6
    ld      (HL), D     ; 1:7
    inc     HL          ; 1:6
                        ; 3:10      push 4:26, pop 4:26

Extremne pomala fce.
Kód:
; pollutes: DE, HL
EXSP:
    pop     DE          ; 1:10      ret
    ld      HL, second  ; 3:10
    ld      ($-2), SP   ; 4:20
    ld      SP, HL      ; 1:6
    ex      DE, HL      ; 1:4
    jp      (HL)        ; 1:4       = jp HL
                        ;11:54

Extremne pomala fce.
Kód:
; pollutes: none
EXSP:
    ld      ($+16), HL  ; 3:16      save HL
    pop     HL          ; 1:10      ret
    ld      ($+15), HL  ; 3:16
    ld      HL, second  ; 3:10
    ld      ($-2), SP   ; 4:20
    ld      SP, HL      ; 1:6
    ld      HL, $0000   ; 3:10      load HL
    jp      $0000       ; 3:10
                        ;21:98

Extremne pomala fce.
Kód:
; pollutes: HL
EXSP:
    pop     HL          ; 1:10      ret
    ld      ($+12), HL  ; 3:16
    ld      HL, second  ; 3:10
    ld      ($-2), SP   ; 4:20
    ld      SP, HL      ; 1:6
    jp      $0000       ; 3:10
                        ;15:72

Extremne pomala fce.
Kód:
; pollutes: DE', HL'
EXSP:
    exx                 ; 1:4
    ld      HL, second  ; 3:10
    ld      ($-2), SP   ; 4:20
    pop     DE          ; 1:10      ret
    ld      SP, HL      ; 1:6
    push    DE          ; 1:11
    exx                 ; 1:4
    ret                 ; 1:10
                        ;13:75

S pouzitim promenne v pameti. Musi se ohlidat aby na konci jsme skoncili na puvodnim zasobniku.
Kód:
    ld      ($+12), HL  ; 3:16
    ld      HL, (second); 3:16
    ld      (second), SP; 4:20
    ld      SP, HL      ; 1:6
    ld      HL, $0000   ; 3:10
                        ;14:68

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


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ů: 156 ]  Přejít na stránku Předchozí  1 ... 6, 7, 8, 9, 10, 11  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 8 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