OldComp.cz

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


Právě je 17.06.2024, 09:10

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  Další
Autor Zpráva
PříspěvekNapsal: 05.11.2019, 03:46 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.06.2013, 20:26
Příspěvky: 2486
Has thanked: 116 times
Been thanked: 425 times
suksoft píše:
Nemas tam preklep? Ja bych misto $+2 instinktivne dal $+3 nebo radeji bych tam dal label. Asi tam mas takto NOP instrukci navic.

Já bych rozhodně radši použil label. Konstrukt $+n je podle mě jen výbornou příležitostí k zavlečení chyby, přičemž výsledný kód je přinejlepším stejný, jako když se použije label... :shrug:

_________________
"Je lepší rozsvítit byť jen malou svíčku, než jen proklínat temnotu." (Konfucius)

www.zxsparrow.com


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

Registrován: 16.06.2014, 12:23
Příspěvky: 3710
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 284 times
Se skokem JP nn používat label, trvá 3 M cykly, 10 T, skáče na abs adresu a následní instrukce je na $+3.
Skok JR e trvá také formálně také 3 M cykly, ale poslední je prázdý, takže v programu zabere 2 M, trvá celkem 12T a následní instrukce je na $+2.

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


Nahoru
 Profil  
 
PříspěvekNapsal: 05.11.2019, 11:26 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
zxcygnus píše:
...pro AS musí být $+3. Nedělalo by to nop, ale add a,b.

Pro Promethea +2 je asi ok, jinde ale +3. Mě to teda s +2 neukazuje navíc ADD A,B, ale drsnější JP PE,60719 a skočí. Takže Crash... ;-)

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
PříspěvekNapsal: 05.11.2019, 13:02 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3715
Bydliště: Bratislava
Has thanked: 374 times
Been thanked: 806 times
Preto je vzdy dobre skontrolovat vysledok prekladu, idealne priamo v protokole o preklade, ktory dokaze priamo generovat kazdy poriadny asembler:
Kód:
1     0000                      org     #8000
2     8000 AF           LOOP    xor     a         ;  4T
3     8001 ED 79                out     (c),a     ; 12T
4     8003 C3 06 80             jp      $+3       ; 10T
5     8006
6     8006 2F                   cpl               ;  4T
7     8007 ED 79                out     (c),a     ; 12T
8     8009 C3 00 80             jp      LOOP      ; 10T
9     800C
Hned vidno ze jp $+3 je prelozene ako C3 06 80, takze je jasne, ze bude skakat na adresu 8006.


Naposledy upravil Busy dne 05.11.2019, 13:03, celkově upraveno 1

Nahoru
 Profil  
 
PříspěvekNapsal: 05.11.2019, 13:03 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2398
Has thanked: 308 times
Been thanked: 649 times
No dobrá, dobrá... budu používat návěští. Stejně jsem tuhle konstrukci opsal od Busyho :P

Spíš mi řekněte, proč následující kód funguje a posílá správně byte rychlostí 57600bps i když by podle taktů a trvání instrukcí měl být o ždibec rychlejší. Výpočtem by měl bit trvat 61T. A opravdu to funguje, ověřil jsem analyzerem i cyklickým přenosem textu a kontrolou na PC. Leda snad, že bych něco pokazil při vkládání sem.
Kód:
                cpu     z80undoc
                org     32768                   ; musí běžet v rychlé RAM

START           di                              ; nesmí být zpomalováno a přerušováno
                ld      bc,65533                ; zvol registr 7 v AY
                ld      a,7
                out     (c),a
                ld      bc,49149                ; vypni zvuk a nastav I/O port jako výstup (bit 6 v log. 1)
                ld      a,255
                out     (c),a
                ld      bc,65533                ; zvol registr 14 v AY
                ld      a,14
                out     (c),a
                ld      hl,DATA                 ; data, která budeme přenášet
                call    AYSER_SENDBYTE          ; pošli data na která ukazuje hl
                ei                              ; před návratem do BASICu přerušení povol
                ret

DATA            db      01010101b

AYSER_SENDBYTE  ld      bc,49149                ; 10T   registr 14 pro výstup zvolen, budu do něj zapisovat
                ld      e,128                   ; 7T    E bude počítadlo, 8x rotovat, nastane carry
                ld      a,247                   ; 7T    do A 0b11110111 = TxD do log.0, protože start bit
                out     (c),a                   ; 12T   zde začíná start bit a zde začíná záležet na taktech
                ld      a,(hl)                  ; 7T    vezmi byte, který má být vyslán
                ld      d,a                     ; 4T
                ld      l,247                   ; 7T    a teď můžu L změnit, před zavoláním AYSER_SENDBYTE
                                                        bude muset být HL na zásobníku

; od outu       12+7+4+7 = 30T, k dalšímu outu následuje 28T = 58T

AYSER_SENDB_L   rrc     d                       ; 4T    rotuj data skrz carry flag
                jp      c,AYSER_SENDB_1         ; 10T
                ld      a,l                     ; 4T    do A 0 = TxD do log. 0
                jp      AYSER_SENDB_2           ; 10T

AYSER_SENDB_1   ld      a,b                     ; 4T    do A B = TxD do log. 1 (B = 0b10111111)
                jp      AYSER_SENDB_2           ; 10T

; od rrc, bit = 1       4+10+4+10 = 28T
; od rrc, bit = 0       4+10+4+10 = 28T

AYSER_SENDB_2   out     (c),a                   ; 12T
                rrc     e                       ; 4T
                jp      nc,AYSER_SENDB_L        ; 10T
                ld      a,255                   ; 7T    protože log. 1 do stop bitu i do RTS                                                                                                 
                jp      PRESKOC_1               ; 10T   zpoždění
PRESKOC_1       jp      PRESKOC_2               ; 10T   zpoždění
PRESKOC_2       nop                             ; 4T    zpoždění

; od minulého outu sem 12+4+10+7+10+10+4 = 57T                                                                                                                                               

                out     (c),a                   ; 12T   zde začíná stop bit 12+10+10+10+10+10=62T a ještě něco potom                                                                         
                jp      PRESKOC_4               ; 10T   zpoždění
PRESKOC_4       jp      PRESKOC_5               ; 10T   zpoždění
PRESKOC_5       jp      PRESKOC_6               ; 10T   zpoždění
PRESKOC_6       jp      PRESKOC_7               ; 10T   zpoždění
PRESKOC_7       ret                             ; 10T   zpoždění

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


Nahoru
 Profil  
 
PříspěvekNapsal: 05.11.2019, 13:10 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3715
Bydliště: Bratislava
Has thanked: 374 times
Been thanked: 806 times
Instrukcia rrc <8-bit-register> ma 8T.


Nahoru
 Profil  
 
PříspěvekNapsal: 05.11.2019, 13:24 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3710
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 284 times
Busy byl rychlejší :) Jenom RRCA trvá 4T.

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


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

Registrován: 29.06.2013, 16:52
Příspěvky: 1651
Has thanked: 33 times
Been thanked: 362 times
Jeste k tomu zpomalovani:
OUT 65533,xx ma A14=0 + A15=1, tedy ukazuje do hodni casti adresoveho prostoru 49152-65535, kde ma ZX128 obycejne strankovatelnou ramku. A zalezi tedy na tom, jestli je tam pomala ci rychla stranka pameti, podle toho je i tento port pomaly nebo rychly. Pokud nastrankujes rychlou ramku, port ti pojede vzdy rychle. Navic ikdyz pujde o pomaly port nebo pamet (v tom ZX nedela rozdil), zalezi take na tom, v jakem case instrukci spoustime. V dobe kdy ula kresli border, adresovy prostor neni zpomalovan a vsechny porty jedou rychle, stejne jako pristup do pameti. Ale kdyz ula kresli grafickou cast obrazu, adresovy prostor je opet zpomalovan.

Napriklad port 7FFD ma A15=0 a A14=1, coz ukazuje na pomaly adresovy prostor 16384-32767 a prace se strankovacim portem je pak zpomalovana (jen v dobe, kdy ula kresli grafiku). Na ZX128 a +2 jde diky neuplne adresaci nastavit A14=0 a strankovat treba zapisem na port 3FFD nebo 00FD a tim zcela obejit zpomalovani strankovaciho portu, ktery tak bude vzdy rychly, protoze A15=0 a A14=0.

To same pri praci s 8bit porty - zalezi na vyssich adresach kam ukazuji.

_________________
http://velesoft.speccy.cz/


Nahoru
 Profil  
 
PříspěvekNapsal: 06.11.2019, 15:58 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 919
Has thanked: 53 times
Been thanked: 231 times
zxcygnus píše:
Spíš mi řekněte, proč následující kód funguje a posílá správně byte rychlostí 57600bps i když by podle taktů a trvání instrukcí měl být o ždibec rychlejší. Výpočtem by měl bit trvat 61T.

