Czy ktoś może mi pomóc w zakodowaniu zapisu na dyskietkę? Korzystam z procedury JSIOINT pod $E459. Z odczytem jest wszystko OK pod warunkiem, że w emulatorze Atari800Win Plus 4.0 jest włączona opcja SIO patch. Kiedy emulacja stacji dysków pracuje z rzeczywistą prędkością mogę czekać w nieskończoność i nic się nie załaduje. Większy problem jest z zapisem. Wykonuję program wg kodu:
lda #$31 sta $0300 lda #$01 sta $0301 lda #$50 sta $0302 lda #$80 sta $0303 lda <$4000 ;zapis obszaru od $4000 sta $0304 lda >$4000 sta $0305 lda #$08 sta $0306 lda <$100 ;długośc bloku 256 bajtów sta $0308 lda >$100 sta $0309 lda <$ff ;zapis na sektor nr 255 sta $030a lda >$ff sta $030b jsr $E459
Po skompilowaniu programu dane zapisują się tylko za pierwszym razem. Przy kolejnych próbach plik .atr się nie zmienia. Sprawdzałem datę modyfikacji i dane w miejscu tego sektora. Dyskietkę stworzyłem programem MakeATR jako DD (720 sektorów po 256 bajtów)
to raczej błąd tego emulatora, podobnie jest w basicu z próbą ponownego odczytu pliku z urządzenia H: przez procedurę ENTER lub BGET - jeżeli nie zmieni się jego data i wielkość to po pierwszym odczycie kolejne są "puste"
Może to rzeczywiście wina emulatora, ale oglądałem na nim różne demka i czytały wszystko bez względu na opcję SIO patch. Zapisywałem też fragmenty pamięci w TURBO DOS 2.5 jak i dane w Music Pro Tracker i wszystko było w porządku. Te dane były zapisywane plikowo, ale SIO to niższy poziom więc jakby emulator nie radziłby sobie z SIO to i z operacjami na plikach byłyby problemy.
A ustawiasz wszystkie parametry jeszcze raz (przed każdą operacją na dysku)? Z tego, co pamiętam, SO modyfikuje te parametry, więc za każdym razem trzeba je ustawiać od początku (nie wiem dokładnie, których to dotyczy, ale najlepiej jest wszystko inicjalizować). Tyle pamiętam.
A, i jeszcze masz błąd w miejscu: lda <$100 ;długośc bloku 256 bajtów sta $0308 lda >$100 sta $0309 lda <$ff ;zapis na sektor nr 255 sta $030a lda >$ff sta $030b Mianowicie, powinno być tam lda #0 sta $0308 lda #1 sta $0309 lda #$ff ;zapis na sektor nr 255 sta $030a lda #0 sta $030b
inaczej pobierasz dane z pamięci o adresie podanym w operandzie, a nie z operandu.
Pod QA/xasm/mads składnia < / > oznacza adresowanie natychmiastowe, więc jest ok. Jeśli działa pierwsza operacja, a następne nie, to najprawdopodobniek $303 jest zapisywany tylko przed pierwszą operacją, a powinien przed każdą, bo jest tam zwracany kod błędu.
Źle mnie zrozumieliście z tymi kolejnymi próbami. Ja za każdym razem uruchamiałem tą sama procedurkę (plik .XEX). Nie ryzykowałbym nie wpisując ponownie wartosci do komórek $03xx. Ale już wszystko jest jasne - po prostu emulator zapisuje obraz dysku w pamięci i od razu nie aktualizuje pliku .ATR. Dziekuję i pozdrawiam!