[#6]
Re: Jak odczytać listę urządzeń systemowych?
@asman,
post #5
asman napisał(a):
> Mógłbyś dokładniej opisać jak arp.library dostaje się do
> DeviceList. DosLibrary a potem ???
>
>
Troszkę kodu wyprułem z arp.library aby napisać gotową działającą procedure.
Przesyłam cały działający przykład testowy.
Ta część do pobrania adresu struktury (DeviceList) jest skopiowana z filerequestera w arp.library widać wyraźnie pobieranie struktur.......
Dalej mam jednak problem z rozmiarem bufora na tekst.
Ustawiłem 255 bajtów na zapas w arp.lib. przydzielają
wielki bufor do jeszcze kilku zastosowań.
Chciałbym dokładnie wiedzieć ile maksymalnie znaków może mieć nazwa urządzenia w AmigaOS ?????
Teraz jeszcze potrzebuje dwie informacje jakoś nie ma ich w RKM...
1).Jaka może być maksymalna długość nazwy pliku w 1.3 i nowszych???
2).Jaki maksymalny rozmiar może mieć ścieżka dojscia do pliku bez jego nazwy w AmigaOS????
Niby proste pytania a czy ktoś zna odpowiedzi????
w arp.library przewidzieli na to po:
FILEMEM: DS.B 33 ;bajty
DIRMEM: DS.B 34 ;bajty
ale to nie jest chyba to co potrafi AmigaOS???
Pozdrawiam
;-----------------------------------------------------------------------
;CPU: MC68000
;Assembler: DevPac v3.02
;Platforma: Amiga 500/OS 1.3/Kickstart(v34)
OldOpenLibrary: equ -408
CloseLibrary: equ -414
Output: equ -60
Write: equ -48
Start: move.l 4.w,a6
move.l #DosName,a1
jsr OldOpenLibrary(a6)
move.l d0,DosBase
beq.s Koniec
move.l d0,a6
jsr Output(a6)
move.l d0,CliHandle
beq.s Koniec
move.l CliHandle,d1
move.l #txt_001,d2
move.l d2,a0
bsr LengthText ;rozmiar tekstu
move.l DosBase,a6
jsr Write(a6)
Loop_PP_00: bsr ReadDeviceList
move.l CliHandle,d1
move.l #RDL_Bufor,d2
move.l d2,a0
bsr LengthText ;rozmiar tekstu
move.l DosBase,a6
jsr Write(a6)
tst.l RDL_Index
bne.s Loop_PP_00
move.l 4.w,a6
move.l DosBase,a1
jsr CloseLibrary(a6)
moveq #0,d0
Koniec: rts
;WEJSCIE: A0 = Adres początku ciągu znaków ASCII zakonczonego bajtem o wartości $0.
;WYJSCIE: D0 = Zwracany jest rozmiar tekstu w bajtach znacznik końca $0 nie wliczany.
LengthText: moveq #0,d3
LT_PP: cmp.b #0,(a0)+ ;sprawdzamy znacznik końca tekstu = 0
beq.s LT_End
addq #1,d3
bra.s LT_PP
LT_End: rts
LengthLine: moveq #0,d3
LL_PP: cmp.b #$A,(a0)+ ;sprawdzamy znacznik końca lini = $A
beq.s LL_End
addq #1,d3
bra.s LL_PP
LL_End: rts
DosName: dc.b 'dos.library',0
DosBase: dc.l 0
CliHandle: dc.l 0
txt_001: dc.b 'System Device List.',$A,0
;--------------------------------------------------------------------
;Funkcja ReadDeviceList() odczytuje do bufora (RDL_Bufor) pojedyńczą
;nazwę urządzenia typu Device.Jednorazowe wywołanie tej funkcji z
;wyzerowanym polem (RDL_Index) spowoduje odczytanie do (RDL_Bufor)
;nazwy pierwszego istniejącego urządzenia Device w systemie.
;W buforze (RDL_Bufor) znajdzie się nazwa ASCII zakończona bajtem 0.
;Po jej odczytaniu pole (RDL_Index) nie jest już zerowe i zawiera
;index potrzebny do odczytu kolejnej nazwy urządzenia Device. Nazwa
;ta trafi do bufora (RDL_Bufor) podczas kolejnego wywołania funkcji.
;Po wielokrotnym wywołaniu funkcji ReadDeviceList() i odczytaniu
;przez nią kolejno wszystkich nazw po ostatniej nazwie na liście
;funkcja ReadDeviceList() automatycznie wyzeruje pole (RDL_Index).
;Zawartość pola (RDL_Index) mamy po powrocie z funkcji w rej.D0 a
;rej.A0 wskazuje początek bufora z tekstem.
;WEJSCIE: Ewentualne wyzerowanie pola wskaźnika (RDL_Index).
; oznaczające przeszukiwanie listy od początku....
;
;WYJSCIE: A0 = Adres początku bufora zakończonego bajtem 0
; z nazwą ASCII aktualnie kolejnego Device'a.
; D0 = Jeśli rej. D0 = 0 to był ostatni z listy.
dl_Root = 34 ;struktura (DosLibrary)
rn_Info = 24 ;struktura (RootNode)
di_DevInfo = 4 ;struktura (DosInfo)
dl_Task = 8 ;struktura (DeviceList)
dl_Name = 40 ;struktura (DeviceList)
dl_Type = 4 ;struktura (DeviceList)
DLT_DEVICE EQU 0
DLT_DIRECTORY EQU 1
DLT_VOLUME EQU 2
ReadDeviceList: movem.l a1/a2,-(sp)
move.l RDL_Index,a2
tst.l RDL_Index
bne.s RDL_PP_04
move.l DosBase,a2
move.l dl_Root(a2),a2
move.l rn_Info(a2),a2
add.l a2,a2
add.l a2,a2
move.l di_DevInfo(a2),a2
add.l a2,a2
add.l a2,a2 ;teraz a rej. A2 mamy adres struktury (DeviceList).
RDL_PP_04: moveq #0,d0
cmp.l #DLT_DEVICE,dl_Type(a2)
bne.s RDL_PP_03
tst.l dl_Task(a2)
beq.s RDL_PP_03
move.l dl_Name(a2),a1
add.l a1,a1
add.l a1,a1
move.b (a1)+,d0
subq.l #1,d0
move.l #RDL_Bufor,a0
RDL_PP_02: move.b (a1)+,(a0)+
dbra d0,RDL_PP_02
move.b #":",(a0)+
clr.b (a0) ;wstawiamy znacznik końca tekstu.
RDL_PP_03: move.l (a2),a2
add.l a2,a2
add.l a2,a2
tst.l d0
beq.s RDL_PP_04
move.l a2,RDL_Index ;zapisujemy kolejną strukturę (DeviceList).
move.l #RDL_Bufor,a0
move.l a2,d0 ;jeśli D0 = 0 to był ostani Device z listy.
movem.l (sp)+,a1/a2
rts
RDL_Index: DC.L 0
RDL_Bufor: DS.B 255
;--------------------------------------------------------------------
Ostatnia modyfikacja: 25.06.2009 13:32:51