* 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
@Zbych, post #1
@Krashan, post #2
@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 ?
@Zbych, post #5
move.l (oldVERTB),-(sp) rts
@Zbych, post #7
@asman, post #9
@Zbych, post #10
; 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