home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magazyn Amiga Shareware Floppies
/
ma36.dms
/
ma36.adf
/
ALib
/
ALib.asm
< prev
next >
Wrap
Assembly Source File
|
1995-04-04
|
10KB
|
426 lines
**************************************************************************
* *
* ALib v2.1 (8.89) 16.01.95 *
* *
* Program sîuûâcy do wyôwietlania, otwierania i usuwania bibliotek. *
* *
* © 1994, 1995 Tadek Knapik. Public Domain. *
* *
**************************************************************************
incdir Includes:
include libraries/dosextens.i
include exec/execbase.i
include exec/lists.i
include exec/memory.i
include offsets/exec_lib.i
include offsets/dos_lib.i
include offsets/intuition_lib.i
SIZE equ 2048
section ALibc,code
Begin:
bra Start
VerString:
dc.b '$VER: ALib v2.1 (8.89) 16.01.95.',0
Author:
dc.b '© 1994,1995 Tadek Knapik. Public Domain.',0
Start:
move.l a0,a5 ;zapamiëtaie ew. argum.
bsr AskWB ;czy spod WB
tst.l d0
bne WBEnd ;niestety tak..
move.l a5,a0 ;poczâtek argumentów
cmpi.b #10,(a0) ;czy podano argumenty?
beq Show ; Nie ?!?
cmpi.b #'?',(a0) ; a moûe podano "?"
beq Info ;informacja
move.l a0,a5 ;adres argumentów
lea LibName,a1 ;bufor na peînâ nazwë
lea AddName(pc),a2 ;adres rozszerzenia
bra OpenIt ;zaczynam kopiowanie
Again:
lea LibName,a1 ;bufor na peînâ nazwë
lea AddName(pc),a2 ;adres rozszerzenia
cmpi.b #10,(a5) ;czy znak koïca linii?
bne OpenIt ;tak
moveq #0,d0 ;wyzerowanie
rts ;wyjôcie
;w a5 - poczâtek argumentu, a1 - bufor na nazwë, a2 - bufor z "dodatkiem"
DoName:
Over: ;kopiowanie nazwy
move.b (a5),(a1) ;szukanie koïca nazwy
cmpi.b #32,(a1) ;(znaku spacji
beq Spc ;lub znaku
cmpi.b #10,(a1) ;koïca linii)
beq Suffix ;znaleziono = skok
adda.l #1,a5 ;powiëkszenie a0
adda.l #1,a1 ;i a1 o jeden
addq.l #1,d3 ;licznik znaków
bra Over ;powrót
Spc:
adda.l #1,a5 ;nastëpna nazwa
Suffix:
move.b (a2)+,(a1)+ ;kop. znaków rozszerzenia
bne Suffix ;jeszcze nie koniec
add.l #8,d3 ;dîugoôê '.library'
rts
OpenIt:
moveq #0,d7 ;
cmpi.b #'-',(a5) ;do usuniëcia?
beq CloseIt ;tak
cmpi.b #'+',(a5) ;opcja '+'?
bne HardOpen
adda.l #1,a5 ;przesuniëcie na nastëpny znak
moveq #1,d7 ;zaznaczenie opcji
HardOpen:
bsr DoName ;poîâczenie nazwy
move.l 4,a6 ;baza exec
tst.l d7 ;sprawdzam opcjë
beq MustOpen ;nie byîo opcji '+'
move.l LibList(a6),a0 ;nagîówek listy bibliotek
lea LibName,a1 ;adres nazwy biblioteki
jsr _LVOFindName(a6) ;czy taka zostaîa juû otwarta?
tst.l d0 ;zobaczmy
bne EndOpen ;skok, jeôli tak
MustOpen:
moveq #0,d0 ;objëtna wersja biblioteki
lea LibName,a1 ;bufor z nazwâ biblioteki
jsr _LVOOpenLibrary(a6) ;otwarcie danej biblioteki
tst.l d0 ;dla pewnoôci
beq NoLib ;brak tej biblioteki
tst.l d7 ;jeûeli opcja '+', to muszë
beq EndOpen ;jâ teraz zamknâê
move.l d0,a1 ;adres biblioteki
jsr _LVOCloseLibrary(a6) ;zamkniëcie
EndOpen:
moveq #0,d3 ;wyzerowanie rejestru
bra Again ;wracamy..
CloseIt:
adda.l #1,a5
bsr DoName ;poîâczenie nazwy
move.l 4,a6 ;execbase
jsr _LVOForbid(a6) ;wyîâczenie multitaskingu
move.l LibList(a6),a0 ;poczâtek listy bibliotek
lea LibName,a1 ;nazwa biblioteki
jsr _LVOFindName(a6) ;czy otwarta?
move.l d0,a4 ;adres biblioteki
beq NotOpen
move.l d0,a1
moveq #0,d7
move.w LIB_OPENCNT(a1),d7 ;ile razy otwarta
subq.l #1,d7
CloseLoop:
move.l a4,a1 ;zamykanie biblioteki
jsr _LVOCloseLibrary(a6) ;tyle razy, ile razy
dbf d7,CloseLoop ;zostaîa otwarta
move.l a4,a1 ;adres struktury node
jsr _LVORemLibrary(a6) ;usuniëcie biblioteki
jsr _LVOPermit(a6) ;multitasking
moveq #0,d3 ;wyzerowanie rejestru
bra Again ;wracamy..
NotOpen:
jsr _LVOPermit(a6) ;wîâczenie multitaskingu
lea NotOpenMes(pc),a0 ;napis
bsr DisplayError ;wyôwietlenie
moveq #0,d3
bra Again
Info:
bsr OpenDos ;otworzenie biblioteki dos
move.l d0,a6 ;adres do a6
jsr _LVOOutput(a6) ;zbadanie "wyjôcia" inform.
beq Koniec ;brak = wyjôcie z prog.
move.l d0,d4 ;adres do d4
lea InfoMes(pc),a2 ;adres informacji
moveq #1,d3 ;jeden znak do wyôwieetlenia
DisplayLoop:
tst.b (a2) ;zero?
beq DisplayOver ;tak!
move.l a2,d2 ;nie
move.l d4,d1 ;output
jsr _LVOWrite(a6) ;wypisanie informacji
moveq #1,d1 ;1/50 sekundy do odczekania
jsr _LVODelay(a6) ;opóúnienie
adda.l #1,a2 ;na nastëpny znak
bra DisplayLoop
DisplayOver:
move.l #10,d1 ;koïcowe opóúnienie
jsr _LVODelay(a6) ;1/10 sekundy
bsr CloseDos
moveq #0,d0 ;wyzerowanie rejestru
rts
Koniec:
move.l #10,d0
rts ;bye bye
NoLib:
lea NoLibMes(pc),a0 ;napis
bsr DisplayError ;wyôwietlenie
moveq #0,d3
bra Again
DisplayError:
moveq #0,d3
move.l #0,Lenght ;
move.l 4,a6 ;baza exec
lea DataStream(pc),a1 ;adres zmiennej
lea PutChProc(pc),a2 ;procedurka
lea ErrString,a3 ;wynik
jsr _LVORawDoFmt(a6) ;formatowanie
bsr OpenDos ;otwarcie dos.library
move.l _DosBase,a6 ;baza dosu
jsr _LVOOutput(a6) ;czy jest "wyjôcie"
move.l d0,d1 ;kopiujë ew. adres
beq NoOut ;no cóû..
lea ErrString,a0 ;adres napisu
move.l a0,d2 ;do d2
move.l Lenght,d3 ;dîugoôê
jsr _LVOWrite(a6) ;wypisanie informacji
NoOut:
bsr CloseDos ;zamkniëcie dos.library
rts
PutChProc:
move.b d0,(a3)+ ;przeniesienie znaku
add.l #1,Lenght ;dîugoôê
rts
OpenDos:
move.l 4.w,a6 ;baza exec
lea DosName(pc),a1 ;nazwa bibl. dos
jsr _LVOOldOpenLibrary(a6) ;otworzenie bibl. dos
move.l d0,_DosBase ;zapam. adresu dos.library
rts
CloseDos:
move.l 4.w,a6 ;baza exec.library
move.l _DosBase,a1 ;baza dos.library
jsr _LVOCloseLibrary(a6) ;zamkniëcie bibl. dos
rts
CopyName:
addq.l #1,d3 ;dîugoôê nazwy
move.b (a1)+,(a3)+ ;kopiowanie nazwy
bne CopyName
suba.l #1,a3 ;ustawienie sië na zero
move.b #10,(a3)+ ;wstawienie koïca linii
rts
Show:
bsr OpenDos
move.l d0,a6 ;adres do a6
jsr _LVOOutput(a6) ;zbadanie "wyjôcia" inform.
move.l d0,_OutBase ;adres wyjôcia
beq Koniec ;brak = wyjôcie z prog.
move.l 4,a6 ;baza exec
move.l #SIZE,d0 ;rozmiar alokowanej pamiëci
move.l #MEMF_CLEAR,d1 ;typ pamiëci
jsr _LVOAllocMem(a6) ;pamiëê na nazwy bibliotek
move.l d0,_MemBase ;poczâtek zaalokowanej pamiëci
beq MemError ;brak pamiëci?
moveq #0,d3 ;wyzerowanie licznika
lea Header,a1
move.l d0,a3
bsr CopyName ;skopiowanie nagîówka
jsr _LVOForbid(a6) ;zatrzymanie multitaskingu
move.l LibList(a6),a4 ;adres listy bibliotek
move.l MLH_HEAD(a4),a4 ;poczâtek listy
tst.l (a4) ;maîo moûliwe
beq Koniec ;aby byîo zero
Next:
move.l LN_NAME(a4),a1 ;poczâtek nazwy
bsr CopyName ;skopiowanie nazwy
move.l LN_SUCC(a4),a4 ;adres nastëpnej biblioteki
tst.l (a4) ;jeôli nie zero,
bne Next ;to jedziemy spowrotem
move.b #10,(a3)+ ;znak koïca linii
addq.l #1,d3 ;licznik znaków
move.b #0,(a3)
move.l 4,a6 ;baza exec
jsr _LVOPermit(a6) ;wîâczenie multitaskingu
move.l _MemBase,a3
move.l _DosBase,a6
moveq #0,d4
Display:
move.l _OutBase,d1 ;baza wyjôcia
move.l a3,d2 ;adres nazwy biblioteki
move.b d3,d4 ;przechowujë
jsr _LVOWrite(a6) ;wyôwietlenie
bmi Koniec ;bîâd
NoMore:
bsr CloseDos ;zamkniëcie biblioteki dos
moveq #0,d0 ;wyzerowanie
rts
AskWB:
move.l 4,a6
move.l #0,_WBPointer ;dla pewnoôci
sub.l a1,a1 ;nazwa tasku do szukania 0
jsr _LVOFindTask(a6) ;a wiëc szukam tego taska
move.l d0,a0 ;
tst.l pr_CLI(a0) ;czy task spod CLI
bne NonWB ;tak
lea pr_MsgPort(a0),a0 ;adres portu
move.l a0,a2 ;tam teû
jsr _LVOWaitPort(a6) ;
move.l a2,a0 ;adres portu
jsr _LVOGetMsg(a6) ;
move.l d0,_WBPointer ;zapamiëtanie
bsr DisplayCLIOnly ;tylko spod CLI lub Shella
moveq #1,d0 ;szukujë sië do opuszczenia pokîadu
rts
NonWB:
moveq #0,d0 ;znacznik OK
rts
WBEnd:
move.l 4,a6
jsr _LVOForbid(a6) ;wstrzymanie multitaskingu
move.l _WBPointer,a1 ;wskaúnik do a1
jsr _LVOReplyMsg(a6) ;zwrócenie
move.l #10,d0 ;return code
rts
OpenIntui: ;bibl. potrzebna do alertów
move.l 4.W,a6 ;baza biblioteki exec
moveq #0,d0 ;obojëtna wersja intuition.library
lea IntuiName(pc),a1 ;nazwa intuition do a1
jsr _LVOOpenLibrary(a6) ;otwarcie bibl. intuition
move.l d0,_IntuiBase ;zapa. adresu bazowego
rts
CloseIntui:
move.l 4.W,a6 ;baza biblioteki exec
move.l _IntuiBase,a1 ;baza bibl. intuition
jsr _LVOCloseLibrary(a6) ;zamkniëcie biblioteki intuition
rts
DisplayCLIOnly:
bsr OpenIntui ;otwarcie biblioteki intuition
move.l _IntuiBase,a6 ;baza intuition
moveq #0,d0 ;numer alertu
lea CLIOnlyMes(pc),a0 ;adres tekstu
move.l #20,d1 ;wysokoôê ramki
jsr _LVODisplayAlert(a6) ;wyôwietlenie
bsr CloseIntui ;zamkniëcie biblioteki
rts
MemError:
bsr OpenIntui ;otwarcie biblioteki intuition
move.l _IntuiBase,a6 ;baza intuition
moveq #0,d0 ;numer alertu
lea NoMemMes(pc),a0 ;adres tekstu
move.l #20,d1 ;wysokoôê ramki
jsr _LVODisplayAlert(a6) ;wyôwietlenie
bsr CloseIntui ;zamkniëcie biblioteki
bra Koniec
DosName:
dc.b 'dos.library',0
IntuiName:
dc.b 'intuition.library',0
AddName:
dc.b '.library',0
NoLibMes:
dc.b ' Kîopoty z otwarciem %s.',10,0
NotOpenMes:
dc.b ' Biblioteka %s nie zostaîa wczeôniej otwarta!',10,0
NoMemMes:
dc.b 0,228,12,'Brak pamiëci na bufor!!!',0,0
CLIOnlyMes:
dc.b 0,80,12,'ALib v2.1. Program uruchamialny tylko spod CLI lub Shella.',0,0,0
Header:
dc.b 10,' Otwarte biblioteki:',10,10,'utility.library',0
DataStream:
dc.l LibName
InfoMes:
dc.b 10
dc.b ' ALib v2.1 by Tadek Knapik ',10
dc.b ' Uûycie >ALib [-][+][katalog:nazwa]',10,10,0
; ***** Nowy hunk *****
section ALibd,bss
_DosBase:
ds.l 1
_IntuiBase:
ds.l 1
_OutBase:
ds.l 1
_MemBase:
ds.l 1
_WBPointer:
ds.l 1
Lenght:
ds.l 1
LibName:
ds.b 255
ErrString:
ds.b 255