Archiwizowanie dyskietek by Jakub Husak 2012-07-22 22:46:32

Jakub Husak napisał:

Niegdyś wpadłem na pomysł (inspirowany listem atarowca, który chciał zgrać sobie dyskietki i ma stację, ale nie miał kabelka) aby stworzyć możliwość przeniesienia atarowskiej dyskietki na PC. Zadałem pytanie na forum. A na konkurencyjnym portalu rozwalił mnie xxl, który mniej więcej napisał tak: Co się pytasz, chcesz, to napisz!

Pomysł polegał na utworzeniu czegoś w rodzaju manetofonowego turbo. Jednak zwolniony z dekodowania w locie oraz korzystając z możliwości uzyskania sygnału bardzo dobrej jakości mogłem uzyskać znacznie większe prędkości transmisji. Problem jajka i kury został rozwiązany tak: napisać króciutki programik w Basicu ze wstawką maszynową, który zamieni dyskietkę w dźwięk :).

Zacząłem bawić się tym tematem. Najpierw przetestowałem różne metody zapisu kilku bitów na raz, ale to jednak ślepa uliczka - kondensatory robią swoje, a i program miał być możliwie krótki. Powróciłem więc do starej sprawdzonej metody - długości impulsu. Ta metoda przypomina w wielkim uproszczeniu radiowe FM. Zero logiczne to impuls długości trwania jednej linii ekranu (sta WSYNC), jedynka logiczna - 2 linie ekranu - trudno się pomylić przy dekodowaniu. Nie jest problemem wygenerowanie na Atari takich sygnałów, trzeba tylko wyłączyć wszelkie przerwania: CLI + zablokować NMI w ANTIC oraz wyłączyć ekran.

W rezultacie powstał możliwie jak najkrótszy programik w Basic i łatwo przepisywalny.

Programik disk2snd.bas:

0 . DISK2SND COPIER
1 . WITHOUT ANY CABLES.
2 . BY JAKUB HUSAK, DATE:07.2012
4 . JUST RETYPE THIS PROGGY,
5 . PUT THE DISK INTO DRIVE 1
6 . YOU WANT TO CONVERT TO XFD,
7 . ENTER NUMBERS AND RECORD
8 . OUTGOING NOISE ON PC, THEN
9 . SAVE AS WAV AND FEED THE PC APP
10 SUM=13218 : PLEN=145
11 POKE 65,0: DIM A$(4), B$(512)
12 FOR I=1 TO PLEN*2 STEP 4: READ A$: B$(I,I+4)=A$:N.I
13 FOR I=1 TO PLEN*2 STEP 2: VAL=(ASC(B$(I))-65)*16+
ASC(B$(I+1))-65:POKE 1536+(I-1)/2,VAL:SUM=SUM-VAL:N.I
14 IF SUM<>0 THEN ? "DATA ERROR": END
15 ? "START SEC?": I. SSEC
16 ? "END SEC?": I. ESEC
17 ? "SECT LEN [1]28/[2]56?":I. SLEN
18 FOR I=SSEC TO ESEC: ? "READING SECTOR: ";I,"ST: ";:
? USR(1543,I,I,128+(I>3)*(SLEN=2)*128): N.I
19 ? "OPERATION COMPLETED." : END
20 D. DBAB,FCEA,AIAE,BOKC,AGLN
21 D. AAAG,JNAA,ADGI,JNAI,ADMK
22 D. BAPD,CAFJ,OEIF,NFIE,NEBA
23 D. ABGA,HICA,FIAG,KJFH,IFDB
24 D. CAGI,AGKC,AJIN,AKNE,CAGC
25 D. AGNA,PICA,GFAG,KAAE,KJAI
26 D. IFHO,KJAD,IFHP,CAHG,AGOG
27 D. HPKM,AIAD,CAHG,AGKF,DBKA
28 D. AACA,HJAG,KAEA,KJCC,IMAO
29 D. NEIN,AANE,FIGA,JAAD,INAK
30 D. NEKF,DFCM,KJBP,EJAP,IFDF
31 D. INAK,NEIN,ABNC,MKGA,IILB
32 D. HOIF,DCBI,GFDB,CKGJ,AAIF
33 D. DBKC,AHAG,DCCA,GAAG,BAPJ
34 D. MAAA,NAOG,GA




Programik pobiera 3 liczby i uruchamia w pętli procedurkę czytającą sektor dyskietki oraz kodującą go na dźwięk (zgrzyty i piski). Osiągnięta prędkość przesyłu danych wewnątrz sektora to średnio 1.4 kB/sek (od 1kB/sek gdy są same FF, do 2 kB/sek, gdy same zera). Z ciekawostek - każdy zakodowany sektor ma sygnał pilotujący - 8 zboczy długości 3 linii ekranu. Dlaczego 3? Aby nie interferował się z odczytem z dyskietki pustych bajtów, których bity startu i stopu generują falę o długości niemal równej czterem liniom obrazu (w standardowej prędkości transmisji) - podszedłem do tematu zapobiegawczo, aczkolwiek w praktyce wyszło, że nie ma to znaczenia, ponieważ głośność sygnału właściwego jest dużo większa.

Dla ciekawskich zawartość linii data w formacie mads assembler (145 bajtów!):

OPT h-
org $607 - basic_entry + siotable
tmp = $32
vedge =$35
buffer =$408
seclen = DDEVIC+8
icl "atari.asm"
siotable
.by $31 $01 'R' $40
; +4
.wo buffer
; +6
.by 30
basic_entry
ldx #6
nsiotab
lda siotable,x
sta DDEVIC,x
pla
sta DDEVIC+8,x
dex
bpl nsiotab
jsr SIOV
sta $d5 ; 0
sty $d4 ; 1 if ok
spl:rts

sei
jsr nmi ; 1->NMIEN 0->DMACTL
loop:
lda #$57
sta chksum
jsr zero
ldx #9
nedge
sta WSYNC
jsr ledge
bne nedge
jsr edge

ldy #4
mwa #seclen $7e
jsr outsector

; lsb are the same, buffer one page further
inc $7f
ldy seclen
jsr outsector
lda chksum
ldy #0
jsr outbyte
ldy #$40
lda #$22
nmi sty NMIEN
sta DMACTL
cli
rts
cedge bcc edge
ledge sta WSYNC
edge:
lda vedge
; skip next two bytes
.byte $2C ; bit Q
zero:
lda #$1f
eor #$0f
sta vedge
sta WSYNC
sta AUDC1
dex
rts
outsector
dey
lda ($7e),y
outbyte
sta tmp
clc
adc chksum
rol
adc #0
sta chksum
ldx #7
loop2
asl tmp
jsr cedge
bpl loop2
cpy #0
bne outsector
rts


Na początku były 192 bajty, potem 179 (już news miał być opublikowany) i teraz 145 :) Mam nadzieję, bo nie testowałem, że będzie działał na innych SO, niż oryginalny, ponieważ wykorzystuje wartości w rejestrach po powrocie z SIOV. Jest pole do popisu:) a zatem... Konkurs! Za każde 2 bajty ukręcone powyższemu kodowi w asemblerze, przy zachowaniu pełnej funckjonalności, daję jedną gwiazdkę SZACUNU! Warunek: nie przenosimy nic do Basica.

Zakodowana dyskietka SD zajmuje czas około 2 minut, DD około 4,5 minuty. Można zapisać taką falę jako WAV mono 8 bitów, po zzipowaniu będzie miał 1-2 MB, można to wysłać komuś pocztą :). Uwaga! WAV może być mono lub stereo, 8 lub 16 bitów, bez kompresji (PCM), ale musi mieć 44.1 KHz.

Po stronie PC powstał programik - dekoder - nazywa się AuDecoder. Napisany we FreePascalu, działa pod MacOS X, Windows, a może też i pod Linuksem (nie pokusiłem się jeszcze o skompilowanie). Zawsze można uruchomić AuDecoder pod Wine :).



Dołożyłem wszelkich starań, aby WAV wrzucony do AuDecoder mógł mieć dowolną głośność. Taki rezultat osiągnąłem - jeśli ktoś utworzy obraz dyskietki, który nie wchodzi do AuDecoder, to proszę o przysłanie mi go do testów.

Program jest typu freeware. Można go sobie ściągnąć stąd. Uwaga! Wersja PC na razie jest bez podpisu, więc antywirusowe oprogramowanie może różne cuda z tym wyczyniać (włącznie z usuwaniem aplikacji z dysku :). Miłego użytkowania!
Kaz 2012-07-22 22:49:59

Swietny pomysl, sposobow przenoszenia danych nigdy za wiele.

tdc 2012-07-23 03:21:59

> A na konkurencyjnym portalu rozwalił mnie xxl, który mniej więcej napisał tak: Co się pytasz, chcesz, to napisz!

Co się pytasz, chcesz, to napisz! = napisz se

jhusak 2012-07-23 03:41:25

Se napisałem:)

Tdc 2012-07-23 03:41:55

Szczerze mówiąc to mi chyba bardziej by się przydała możliwość zgrania programu z pamięci gdy do komputera nie mam nic podłączone, a nie zgrywanie całej dyskietki sektor po sektorze. Kiedyś taka sytuacja była na party u Vasca, gdy napisałem jakiegoś gniota i podszedł Lotharek i mówi że podłączy sprzęt i zgram sobie to z pamięci (bo potrzebował mojego zasilacza czy coś innego). Ja powiedziałem no tak ale skoro nie mam dosa to i tak tego nie zgram na stację czy cokolwiek innego...

Potrzeby zgrywania wtedy nie było (coś na prędce z palca napisane), ale pewnie coś takiego by się przydało. Problemem jest tutaj program zgrywający, które trzeba samemu przepisać, a posiadając stację jak w powyższym przypadku to program można mieć zapisany na dyskietce.

Jakby taki program zapisać na carcie to po gorącym włożeniu carta i naciśnięciu resetu są jakieś szanse że pamięć RAM zostanie nienaruszona i będzie można zgrać program ;)

tdc 2012-07-23 04:15:49

Kuba, mi chodziło o to że od lat rozmawiamy o haśle "napisz se", a tu wreszcie hasło to trafiło na podatny grunt, usiadłeś i zapisałeś se;)
... a właściwie nam;)

xxl 2012-07-23 07:32:38

wydaje mi sie, ze cos innego napisalem a juz na pewno ze nie bylo to w tonie 'napisz se' :-)

xxl 2012-07-23 08:08:15

chwila. czegos nie rozumiem. po co przywracac wartosc w DMACTL, vblk samo to zrobi, usunac lda #$22, przeniesc sta DMACTL zaraz po SEI, a czy sume kontrolna nie mozlna liczyc standarsdowo? wydaje mi sie ze widzialem takie liczenie bez 'rol'

atarowiec 2012-07-23 08:09:22

Gdzie źródła w basicu (obraz ATR, XFD) ? Przecież nie będę tego przepisywał ! :) :) :) Na stronie projektu w pliku .bas brak wstawki asebmlerowej (DATA) :/ Tak ma być ?

atarowiec 2012-07-23 08:14:59

Czy nie lepiej uproscic procedure i zamiast podawac start,stop, etc, wybierac gestosc dyskietki SD, ED, DD ?

atarowiec 2012-07-23 09:34:35

Warto dopisać, że program będzie potrzebował bibl SDL.dll

jhusak 2012-07-23 09:44:32

@xxl, to było tak troszkę "po dziennikarsku" :) Ale to chyba fajnie być inhibitorem powstawania programów :) Można nie przywracać suma kontrolna specjalnie, aby się np. wszystko o bit nie przesunęło i dobrze się policzyło.
@atarowiec - źródła w basicu są w: 1. AuDecoder, 2: repozytorium. 3: tu na stronie. Jak chcesz ATR to sobie zrobisz :) Start stop etc... A jak niektórzy mają egzotyczne stacje? 360 KB, albo co lepsza 720 KB?

jhusak 2012-07-23 09:47:18

@xxl - napisałeś, cytuję:
quote (xxl):


jesli uwazasz, ze pomysl jest dobry to go realizuj; czekasz na czyjas aprobate?



No to ja to tak zrozumiałem :)

jhusak 2012-07-23 09:49:20

Tak, potrzebuje biblioteki SDL. Jednak pomyślę, aby nie potrzebował.

jhusak 2012-07-23 09:53:59

@xxl, faktycznie tu jest błąd z tym cli/sei, można tego w ogóle nie używać :) Słusznie, że nie rozumiesz :) Po optymalizacjach już oczopląsu dostawałem :)

atari 2012-07-23 10:06:13

Program miał być dla laików a wygląda na "dla idiotów".

pirx 2012-07-23 10:43:51

Na tym właśnie polega postęp. Nowoczesne komputery przenośne potrafią obsługiwać nawet jaszczurki: http://www.youtube.com/watch?v=cuFba9qqE84

A program jest totalnie czaderski.

Cosi 2012-07-23 10:59:19

W kodzie programu ukryte jest nieprzyzwoite słowo.

atarowiec 2012-07-23 11:24:26

pica ?

Cosi 2012-07-23 11:30:10

Nie, figa ;-P

atarowiec 2012-07-23 11:34:51

Pod Altirrą wklapełem kod wklejając linijka po linijce (PASTE) bezpośrednio do Basica linie programui zrobiłem sobie ATRa. Czy da się szybciej, tzn. wrzucić plik tekstowy bezpośrednio do Basica pod którymkolwiek z emulatorów ?

. 2012-07-23 11:44:36

atari800 da się uruchomić w trybie tekstowym i zrobić copy&paste. nie wiem czy również pod windowsem.

wtedy to tylko kwestia zapisania wyniku na jakimś nośniku.

atarowiec 2012-07-23 11:45:16

Rozumię, że działa w ED 40*26 (1040) / 128b ?

. 2012-07-23 11:45:35

a enter po przekodowaniu do atascii nie działa?

jhusak 2012-07-23 12:17:51

Przepraszam, myślałem, że wszyscy wiedzą o urządzeniu H6... Działa nawet bez dosa (atari800). Tak, działa w każdej ilości sektorów długość sektora 128 i 256 bajtów.

jhusak 2012-07-23 12:22:39

Faktycznie, gdyby w kodzie znalazło się słowo $28F0, to mogło by być kiepsko.

jhusak 2012-07-23 12:27:07

Człowiek chce, żeby kod się łatwo wpisywał, a ludzie zamiast klepać, to to czytają i się dopatrują jakiegoś ukrytego przesłania :P

atarowiec 2012-07-23 12:30:11

panie, nie dogodzisz...

atarowiec 2012-07-23 12:48:39

Jestem ciekawy ile osób to przeklepie bajt po bajcie :)

jhusak 2012-07-23 13:00:06

Te, do których adresowane jest to rozwiązanie :)

atarowiec 2012-07-23 13:50:12

tak czy inaczej programik jest sprytny i autorowi należy się Dziękuję ! :) Więc Dziękuję :)

uicr0Bee 2012-07-25 11:32:07

Domyślam się że dyskietek z zabezpieczeniami przed kopiowaniem nie da rady tym zrzucić i używać z dowolnym emulatorem?

pirx 2012-07-25 11:51:04

Spoko idą weak sectory - po prostu słabiej piszczy.

gregor 2012-07-25 11:56:01

Czy ktoś już testował ?

jhusak 2012-07-25 18:09:08

Pirx? Jak to?
Programik działa tak, że jeśli jest błąd (ST!=1) to nie enkoduje, czyli będzie pusty sektor.

jhusak 2012-07-25 18:11:30

Programik jest do zgrywania raczej własnych programów, żródeł, a te nie mają zabezpieczeń :) Jeśli coś istnieje w więcej, niż jednym egzemplarzu/kopii, to po co to archiwizować, skoro jest w necie? No, chyba, że nie ma.

pirx 2012-07-25 20:40:19

oj taki rozhermetyzowany żarcik ;]

jhusak 2012-07-25 22:08:25

....


Buhahahhahaha!