[zxspectrum] Re: Variante 115200 di Luca?

  • From: Luca Alimandi <luca.alimandi@xxxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Sat, 29 Aug 2015 20:41:16 +0200

Il 29/08/2015 19:19, Enrico Maria Giordano ha scritto:

Durante la pizza Luca mi accennava ad un sistema per non srotolare le routine di ricezione a 115200. Mi potresti spiegare meglio così faccio qualche prova?

EMG


Se ho capito bene ti riferisci al fatto che avevo realizzato la routine di invio a 115200 mediante un loop anziché "srotolare" (credo intendi questo :-D ) le 8 chiamate in modo sequenziale.
Però tu stesso avevi detto che in invio non era un problema. Infatti in ricezione non ci sono riuscito perché il singolo loop dura troppo (mi ma servirebbero 4 miseri T-State in meno, porca miseria!... :-( Ma non c'è verso; è già ridotto all'estremo!!!). Un bit dovrebbe durare circa 30 T-State...

In ogni caso ecco il semplice listato:
Il primo pezzo non è altro che un loop infinito che riceve un carattere dal PC e glielo rimanda indietro (una sorta di ECO), che ho usato per effettuare i test.
In pratica con una console (tipo PuTTY, utilizzato come terminale su RS232) scrivevo sulla tastiera e rileggevo quello che avevo scritto sulla console.
Seguono le due routine di invio ("arrotolata") e quella di ricezione ("srotolata").

C'è anche una variante per la routine di ricezione "arrotolata", che sfrutta l'istruzione INI e funziona in questo modo: prima riceve gli 8 bit come 8 byte (a partire dalla locazione denominata "BITS"), quindi, a ritroso riprende i bit "veri" e "con calma" li parallelizza" in un unico byte. Funziona, ma non ha molto senso, perché, in definitiva riceve alla velocità corretta ma poi deve perdere più tempo a ricostruire il byte... Era solo una prova, ma te l'ho segnalata comunque.

START DI
XOR A
OUT (247),A
LD A,239
OUT (239),A
CALL RXD_A
CALL TXD_A
EXI EI
JR START
RET

TXD_A LD C,247 ; 7 T
LD D,1 ; 7 T
OUT (C),D ; START BIT 12 T = 26 T
CPL ; 4 T
LD B,8 ; 7 T
NOP ; 4 T
NOP ; 4 T
NOP ; 4 T = 23 T
LOOP2 OUT (C),A ; 8 BIT 12 T
RRCA ; 4 T
DJNZ LOOP2 ; 13/7 T = 29 T
LD A,0 ; 7 T
OUT (C),A ; 2 BIT STOP 12 T = 30 T
LD B,4 ; 7 T
LOOP3 DJNZ LOOP3 ; 13 T = 53 T
RET


RXD_A LD C,247
LOOP8 IN D,(C)
JP P,LOOP8
LD HL,BITS
INC D
LOOP9 IN D,(C) ; BIT 0 11 T
RL D ; 8 T
RRA ; 4 T
DEC DE ; 6 T = 30 T
IN D,(C) ; BIT 1 12 T
RL D ; 8 T
RRA ; 4 T
INC DE ; 6 T = 30 T
IN D,(C) ; BIT 2 12 T
RL D ; 8 T
RRA ; 4 T
DEC DE ; 6 T = 30 T
IN D,(C) ; BIT 3 12 T
RL D ; 8 T
RRA ; 4 T
INC DE ; 6 T = 30 T
IN D,(C) ; BIT 4 12 T
RL D ; 8 T
RRA ; 4 T
DEC DE ; 6 T = 30 T
IN D,(C) ; BIT 5 12 T
RL D ; 8 T
RRA ; 4 T
INC DE ; 6 T = 30 T
IN D,(C) ; BIT 6 12 T
RL D ; 8 T
RRA ; 4 T
DEC DE ; 6 T = 30 T
IN D,(C) ; BIT 7 12 T
RL D ; 8 T
RRA ; 4 T
CPL ; 4 T
RET ; 10 T = 38 T


N.B. Questa funziona ma non la uso, era solo una prova!

RXD_2 LD C,247
LD B,8 ; 7 T
LOOP7 IN D,(C) ; START BIT 12 T
JP P,LOOP7 ; 10 T
LD HL,BITS ; 10 T
NOP ; 4 T
LOOP6 INI ; 8 BIT 16 T
NOP ; 4 T
JP NZ,LOOP6 ; 10 T = 30 T
LD B,8 ; 7 T
LOOP5 DEC HL ; 6 7
RL (HL) ; 15 T
RLA ; 4 T
DJNZ LOOP5 ; 13/7 T
CPL ; 4 T
RET

BITS DEFS 8

--

|_ /-\

Other related posts: