kategoria: AMOS
[#1] Amos i pliki w trybie binary
Czy da się jakoś w Amosie zapisywać/odczytywać pliki w trybie binary bajt po bajcie z pominięciem banków?
[#2] Re: Amos i pliki w trybie binary

@pong777, post #1

A próbowałeś Bload "ram:file.bin",_ADDRESS ?
Zmienna _ADDRESS to adres gdzie chcesz wczytać. Potem po wczytaniu możesz sprawdzić Peek czy to co odczytałeś zgadzię sie z zawartośćią pliku.
A do zapisu to Bsave "ram:file.bin",_BEGIN_ADR TO _END_ADR
[#3] Re: Amos i pliki w trybie binary

@asman, post #2

Rozumiem tak powinno iść.
A powiedzmy, że plik ma 10 MB, jest na dysku a ja chcę odczytać tylko 1024 bitów i to w dodatku ze środka tego pliku.
[#4] Re: Amos i pliki w trybie binary

@pong777, post #3

Jedyne co mi przychodzi do głowy to używanie funkcji z biblioteki dos.library za pomocą DOSCALL, do tego oczywiście jest potrzebna szczątkowa wiedza typu na temat funkcji: Open, Seek, Read, Close. Być może są jakieś rozkazy Amosa umożliwiające rozwiązanie tego problemu ale ja ich nie znam.
[#5] Re: Amos i pliki w trybie binary

@pong777, post #3

Zainteresuj się rozdziałem w helpie input/output i disc access. Da się, ale obsługa plików binarnych jest słaba. Działa to na zasadzie definiowania rekordów jako zmiennych tekstowych i wczytywania do nich danych.
[#6] Re: Amos i pliki w trybie binary

@cholok, post #5

Na temat rekordów czytałem książkę Prusika i Sypniewskiego.

Kto umie pisać extensiony do AMOSa?
[#7] Re: Amos i pliki w trybie binary

@asman, post #4

asman, wszędzie by dos.library używał

btw. moglibyśmy wszyscy wspólnie rozkminić wykorzystywanie dos.library w AMOSie, dużo spraw by to rozwiązało.

może tym sposobem:

Reserve As Work 1,_FILESIZE

Bload "ram:example.txt",1

_READ=Start(1)

_POS=4096 : _END=_POS+1024

For _START=_POS To _END
   
   _GET=Peek(_READ+_START)
   
   _OUT$=_OUT$+Chr$(_GET)
   
Next 

Print _OUT$ : Rem *** tu masz 1024 bajty od wskazanego miejsca w _POS


możesz też powrzucać do tablicy różne fragmenty. generalnie przykład pokazuje jak wyjąć z dowolnego miejsca pliku 1024 bajty, lub więcej lub mniej w zależności jak sobie poustawiasz.

Ostatnia aktualizacja: 14.07.2016 23:38:54 przez groovebox
[#8] Re: Amos i pliki w trybie binary

@groovebox, post #7

Problem w tym, że filesize może być np. 10MB.
Ja chcę się zmieścić z programem na A500 z 512k.
Dlatego nie wchodzi w grę ładowanie całego pliku do banku i jechanie po banku PEEK.

Ostatnia aktualizacja: 15.07.2016 00:05:22 przez pong777
[#9] Re: Amos i pliki w trybie binary

@pong777, post #8

Ok. kumam. Przejrzyj kod źródłowy DiscManagera. Tam są procedury od formatowania dysku i między innymi: TRACKOPEN, TRACKCLOSE, TRACKREAD, TRACKWRITE, TRACKCHECKSUM itd. Napisane są one przy użyciu "Equates" (odwołują się do bibliotek systemowych), ale jak od czegoś zaczynać to może właśnie od tego?
[#10] Re: Amos i pliki w trybie binary

@pong777, post #8

Nie rozumiem. Właśnie zobaczyłem do książki o AMOSie autorstwa Pawła Chadzińskiego no i nie widzę w czym problem. Wygląda na to, że AMOS ma wszystko co potrzeba.

Plik sekwencyjny do odczytu otwierasz za pomocą polecenia OPEN IN (do zapisu OPEN OUT), zaś przemieszczasz się do dowolnego jego miejsca za pomocą polecenia POF.

Odczytujesz za pomocą INPUT#, zapisujesz za pomocą PRINT# używając dowolnych zmiennych.

Ostatnia aktualizacja: 15.07.2016 00:22:04 przez Hexmage960
[#11] Re: Amos i pliki w trybie binary

@Hexmage960, post #10

no tak, ale Pong777 chciałby to robić na plikach przekraczających ilość RAMu, w deseń DiskEdit z FM2.2.
[#12] Re: Amos i pliki w trybie binary

@groovebox, post #11

Te polecenia nie wczytują pliku w całości tylko do wybranych zmiennych.

Składnia:
OPEN IN n,a$ - otwiera plik sekwencyjny do odczytu o nazwie a$ i przypisuje kanałowi n.
OPEN OUT n,a$ - j.w. tylko, że do zapisu
CLOSE n - zamyka plik przyporządkowany kanałowi
INPUT #n,a,b,c - czyta z pliku dane i wpisuje do zmiennych a, b, c.
PRINT #n,a,b,c - j.w., tylko że zapisuje
POF(n) = m - zmienia pozycję odczytu/zapisu z pliku przyporządkowanego kanałowi n na m znaków (bajtów).
[#13] Re: Amos i pliki w trybie binary

@Hexmage960, post #12

POF(n) - pozycja kursora
EOF(n) - sprawdzenie gdzie znajduje się koniec pliku
LOF(n) - sprawdzenie całkowitej długości pliku

nie ogarniam jak wyjąć żądany fragment np 256 bajtów ze środka pliku. chyba nie ta godzina na rozkminy.
[#14] Re: Amos i pliki w trybie binary

@groovebox, post #13

Robisz to tak jak opisał Hexmage. Otwierasz plik do odczytu i albo skaczesz od razu pod jakiś offset albo wyszukujesz odczytując kolejne porcje danych i porównując je z wzorem. Jak już masz swoje dane zlokalizowane to wczytujesz je pętlą FOR - NEXT albo inną do zmiennej, banku pamięci, na ekran czy gdzie tam chcesz. Na koniec zamykasz plik.
Trzeba pamiętać, że na A500 z 512kB RAM będzie to przeraźliwie wolne - i jeżeli jest taka możliwość to BLOAD działa zdecydowanie lepiej. Szkoda, że nie można zrobić BLOAD dla części pliku - bardzo uprościłoby to takie zabawy.
[#15] Re: Amos i pliki w trybie binary

@pong777, post #6

Na temat rekordów czytałem książkę Prusika i Sypniewskiego.


Przeczytałeś i zrozumiałeś czy przeczytałeś i dalej nie wiesz?
[#16] Re: Amos i pliki w trybie binary

@cholok, post #15

Sprawa jest prosta. Tak jak pisał Hexmage i Ocelot. Przy użyciu pętli FOR ... NEXT i POF(n) między nimi da się to teoretycznie zrobić. Teoretycznie dlatego, że praktycznie nie mam przy sobie w tej chwili AMOSa.
[#17] Re: Amos i pliki w trybie binary

@Hexmage960, post #12

Pliki sekwencyjne to nie jest to samo co pliki binarne.
Używamy:
Open Random n,files$
Field n,size1 As zmienna1$...
Pof(n) = position
Get n,m
Close n

Odczyta do zmiennej tekstowej od ustalonej pozycji zdefiniowaną ilość bajtów. Dostęp do danych jest poprzez peekowanie adresu zmiennej.
[#18] Re: Amos i pliki w trybie binary

@cholok, post #17

Z tego co wiem, to pliki sekwencyjne można otworzyć albo tylko do zapisu, albo tylko do odczytu. Pliki z dostępem swobodnym można czytać i zapisywać równocześnie.

Pliki sekwencyjne mogą składać się praktycznie z dowolnych zmiennych - nie ważne czy znakowych, czy binarnych. Pliki z dostępem swobodnym muszą składać się z rekordów.

Ostatnia aktualizacja: 15.07.2016 18:26:04 przez Hexmage960
[#19] Re: Amos i pliki w trybie binary

@Hexmage960, post #18

A teraz problem przy zapisie w trybie binarnym chcę np. wrzucić jakiś bajt do pliku na pozycję "gdzieśtam". Amos i tak doda na koniec linijki znak końca linii lub dwa... Można je sobie definiować ale da się pozbyć najwyżej drugiego znaku.
[#20] Re: Amos i pliki w trybie binary

@cholok, post #17

Sorki, nie używamy pof. Pozycję ustalamy poprzez rozmiary rekordów, co może stanowić problem przy dużym rozmiarze pliku.
[#21] Re: Amos i pliki w trybie binary

@pong777, post #19

To wynika z tego, że korzystasz z plików sekwencyjnych, które powinny być zawsze tekstowe, nie binarne.

Ktoś pomyślał i napisał ldos extension, gdzie to działa jak trzeba.

Ostatnia aktualizacja: 15.07.2016 18:53:39 przez cholok
[#22] Re: Amos i pliki w trybie binary

@cholok, post #21

Tak, masz rację. Nie wiedziałem, że pliki sekwencyjne są tylko w postaci znakowej.
EDIT: Chociaż, czy aby na pewno? Wtedy dlaczego POF umożliwia wybranie dowolnego bajta w pliku sekwencyjnym? To wskazywałoby na budowę binarną.

Nie mam w tej chwili dostępu do AMOSa by sprawdzić. Mam tylko książkę.

Ostatnia aktualizacja: 15.07.2016 19:13:23 przez Hexmage960
[#23] Re: Amos i pliki w trybie binary

@Hexmage960, post #22

Spokojnie można otwierać i czytać pliki binarne instrukcjami Open In i Input$(). Problem jest z zapisem. Print# zupełnie się do tego nie nadaje. Można sobie poradzić zapisując dane do pamięci (Reserve As Work i potem Poke) i zapisując na dysk instrukcją Bsave. Nie można w ten sposób niestety utworzyć pliku większego od rozmiaru największego wolnego bloku pamięci. Działa natomiast np. kopiowanie plików wykonywalnych. Być może można kilka plików binarnych łączyć ze sobą - jeszcze to sprawdzę.
[#24] Re: Amos i pliki w trybie binary

@Hexmage960, post #22

W takim razie odpowiedz:
input #1,zmienna$
Ile znaków zostanie wczytanych?
[#25] Re: Amos i pliki w trybie binary

@cholok, post #24

byte=Asc(Input$(1,1))

Zostanie wczytany 1 bajt.
[#26] Re: Amos i pliki w trybie binary

@Ocelot, post #25

Nie o to pytałem? Input$ a Input to dwie różne funkcje. Akurat Input$ działa inaczej, bo podajemy rozmiar.
[#27] Re: Amos i pliki w trybie binary

@cholok, post #26

Sądzę, że w tym przypadku wczyta znaki aż do napotkania znacznika końcu ciągu czyli 0. Ale w tym przypadku zgaduję. Najlepiej sprawdzić w AMOSie.
Przecież:

INPUT #1,a

nie wczyta ciągu tekstowego złożonego z cyfr, a następnie skonwertuje do liczby, tylko wczytuje liczbę w postaci binarnej (pewnie rozmiar to rozmiar zmiennych w AMOSie).
Czyli nie działa jak:

scanf("%d", &a);

tylko jak:

fread(&a, sizeof(int), 1, f);

w języku C. A o to się rozchodzi.
[#28] Re: Amos i pliki w trybie binary

@Hexmage960, post #27

Akurat wczyta liczbę w postaci tekstowej. Nie chce mi się już polemizować na zgadywanki. Rozwiązanie zostało już podane, więc temat zakończony.
[#29] Re: Amos i pliki w trybie binary

@cholok, post #28

Akurat wczyta liczbę w postaci tekstowej.

Być może, ja też tak myślałem. Ale z tym POF to coś mi nie pasuje. Wiesz na 100%?

Ostatnia aktualizacja: 15.07.2016 21:03:36 przez Hexmage960
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem