kategoria: Asembler
[#1] Dlaczego nie działą odczyt z dyskietki a z HD tak?
Już skończyły mi się pomysły i cierpliwość. Testuję to na WinUAE. Mam procedurę do odczytu plików i wszystko ładnie ale tylko gdy pliki czytam z HD, natomiast jak skopiuję na df0: i próbuję to samo to zawiesza się na dosowym wywołaniu Open a w emu wygląda tak jakby 3x czytał tą samą ścieżkę i się zatrzymywał. Początkowo próbowałem przed nazwą pliku dodać nazwę dysku ale to mi też działało tylko na HD, potem bez nazwy dysku i działa jeśli główny plik jest z tej samej lokalizacji odpalany co ładowane pliki ale też tylko na HD. Pomocy pls, bo już nie wiem czy to wina emu czy mój błąd w kodzie. Może muszę coś jeszcze włączyć w ITENA? Pod przerwania VB oczywiście jest podłączona moja procedura. Tak to wygląda:

* A0 - adres docelowy
* A1 - wskaźnik na nazwę
* A2 - opcjonalny adres docelowy do dekompresji (jeśli 0 plik nie jest dekompresowany)
* D0 - rozmiar bufora
LoadFile:
			move.w	#%1100000000101000,$9a(a6)	;włączenie portów i VBint
			move.l	d0,.fileSize
			move.l	a0,.destAddress
			move.l	a2,.decodeAddr
			lea		.fileName,a2	
			
.nmloop:	move.b	(a1)+,(a2)+ 				;kopiowanie nazwy pliku
			bne		.nmloop
			move.l	4.w,a6						;otwieramy bibliotekę DOS
			lea		dosName,a1
			jsr 	OldOpenLibrary(a6)			;open DOS			
			
			move.l	d0,dosBase
			move.l	d0,a6
			moveq	#0,d6					;rozmiar załadowanego pliku
			move.l	#.volumeName,d1			;nazwa pliku (przed nazwą pliku znajduje się nazwa dysku)
			move.l	#MODE_OLDFILE,d2		;mode_old - file must exist
			jsr		Open(a6)				;DOS Open()
			move.l	d0,d5					;copy file handle
.dupa	
		cmp.l	#$00,d0
		bne		.ok
		move.w	#$f00,$dff180				;błąd otwarcia pliku
		bra		.dupa
.ok:
			move.l	d5,d1					;filehdl
			move.l	d5,.fileHdl
			move.l	.destAddress,d2				;!dest address!
			move.l	.fileSize,d3		;!dest size!
			jsr		Read(a6)				;DOS Read() - D0 ilość odczytanych
......

.volumeName:	dc.b	"dyskietka:"
.fileName:		ds.b 32


Ostatnia aktualizacja: 09.09.2019 18:59:58 przez Zbych
[#2] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@Zbych, post #1

Musisz jeszcze włączyć przerwanie Disk Sync (bit 12 w INTENA). Inaczej Amiga nie jest w stanie poprawnie czytać danych z dyskietek.

Ostatnia aktualizacja: 09.09.2019 19:13:47 przez Krashan
[#3] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@Zbych, post #1

Nie wiem, czy dobrze zrozumiałem Twój problem, gdyż brakuje informacji. Chociażby takiej czy ubijasz system przed ładowaniem pliku, czy zmieniasz przerwania na własne, pod jakim kickiem testowałeś (wypadałoby przetestować pod 1.3, 2.0+, 3.0+). Nie wiem też jakie kanały DMA są aktywne podczas ładowania pliku i czy czasem nie zmieniałem adkcon. W jaki sposób podpiąłeś przerwanie VERTB czy za pomocą AddIntServer (w exec.library) czy może zmieniłeś adres autowektora $6c+vbr base. Jeśli w ten drugi, to jak kończysz przerwanie, tylko rte, wywalasz na stos starą wartość $6c, czy robisz jmp 0 i zmieniasz adres 0 na adres z $6c.

Tak z czystej ciekawości jakiego asemblera używasz ?
[#4] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@Krashan, post #2

Ruszyło kawałek dalej tzn. Open się powiodło ale wywaliło się na Read i pokazało guru. Czy Read ma jakieś ograniczenia w przypadku dyskietki (np. czy adres docelowy ma jakieś ograniczenie)? A może w DMACON też trzeba coś specjalnego ustawić (wcześniej ustawiam tam: move.w #%1000011111100000,$96(a6))?
[#5] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@asman, post #3

Nie wiem, czy dobrze zrozumiałem Twój problem, gdyż brakuje informacji. Chociażby takiej czy ubijasz system przed ładowaniem pliku, czy zmieniasz przerwania na własne, pod jakim kickiem testowałeś (wypadałoby przetestować pod 1.3, 2.0+, 3.0+). Nie wiem też jakie kanały DMA są aktywne podczas ładowania pliku i czy czasem nie zmieniałem adkcon. W jaki sposób podpiąłeś przerwanie VERTB czy za pomocą AddIntServer (w exec.library) czy może zmieniłeś adres autowektora $6c+vbr base. Jeśli w ten drugi, to jak kończysz przerwanie, tylko rte, wywalasz na stos starą wartość $6c, czy robisz jmp 0 i zmieniasz adres 0 na adres z $6c.

Tak z czystej ciekawości jakiego asemblera używasz ?


Chyba ubijam :) w sensie wyłączam przerwania itp. dokładnie używam MiniWrapper by Photon (http://coppershade.org/asmskool/SOURCES/Developing-Demo-Effects/DDE1/Coppershade-DDE1/)
Przerwania zmieniam na własne
Testowałem na 1.3 i 2.05 i 3.0
Co do DMA napisałem wcześniej
Przerwania podpinam przez move.l #VBint,$6c(a4) (A4 = 0)
Przerwanie kończe przez RTE nic więcej nie robię

Używam VASMa i VS Code
[#6] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@Zbych, post #5

Twoje podpięcie nie będzie działać z ładowaniem pliku. Być może zadziałało by z wyrzuceniem starego adresu przerwania na stos po zakończeniu Twojego przerwania ale tego nie testowałem.
Przerwanie musiałoby się kończyć w taki sposób
move.l	(oldVERTB),-(sp)
	rts

I po wykonaniu Twojego przerwania, wykonywane jest przerwanie systemowe. Ja uskuteczniam trochę inne podejście ( za pomocą AddIntServer na czas ładowania pliku tylko )
Przesłałem Ci na mejla (który wziąłem z profilu) mały projekt pod vasm który ładuje plik. Działa on tak.
ubija system
czeka na lewy myszki
Oddaje system
ładuje plik (robi też osflush więc dioda gaśnie - możesz sobie wyklikać w WinUAE w opcji Miscellaneous Keyboard LEDs i będziesz widział że plik się ładuje )
ubija ponownie
czeka na mysz
oddaje os i wychodzi do os.
Umożliwia on też podpięcie VERTB podczas ładowania pliku za pomocą AddIntServer a robisz to umieszczając adres procedury w ioVertbRoutine. Mam nadzieję że ogarniesz a jak nie to pytaj.
[#7] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@asman, post #6

Dzięki przyjrzę się tej procedurce.
[#8] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@Zbych, post #7

Nie ma sprawy, w razie niejasności pytaj.
[#9] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@Zbych, post #7

@Zbych
Mam nadzieję, że poradziłeś sobie z tym co Ci podesłałem.

Ja o czymś innym, w funkcji HwWaitTopOfFrame jest błąd - mimo że ta funkcja nie jest używana i stąd pewnie ten błąd. Piszę po to jakbyś zapragnął jej użyć to musi być najpierw beq a potem bne (chodzi o plik hw.s) a w źródłach, które Ci przesłałem jest odwrotnie.
[#10] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@asman, post #9

Finalnie użyłem mojego kodu z poprawkami (jak się chce żeby DMACON i INTENA miały konkretne ustawienia bitów to wypada żeby je najpierw wyzerować a potem ustawiać wartości, ot taki błąd początkującego). Wartości jakie ustawiam do DMACON i INTENA przed operacjami na dyskietce zapamiętuje tuż po uruchomieniu programu (zauważyłem że te domyślne wartości różnią się w zależności od wersji kickstartu).

Wykorzystałem natomiast Twoją podpowiedź odnośnie wywoływania starego wektora przerwania w przerwaniach VB, ale doszedłem eksperymentalnie że jest to wymagane tylko w przypadku kickstartu < 2.0, od wersji 2.0 wzwyż można całkowicie przejąć na własność przerwania VB bo wygląda na to że nie są one już używane podczas odczytu z dyskietki, dla kompatybilności wstecznej zostawiłem wywoływanie starego przerwania na końcu obsługi mojego. Nie testowałem jak jest z zapisem.

Ostatnia aktualizacja: 03.10.2019 15:53:48 przez Zbych
[#11] Re: Dlaczego nie działą odczyt z dyskietki a z HD tak?

@Zbych, post #10

Super, że Ci się udało. Mam tylko nadzieję że nie wywołujesz starego wektora przerwania za pomoca SMC, czyli że nie uskuteczniasz czegoś takiego - co można spotkać w niektórych produkcjach.

; przykład złego podejścia do wywołania starego wektora przerwań
; w a1 - VBR
 lea (skok+2)(pc),a0
 move.l $6c(a1),(a0)
 ;dalsza część

int:
; kod odpowiedzialny za przerwanie
; ...
skok: jmp $0


Jeśli chodzi o odczyt bądź zapis to pozostaje kwestia gaszenia diody we flopie - najlepiej użyj funkcji IoFlush, którą to Ci przesłałem między innymi. Możesz też podejść do tematu "po wiejsku" i odczekać jakiś czas, po skończeniu odczytu/zapisu a przed ponownym ubiciu systemu.
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