1 Ostatnio edytowany przez Hans 2004 (2020-05-03 13:34:05)

Program pod dos-a na PC. Służy do zgrywania obrazów dyskietek z Atari. Podłączenie jest prostym kabelkiem do portu LPT (bez dodatkowej elektroniki).

Jakieś 20 lat temu znalazłem ten program i próbowałem go użyć na 486DX80 oraz pentium 100 - na obu stacja ani drgnęła. Autor programu testował program tylko na procesorze 33Mhz.

Przypomniałem sobie o tym programie i sprawdziłem dlaczego nie działał.Podłączyłem więc oscyloskop do komputera aby zobaczyć co program wysyła. Okazało się że przebieg jest zbyt szybki niż powinien.
Winna była pętla opóźniająca - liczba pętli zawarta w zmiennej data_valid była tylko 8-bitowa, zwiększyłem ją do 16 bitów - program powinien działać dobrze na procesorach od 50 MHz do 2000 MHz.

Program działa w następujący sposób:

1.Pobiera status stacji
2.Wysyła Percom aby ustawić stację w podanej gęstości
3.Odczytuje pierwszy sektor
4.Pobiera Percom - sprawdza gęstość i ustala ile sektorów pobrać
5.Pobiera wszystkie sektory.


kompilowane borland c 3.1

option/ compiler / code generation  -> zaznaczyć unsigned character

Nie mam stacji do atari więc program testowałem poprzez sio2pc i trzy programy typu "ape". Przy okazji odkryłem że te programy źle wysyłają status (piąty bajt nie jest sumą czterech poprzednich a chyba powinien być.)

Aktualna wersja:
- nie mam pewności czy "Percomy" przełączą stację na odpowiednią gęstość. (nie testowałem na  prawdziwej stacji tylko na różnych "ape")
- może nie ściągnąć całej dyskietki w sytuacji gdy gęstość różni się od podanej
- po napotkaniu uszkodzonego sektora zapisuje wcześniejsze i dalej już nie czyta


UWAGA !!! port LPT należy stawić na SPP czyli "normal".

Dlaczego? 
Zapis i odczyt odbywa się na jednym i tym samym bajcie (port 37A) - odczyt polega na ustawieniu +5V na liniach i połączeniu ich do masy jeśli sygnałem jest zero.
W SPP popłynie 3mA a w nowszych ponad 40mA. Chodzi o to że w nowszych trybach wydajność prądowa jest większa (zastosowanie np. zasilanie kamery internetowej).

-----------------
Jest jeszcze wzorowany na tym programie odpowiednik pod linuxa , patrz psiox002.

http://umich.edu/~archive/atari/8bit/Di … /Transfer/

Nie działa po kompilacji poleceniem make - wisi (zbadałem tyle, że odczyt timera stoi w miejscu). Prawdopodobnie jest to spowodowane jednym z bugów gcc przy optymalizacji (-02).
Gdy skompiluję poleceniem gcc .... działa, a do tego program ma mniej bajtów.

Psiox dobrze działa do prędkości 38000 (2x) przy 3x jest przekłamuje odebrane odpowiedzi (invalid response).
Siocop19 działa dobrze na prędkości 3x 62000 do 65000.
Problem sprawia za to sio2pc przy prędkości 2x muli na co drugim sektorze (w 4.14i pomaga ustawienie T7 na 0000, w 4.19i już nie - pod psiox-em jest ok więc badam aktualnie co jest powodem)

Przerobiłem kabel, przeniosłem żyłę z pinu 17 na 11 aby odczyt był z portu tylko do odczytu (jest mniej błędów przy szybszym transferze no i bezpieczniej). Dopracuje oba programy i dołączę je niebawem.

Post's attachments

fotySC19.zip 374.71 kb, liczba pobrań: 14 (od 2019-03-18) 

siocop19.zip 26.89 kb, liczba pobrań: 13 (od 2019-03-15) 

Tylko zalogowani mogą pobierać załączniki.

2 Ostatnio edytowany przez seban (2019-03-19 13:45:29)

Dość ciekawe podejście do tematu :) Przyznaję że nie pomyślałbym nigdy o użyciu portu równoległego i "programowej" obsłudze transmisji szeregowej przy użyciu tego portu. Nie neguję rozwiązania... skoro działa i sprawdza się to czemu nie :)

Rozumiem że wybór LPT był spowodowany tym że nie trzeba było żadnej dodatkowej elektroniki w postaci translatora poziomów, a wystarczało tylko i wyłącznie podłączenie tego kilkoma przewodami?

Patrząc na kod... to więcej tam "in-line" asemblera niż kodu w C, ale to jak najbardziej rozumiem, większość kodu krytycznego czasowo inaczej napisać się nie dało :)

Fajnie że udostępniłeś ten kod, miło popatrzeć na źródła z przed lat, lata '90 w czystej postaci, aż się łezka w oku kręci :)

3 Ostatnio edytowany przez lemiel (2019-03-19 17:15:52)

Kiedyś takie coś uruchomiłem. W zbiorach leży kabel. Ale jaki soft do tego był nie pamiętam.

Edyta: A może to było SIO2LPT zamiast SIO2PC?

4 Ostatnio edytowany przez Hans 2004 (2019-08-21 23:39:51)

Byłem ciekaw dlaczego nie działa prędkość 3x. (w psiox002)

Po pierwsze - odczyt nie jest w połowie bitu tylko ... zależy od prędkości -przy  1x jest na początku,  2x,3x w połowie.
po drugie - (rozrzut jest taki że odczytuje sąsiednie bity).

ad1. - funkcja odczytu "sio_recv()" jest trochę źle napisana - obliczenie (TIMER_HZ/bps ... itd) odbywa się w czasie nadawania pierwszego bitu a zajmuje na tyle dużo czasu, że jest jak jest - przy prędkości 3x nie wyrabia się (takie moje podejrzenie). W sumie bez sensu bo to obliczenie powinno być tylko raz w programie.

ad2. - odmierzanie czasu jest przy pomocy timera 8253 - synchronizacja wymaga trzech odczytów timera a da się zrobić na jednym (jak wywaliłem "latch_timer" to już jako tako zaczęło działać)

Udało mi się zrobić wersję pod dos efekty takie same (1x,2x-ok; 3x-nie.)
Zrobienie finalnej wersji trochę mi zajmie (nie jestem programistą C) problem ciekawy, więc szkoda go zostawić nierozwiązanym)
EDIT. Zrobiłem wersję na której działa transfer x3.
(kilka filmików)

https://youtu.be/79BoW8t2M-k
https://youtu.be/QUZG_wrVmKg
https://youtu.be/zgazTumCeFg

https://youtu.be/iXJVnohFhdg

Pod Freedosem działa tak samo :)
-----------------------------------------------
Edit: Zrobiłem małe badania - chciałem sprawdzić czy da się odczytać dwa razy tą samą wartość timera a jak nie to ile potrwa jego odczyt.
Napisalem wiec kilka programow testujacych aby to sprawdzić .Programy testowe w laciek.zip. Można je odpalić pod cmd jak ktoś nie ma Dosa.

Wyniki sa nastepujace:
Metoda 3 -3 bajty:latch timer + 2 bajty - 4 do 6 okresow zegara, (tak jest w oryginalnym programie)
metoda 2  -2bajty:bez latch timer 3-4 okresow zegara       
metoda 1 - 1bajt :bez latch timer 1-2 (tzn. nastepna wartosc jest o 1 lub 2 mniejsza)
metoda 4 - 2 bajty- latch timer + bajt LSB 3-4 okresy zegara
Przy okazji okryłem ciekawe zachowanie gdy ustawimy timer na BCD a wpiszemy liczbe hex to...-po testujcie sami.
(lsbbcd.exe)
Napisałem więc wersje wykorzystujaca metode 1 i okazuje się że jest gorzej.Potem sprawdziłem czy zadziała metoda 2 - tez nie dobrze.(czesto checksum error lub long frame)
No to zrobilem inaczej latch timer+1 bajt(LSB) -(metoda 4 ) tu o dziwo odczyt byl lepszy -zdarzal
sie czasem long frame(131) lub short frame(1). Nie wiem dokladnie dlaczego te
błędy byly ale jak wywaliłem linię if timeout... i dalem timeout=2 to nagle problemy zniknęły.
Najpierw spróbowałem czy działa prędkość x3 - odbiór przez stacje jest tylko przy 21 tickach co odpowiada 56600 bps (57600 daje 20 a to juz nie działa). Pozostało więc uslalenie czasu oczekiwania na pierwsz bit wyszlo 12 albo 13. Na tych wartosciach da się ściągnąć cały dysk bez błędów. Były za to problemy z mniejszą predkoscią przy sposobie wymyslonym przez "Shaggiego"-  to "TIMER_HZ/(bps*4/3)"/*wait to center of next bit */
Nie wiem jak on ten wzór wymyślił może próbował, aż zacznie działać(patrz film 1. tu widac bylo ze odczyt jest na początku bajtu a nie w połowie).
Jeszcze dziwniejsze ze "bit0" 46 poltora bity jest mniejszy niz 62 i działa.
Postanowiłem sprawdzić zakres wartości na jakich będzie bezbłędnie działac - 46 jest na skraju bezpiecznego odczytu.
Taka sama tabelke zrobilem dla nowej mojej metody i wyznaczajac prostą wyszedl wzor do obliczenia "bit0".

Dlaczego nie działa metoda 1. nie wiem - ciekawostką jest, że da się złapać nieprawidłowe przejście - patrz program bezlatch.exe

Tabelka zawiera wartości wpisywane do Timera po lewej "prędkość odczytu" w nawiasie oczekiwanie na środek następnego bitu.
     Nowy        Stary   /wartości dla Amd-850MHz
60 [63-102]  [54-89]
61 [57-100]  [48-88]
62 [53-99]    [45-88]   19200 bps; jego program działał na 62[46]
63 [53-93]    [45-79]
64 [53-83]    [45-74]
65 [52-77]    [45-66]

30[27-38]   [16-28]
31[22-36]   [12-23]   38400
32[22-29]   [12-18]

21[12-13]     ------      56600 bps

Zrobiłem test na innym procesorze amd 3800+ i te wartości trochę odbiegają więc jeszcze mnie czekają dalsze testy tym razem na różnych sprzętach.

Post's attachments

bezlatch.jpg 275.1 kb, nikt jeszcze nie pobierał tego pliku. 

laciek.ZIP 39.36 kb, nikt jeszcze nie pobierał tego pliku. 

lsb.jpg 266.93 kb, nikt jeszcze nie pobierał tego pliku. 

psiox4dos.ZIP 25.61 kb, nikt jeszcze nie pobierał tego pliku. 

TEK0000.JPG 88.64 kb, nikt jeszcze nie pobierał tego pliku. 

TEK0003.jpg 93.25 kb, nikt jeszcze nie pobierał tego pliku. 

TEK0009.JPG 96.04 kb, nikt jeszcze nie pobierał tego pliku. 

z_latch.jpg 289.42 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.

5

Powodzenia, kibicuję.
Czy możesz też testować we FreeDOS?

<-- Kontakt przez "E-mail" gdyż albowiem moja skrzynka "PW" jest pełna i zaprawdę nie mam czego usunąć.

--== Kup Pan/i dyskietkę http://www.atari.org.pl/forum/viewtopic.php?id=18887 ==--