Pri seriovej komunikacii by sa mala akceptovat odchylka rychlosti 3%, niektore USB2serial adaptery sa pohybujú niekde v tejto tolerancii.

Trochu Ti ten kod zjednodusim a sprehladnim
M1

Kód:
; --------------------------------------------
; odvysielanie bajtu z reg. A na seriovu linku
; rychlostou 57600 Bd, sirka bitu je 61T (odchylka 0,4%, realne 57377Bd)
; --------------------------------------------
T57k6:
;               DI
;               PUSH    HL              ; uloz registre
;               PUSH    BC
                LD      L, A            ; uschovaj datovy bajt
                LD      BC, 49149       ; out port
                LD      H, 8            ; odosiela sa 8 bitov
; start bit
                LD      A, 11110111b    ; start bit
                OUT     (C), A          ; na port               12T
                RLC     L               ; L.0 na L.2            16T
                RLC     L
; teraz sa odosle 8 datovych bitov
TXD1:           LD      A, 00h          ; tajming               14T
                LD      A, 00h         
                RLC     L               ; dalsi bit do L.3      8T
                LD      A, 11110111b    ; priprav masku         7T
                OR      L               ; vymaskuj              4T
                OUT     (C), A          ; posli na port         12T (spolu 61T)
                DEC     H               ; citac                 4T
                JR      NZ, TXD1        ; opakuj                12/7T
; a stop bit
                LD      A, (IX+0)       ; tajming               19T
                INC     HL              ; tajming               12T
                INC     HL
                LD      A, 11111111b    ; stop bit              7T
                OUT     (C), A          ; na port               12T (spolu opat 61T)
;               POP     BC
;               POP     HL              ; obnov registre
;               EI
                RET                     ; sirka stop-bitu vznikne automaticky
                                        ; z instrukcii PUSH, POP, CALL a RET
;
;
; --------------------------------------------
; odvysielanie bajtu z reg. A na seriovu linku
; rychlostou 115200 Bd, sirka bitu je 31T (odchylka 2%, realne 112903Bd)
; --------------------------------------------
T115k2:         
;               DI
;               PUSH    HL              ; uloz registre
;               PUSH    BC
                RLCA                    ; predrotuj data z A.0 do A.2
                RLCA
                LD      L, A            ; a uschovaj
                LD      BC, 49149       ; out port
; start bit
                LD      A, 11110111b    ; start bit
                OUT     (C), A          ; na port               12T
; teraz sa odosle 8 datovych bitov
                RLC     L               ; dalsi bit do L.3      8T
                LD      A, 11110111b    ; priprav masku         7T
                OR      L               ; vymaskuj              4T
                OUT     (C), A          ; posli na port         12T (spolu 31T)
               
                RLC     L
                LD      A, 11110111b
                OR      L
                OUT     (C)
               
                RLC     L               
                LD      A, 11110111b
                OR      L
                OUT     (C)
               
                RLC     L               
                LD      A, 11110111b
                OR      L
                OUT     (C)
               
                RLC     L               
                LD      A, 11110111b
                OR      L
                OUT     (C)
               
                RLC     L               
                LD      A, 11110111b
                OR      L
                OUT     (C)
               
                RLC     L               
                LD      A, 11110111b
                OR      L
                OUT     (C)
               
                RLC     L               ; dalsi bit do L.3      8T
                LD      A, 11110111b    ; priprav masku         7T
                OR      L               ; vymaskuj              4T
                OUT     (C), A          ; posli na port         12T
; este stop bit
                RCL     L               ; timing                12T
                NOP
                LD      A, 11111111b    ; stop bit              7T
                OUT     (C), A          ; na port               12T
;               POP     BC
;               POP     HL              ; obnov registre
;               EI
                RET                     ; sirka stop-bitu vznikne automaticky
;
; a to je vse, pratele!




Naposledy upravil Martin1 dne 06.11.2019, 16:38, celkově upraveno 1

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

