home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga Shareware Floppies / ma36.dms / ma36.adf / ALib / ALib.asm < prev    next >
Assembly Source File  |  1995-04-04  |  10KB  |  426 lines

  1.  
  2. **************************************************************************
  3. *                                                                        *
  4. *                        ALib v2.1 (8.89) 16.01.95                       *
  5. *                                                                        *
  6. *     Program sîuûâcy do wyôwietlania, otwierania i usuwania bibliotek.  *
  7. *                                                                        *
  8. *     © 1994, 1995 Tadek Knapik. Public Domain.                          *
  9. *                                                                        *
  10. **************************************************************************
  11.  
  12.  
  13.     incdir    Includes:
  14.     include    libraries/dosextens.i
  15.     include    exec/execbase.i
  16.     include    exec/lists.i
  17.     include    exec/memory.i
  18.     include    offsets/exec_lib.i
  19.     include    offsets/dos_lib.i
  20.     include    offsets/intuition_lib.i
  21.  
  22. SIZE        equ    2048
  23.  
  24.     section    ALibc,code
  25.  
  26. Begin:
  27.     bra    Start
  28.  
  29. VerString:
  30.     dc.b    '$VER: ALib v2.1 (8.89) 16.01.95.',0
  31. Author:
  32.     dc.b    '© 1994,1995 Tadek Knapik. Public Domain.',0
  33.  
  34. Start:
  35.     move.l    a0,a5                ;zapamiëtaie ew. argum.
  36.  
  37.     bsr    AskWB                ;czy spod WB
  38.     tst.l    d0
  39.     bne    WBEnd                ;niestety tak..
  40.  
  41.     move.l    a5,a0                ;poczâtek argumentów
  42.     cmpi.b    #10,(a0)            ;czy podano argumenty?
  43.     beq    Show                ;   Nie ?!?
  44.     cmpi.b    #'?',(a0)            ; a moûe podano "?"
  45.     beq    Info                ;informacja
  46.     move.l    a0,a5                ;adres argumentów
  47.     lea    LibName,a1            ;bufor na peînâ nazwë
  48.     lea    AddName(pc),a2            ;adres rozszerzenia
  49.     bra    OpenIt                ;zaczynam kopiowanie
  50.  
  51. Again:
  52.     lea    LibName,a1            ;bufor na peînâ nazwë
  53.     lea    AddName(pc),a2            ;adres rozszerzenia
  54.     cmpi.b    #10,(a5)            ;czy znak koïca linii?
  55.     bne    OpenIt                ;tak
  56.     moveq    #0,d0                ;wyzerowanie
  57.     rts                    ;wyjôcie
  58.  
  59. ;w a5 - poczâtek argumentu, a1 - bufor na nazwë, a2 - bufor z "dodatkiem"
  60.  
  61. DoName:
  62.  
  63. Over:                        ;kopiowanie nazwy
  64.     move.b    (a5),(a1)            ;szukanie koïca nazwy
  65.     cmpi.b    #32,(a1)            ;(znaku spacji
  66.     beq    Spc                ;lub znaku
  67.     cmpi.b    #10,(a1)            ;koïca linii)
  68.     beq    Suffix                ;znaleziono = skok
  69.     adda.l    #1,a5                ;powiëkszenie a0
  70.     adda.l    #1,a1                ;i a1 o jeden
  71.     addq.l    #1,d3                ;licznik znaków
  72.     bra    Over                ;powrót
  73.  
  74. Spc:
  75.     adda.l    #1,a5                ;nastëpna nazwa
  76.  
  77. Suffix:
  78.     move.b    (a2)+,(a1)+            ;kop. znaków rozszerzenia
  79.     bne    Suffix                ;jeszcze nie koniec
  80.     add.l    #8,d3                ;dîugoôê '.library'
  81.     rts
  82.  
  83.  
  84. OpenIt:
  85.     moveq    #0,d7                ;
  86.     cmpi.b    #'-',(a5)            ;do usuniëcia?
  87.     beq    CloseIt                ;tak
  88.     cmpi.b    #'+',(a5)            ;opcja '+'?
  89.     bne    HardOpen
  90.     adda.l    #1,a5                ;przesuniëcie na nastëpny znak
  91.     moveq    #1,d7                ;zaznaczenie opcji
  92.  
  93. HardOpen:
  94.     bsr    DoName                ;poîâczenie nazwy
  95.     move.l    4,a6                ;baza exec
  96.     tst.l    d7                ;sprawdzam opcjë
  97.     beq    MustOpen            ;nie byîo opcji '+'
  98.     move.l    LibList(a6),a0            ;nagîówek listy bibliotek
  99.     lea    LibName,a1            ;adres nazwy biblioteki
  100.     jsr    _LVOFindName(a6)        ;czy taka zostaîa juû otwarta?
  101.     tst.l    d0                ;zobaczmy
  102.     bne    EndOpen                ;skok, jeôli tak
  103. MustOpen:
  104.     moveq    #0,d0                ;objëtna wersja biblioteki
  105.     lea    LibName,a1            ;bufor z nazwâ biblioteki
  106.     jsr    _LVOOpenLibrary(a6)        ;otwarcie danej biblioteki
  107.     tst.l    d0                ;dla pewnoôci
  108.     beq    NoLib                ;brak tej biblioteki
  109.     tst.l    d7                ;jeûeli opcja '+', to muszë
  110.     beq    EndOpen                ;jâ teraz zamknâê
  111.     move.l    d0,a1                ;adres biblioteki
  112.     jsr    _LVOCloseLibrary(a6)        ;zamkniëcie
  113.  
  114. EndOpen:
  115.     moveq    #0,d3                ;wyzerowanie rejestru
  116.     bra    Again                ;wracamy..
  117.  
  118. CloseIt:
  119.     adda.l    #1,a5
  120.     bsr    DoName                ;poîâczenie nazwy
  121.     move.l    4,a6                ;execbase
  122.     jsr    _LVOForbid(a6)            ;wyîâczenie multitaskingu
  123.     move.l    LibList(a6),a0            ;poczâtek listy bibliotek
  124.     lea    LibName,a1            ;nazwa biblioteki
  125.     jsr    _LVOFindName(a6)        ;czy otwarta?
  126.     move.l    d0,a4                ;adres biblioteki
  127.     beq    NotOpen
  128.     move.l    d0,a1
  129.     moveq    #0,d7
  130.     move.w    LIB_OPENCNT(a1),d7        ;ile razy otwarta
  131.     subq.l    #1,d7
  132.  
  133. CloseLoop:
  134.     move.l    a4,a1                ;zamykanie biblioteki
  135.     jsr    _LVOCloseLibrary(a6)        ;tyle razy, ile razy
  136.     dbf    d7,CloseLoop            ;zostaîa otwarta
  137.  
  138.     move.l    a4,a1                ;adres struktury node
  139.     jsr    _LVORemLibrary(a6)        ;usuniëcie biblioteki
  140.     jsr    _LVOPermit(a6)            ;multitasking    
  141.     moveq    #0,d3                ;wyzerowanie rejestru
  142.     bra    Again                ;wracamy..
  143.  
  144.  
  145. NotOpen:
  146.     jsr    _LVOPermit(a6)            ;wîâczenie multitaskingu
  147.     lea    NotOpenMes(pc),a0        ;napis
  148.     bsr    DisplayError            ;wyôwietlenie
  149.     moveq    #0,d3
  150.     bra    Again
  151.  
  152.  
  153.  
  154.  
  155. Info:
  156.     bsr    OpenDos                ;otworzenie biblioteki dos
  157.     move.l    d0,a6                ;adres do a6
  158.     jsr    _LVOOutput(a6)            ;zbadanie "wyjôcia" inform.
  159.     beq    Koniec                ;brak = wyjôcie z prog.
  160.     move.l    d0,d4                ;adres do d4
  161.     lea    InfoMes(pc),a2            ;adres informacji
  162.     moveq    #1,d3                ;jeden znak do wyôwieetlenia
  163.  
  164. DisplayLoop:
  165.     tst.b    (a2)                ;zero?
  166.     beq    DisplayOver            ;tak!
  167.     move.l    a2,d2                ;nie
  168.     move.l    d4,d1                ;output
  169.     jsr    _LVOWrite(a6)            ;wypisanie informacji
  170.     moveq    #1,d1                ;1/50 sekundy do odczekania
  171.     jsr    _LVODelay(a6)            ;opóúnienie
  172.     adda.l    #1,a2                ;na nastëpny znak
  173.     bra    DisplayLoop
  174.  
  175. DisplayOver:
  176.     move.l    #10,d1                ;koïcowe opóúnienie
  177.     jsr    _LVODelay(a6)            ;1/10 sekundy
  178.     bsr    CloseDos
  179.     moveq    #0,d0                ;wyzerowanie rejestru
  180.     rts
  181.  
  182. Koniec:
  183.     move.l    #10,d0
  184.     rts                    ;bye bye
  185.  
  186. NoLib:
  187.     lea    NoLibMes(pc),a0            ;napis
  188.     bsr    DisplayError            ;wyôwietlenie
  189.     moveq    #0,d3
  190.     bra    Again
  191.  
  192.  
  193. DisplayError:
  194.     moveq    #0,d3
  195.     move.l    #0,Lenght            ;
  196.     move.l    4,a6                ;baza exec
  197.     lea    DataStream(pc),a1        ;adres zmiennej
  198.     lea    PutChProc(pc),a2        ;procedurka
  199.     lea    ErrString,a3            ;wynik
  200.     jsr    _LVORawDoFmt(a6)        ;formatowanie
  201.     bsr    OpenDos                ;otwarcie dos.library
  202.     move.l    _DosBase,a6            ;baza dosu
  203.     jsr    _LVOOutput(a6)            ;czy jest "wyjôcie"
  204.     move.l    d0,d1                ;kopiujë ew. adres
  205.     beq    NoOut                ;no cóû..
  206.     lea    ErrString,a0            ;adres napisu
  207.     move.l    a0,d2                ;do d2
  208.     move.l    Lenght,d3            ;dîugoôê
  209.     jsr    _LVOWrite(a6)            ;wypisanie informacji
  210. NoOut:
  211.     bsr    CloseDos            ;zamkniëcie dos.library
  212.     rts
  213.  
  214. PutChProc:
  215.     move.b    d0,(a3)+            ;przeniesienie znaku
  216.     add.l    #1,Lenght            ;dîugoôê
  217.     rts
  218.  
  219.  
  220. OpenDos:
  221.     move.l    4.w,a6                ;baza exec
  222.     lea    DosName(pc),a1            ;nazwa bibl. dos    
  223.     jsr    _LVOOldOpenLibrary(a6)        ;otworzenie bibl. dos
  224.     move.l    d0,_DosBase            ;zapam. adresu dos.library
  225.     rts
  226.  
  227. CloseDos:
  228.     move.l    4.w,a6                ;baza exec.library
  229.     move.l    _DosBase,a1            ;baza dos.library
  230.     jsr    _LVOCloseLibrary(a6)        ;zamkniëcie bibl. dos
  231.     rts
  232.  
  233. CopyName:
  234.     addq.l    #1,d3                ;dîugoôê nazwy
  235.     move.b    (a1)+,(a3)+            ;kopiowanie nazwy
  236.     bne    CopyName
  237.     suba.l    #1,a3                ;ustawienie sië na zero
  238.     move.b    #10,(a3)+            ;wstawienie koïca linii
  239.     rts
  240.  
  241.  
  242.  
  243. Show:
  244.     bsr    OpenDos
  245.     move.l    d0,a6                ;adres do a6
  246.     jsr    _LVOOutput(a6)            ;zbadanie "wyjôcia" inform.
  247.     move.l    d0,_OutBase            ;adres wyjôcia
  248.     beq    Koniec                ;brak = wyjôcie z prog.
  249.  
  250.     move.l    4,a6                ;baza exec
  251.     move.l    #SIZE,d0            ;rozmiar alokowanej pamiëci
  252.     move.l    #MEMF_CLEAR,d1            ;typ pamiëci
  253.     jsr    _LVOAllocMem(a6)        ;pamiëê na nazwy bibliotek
  254.     move.l    d0,_MemBase            ;poczâtek zaalokowanej pamiëci
  255.     beq    MemError            ;brak pamiëci?
  256.  
  257.     moveq    #0,d3                ;wyzerowanie licznika
  258.     lea    Header,a1
  259.     move.l    d0,a3
  260.     bsr    CopyName            ;skopiowanie nagîówka
  261.  
  262.     jsr    _LVOForbid(a6)            ;zatrzymanie multitaskingu
  263.     move.l    LibList(a6),a4            ;adres listy bibliotek
  264.     move.l    MLH_HEAD(a4),a4            ;poczâtek listy
  265.     tst.l    (a4)                ;maîo moûliwe
  266.     beq    Koniec                ;aby byîo zero
  267.  
  268. Next:
  269.     move.l    LN_NAME(a4),a1            ;poczâtek nazwy
  270.     bsr    CopyName            ;skopiowanie nazwy
  271.     move.l    LN_SUCC(a4),a4            ;adres nastëpnej biblioteki
  272.     tst.l    (a4)                ;jeôli nie zero,
  273.     bne    Next                ;to jedziemy spowrotem
  274.  
  275.     move.b    #10,(a3)+            ;znak koïca linii
  276.     addq.l    #1,d3                ;licznik znaków
  277.     move.b    #0,(a3)
  278.     move.l    4,a6                ;baza exec
  279.     jsr    _LVOPermit(a6)            ;wîâczenie multitaskingu
  280.     move.l    _MemBase,a3
  281.     move.l    _DosBase,a6
  282.     moveq    #0,d4
  283.  
  284. Display:
  285.     move.l    _OutBase,d1            ;baza wyjôcia
  286.     move.l    a3,d2                ;adres nazwy biblioteki
  287.     move.b    d3,d4                ;przechowujë
  288.     jsr    _LVOWrite(a6)            ;wyôwietlenie
  289.     bmi    Koniec                ;bîâd
  290.  
  291. NoMore:
  292.     bsr    CloseDos            ;zamkniëcie biblioteki dos
  293.     moveq    #0,d0                ;wyzerowanie
  294.     rts
  295.  
  296.  
  297. AskWB:
  298.     move.l    4,a6
  299.     move.l    #0,_WBPointer        ;dla pewnoôci
  300.     sub.l    a1,a1            ;nazwa tasku do szukania 0
  301.     jsr    _LVOFindTask(a6)    ;a wiëc szukam tego taska
  302.     move.l    d0,a0            ;
  303.     tst.l    pr_CLI(a0)        ;czy task spod CLI
  304.     bne    NonWB            ;tak
  305.     lea    pr_MsgPort(a0),a0    ;adres portu
  306.     move.l    a0,a2            ;tam teû
  307.     jsr    _LVOWaitPort(a6)    ;
  308.     move.l    a2,a0            ;adres portu
  309.     jsr    _LVOGetMsg(a6)        ;
  310.     move.l    d0,_WBPointer        ;zapamiëtanie
  311.     bsr    DisplayCLIOnly        ;tylko spod CLI lub Shella
  312.     moveq    #1,d0            ;szukujë sië do opuszczenia pokîadu
  313.     rts
  314.  
  315.  
  316. NonWB:
  317.     moveq    #0,d0            ;znacznik OK
  318.     rts
  319.  
  320. WBEnd:
  321.     move.l    4,a6
  322.     jsr    _LVOForbid(a6)        ;wstrzymanie multitaskingu
  323.     move.l    _WBPointer,a1        ;wskaúnik do a1
  324.     jsr    _LVOReplyMsg(a6)    ;zwrócenie
  325.     move.l    #10,d0            ;return code
  326.     rts
  327.  
  328.  
  329. OpenIntui:                ;bibl. potrzebna do alertów
  330.     move.l    4.W,a6            ;baza biblioteki exec
  331.     moveq    #0,d0            ;obojëtna wersja intuition.library
  332.     lea    IntuiName(pc),a1    ;nazwa intuition do a1
  333.     jsr    _LVOOpenLibrary(a6)    ;otwarcie bibl. intuition
  334.     move.l    d0,_IntuiBase        ;zapa. adresu bazowego
  335.     rts
  336.  
  337. CloseIntui:
  338.     move.l    4.W,a6            ;baza biblioteki exec
  339.     move.l    _IntuiBase,a1        ;baza bibl. intuition
  340.     jsr    _LVOCloseLibrary(a6)    ;zamkniëcie biblioteki intuition
  341.     rts
  342.  
  343. DisplayCLIOnly:
  344.     bsr    OpenIntui        ;otwarcie biblioteki intuition
  345.     move.l    _IntuiBase,a6        ;baza intuition
  346.     moveq    #0,d0            ;numer alertu
  347.     lea    CLIOnlyMes(pc),a0    ;adres tekstu
  348.     move.l    #20,d1            ;wysokoôê ramki
  349.     jsr    _LVODisplayAlert(a6)    ;wyôwietlenie
  350.     bsr    CloseIntui        ;zamkniëcie biblioteki
  351.     rts
  352.  
  353.  
  354. MemError:
  355.     bsr    OpenIntui        ;otwarcie biblioteki intuition
  356.     move.l    _IntuiBase,a6        ;baza intuition
  357.     moveq    #0,d0            ;numer alertu
  358.     lea    NoMemMes(pc),a0        ;adres tekstu
  359.     move.l    #20,d1            ;wysokoôê ramki
  360.     jsr    _LVODisplayAlert(a6)    ;wyôwietlenie
  361.     bsr    CloseIntui        ;zamkniëcie biblioteki
  362.     bra    Koniec
  363.  
  364.  
  365. DosName:
  366.     dc.b    'dos.library',0
  367.  
  368. IntuiName:
  369.     dc.b    'intuition.library',0
  370.  
  371. AddName:
  372.     dc.b    '.library',0
  373.  
  374. NoLibMes:
  375.     dc.b    ' Kîopoty z otwarciem %s.',10,0
  376.  
  377. NotOpenMes:
  378.     dc.b    ' Biblioteka %s nie zostaîa wczeôniej otwarta!',10,0
  379.  
  380. NoMemMes:
  381.     dc.b    0,228,12,'Brak pamiëci na bufor!!!',0,0
  382.  
  383. CLIOnlyMes:
  384.     dc.b    0,80,12,'ALib v2.1.   Program uruchamialny tylko spod CLI lub Shella.',0,0,0
  385.  
  386. Header:
  387.     dc.b    10,' Otwarte biblioteki:',10,10,'utility.library',0
  388.  
  389. DataStream:
  390.     dc.l    LibName
  391.  
  392. InfoMes:
  393.     dc.b    10
  394.     dc.b    ' ALib v2.1 by Tadek Knapik    ',10
  395.     dc.b    ' Uûycie >ALib [-][+][katalog:nazwa]',10,10,0
  396.  
  397.  
  398. ;        *****    Nowy hunk   *****
  399.  
  400.     section    ALibd,bss
  401.  
  402. _DosBase:
  403.     ds.l    1
  404.  
  405. _IntuiBase:
  406.     ds.l    1
  407.  
  408. _OutBase:
  409.     ds.l    1
  410.  
  411. _MemBase:
  412.     ds.l    1
  413.  
  414. _WBPointer:
  415.     ds.l    1
  416.  
  417. Lenght:
  418.     ds.l    1
  419.  
  420. LibName:
  421.     ds.b    255
  422.  
  423. ErrString:
  424.     ds.b    255
  425.  
  426.