Registrován: 22.05.2013, 21:14
Příspěvky: 3715
Bydliště: Bratislava
Has thanked: 374 times
Been thanked: 806 times
Pre inspiraciu, ja som kedysi na vysielanie 57600 Bd pouzival takuto rutinku.
Vstup je vysielany bajt v A, rutinka si sama spocitala a odvysielala aj paritu.
Vysielanie islo cez 8255 PC.3 vystupny bit.
Kód:
60     8051 f3         bytput di                       Odoslanie jedneho bajtu
61     8052 5f                ld   e,a                 57600 Bd ... 1 bit = 61.57 T
62     8053 0609              ld   b,9                 stop bity
63     8055 10fe              djnz #fe
64     8057 af                xor  a
65     8058 d35f              out  (#5f),a             start bit
66     805a c35d80            jp   $+3                 w
67     805d c36080            jp   $+3                 w
68     8060 00                nop                      w 24
69     8061 0608              ld   b,#08
70     8063 cb0b       bbpp1  rrc  e                   /
71     8065 9f                sbc  a,a
72     8066 e608              and  #08
73     8068 d35f              out  (#5f),a             \30
74     806a c36d80            jp   $+3                 w
75     806d 00                nop                      w
76     806e 00                nop                      w 18
77     806f 10f2              djnz bbpp1
78     8071 af                xor  a                   parita
79     8072 ab                xor  e
80     8073 3e08              ld   a,#08
81     8075 e27980            jp   po,bbpp2
82     8078 af                xor  a
83     8079 d35f       bbpp2  out  (#5f),a
84     807b c37e80            jp   $+3                 w
85     807e c38180            jp   $+3                 w
86     8081 c38480            jp   $+3                 w
87     8084 c38780            jp   $+3                 w
88     8087 00                nop                      w 44
89     8088 3e08              ld   a,#08               stop bity - na zaciatku
90     808a d35f              out  (#5f),a
91     808c c9                ret


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

Registrován: 16.06.2014, 12:23
Příspěvky: 3710
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 284 times
To je docela přehledné :)

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


Nahoru
 Profil  
 
PříspěvekNapsal: 06.11.2019, 16:37 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2398
Has thanked: 308 times
Been thanked: 649 times
Díky, přemýšlel jsem o tom, že kód zbavím smyčky, ale tohle mě nenapadlo.

Můžu to použít ve větším článku o ZX RS232 na svém webu? S uvedením autora pochopitelně, jen bych to okomentoval (takty ke každé instrukci), barevné zvýraznění syntaxe, proměřím a vyzkouším na šedé +2 a DG192k atd...

Jsem původně chtěl jen prozkoumat, jak to je s používáním I/O portu AY a jak se to prakticky chová, když se přepíná režim vstupů a výstupů. No a maličko se to rozrostlo, když jsem disassembloval RS232 ROM díky odkazu z webu Pavla Vymetálka.
danhard píše:
To je docela přehledné :)
Já už si to přeberu. Fórum nerado odsazení pomocí tabulátorů, v tagu PRE to bude ok.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 06.11.2019, 16:44 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 919
Has thanked: 53 times
Been thanked: 231 times
zxcygnus píše:
Můžu to použít ve větším článku o ZX RS232 na svém webu? S uvedením autora pochopitelně, jen bych to okomentoval (takty ke každé instrukci), barevné zvýraznění syntaxe, proměřím a vyzkouším na šedé +2 a DG192k atd...


Ak myslis moje, tak jasne.

M1
P.S. Preformatovane z Tab na medzery


Nahoru
 Profil  
 
PříspěvekNapsal: 06.11.2019, 16:50 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2398
Has thanked: 308 times
Been thanked: 649 times
Martin1 píše:
zxcygnus píše:
Můžu to použít ve větším článku o ZX RS232 na svém webu? S uvedením autora pochopitelně, jen bych to okomentoval (takty ke každé instrukci), barevné zvýraznění syntaxe, proměřím a vyzkouším na šedé +2 a DG192k atd...
Ak myslis moje, tak jasne.

M1
P.S. Preformatovane z Tab na medzery
jj, myslím, resp. oboje i Busyho, ozve-li se.

Vznikající článek je tady https://cygnus.speccy.cz/popis_zx-spect ... _rs232.php

Ještě zbývá hromada práce, aby to bylo zveřejnitelné (no a je to).


Zdar
Cygnus

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


Nahoru
 Profil  
 
PříspěvekNapsal: 06.11.2019, 18:40 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3710
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 284 times
Jak jsem psal, JR $+2 trvá 12T a zabírá v programu 2M, dalo by se to o 8 byte zkrátit :)

Také, kdyby jsi to jen vynopoval, tak je to kratší.

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


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