Oznámení

Sbalit
Aktuálně žádná oznámení.

AmigaE

Sbalit
X
 
  • Filtr
  • Čas
  • Zobrazit
Vymazat vše
new posts

    #46

    Assign EXISTS


    Příklad co porovnává seznam zařízeni a který jsem si upravil sice funguje skvěle, ale obsahuje pár věcí o kterých nevím jak fungujou. To prostě nejde a nemůžu to zabudovat když nevim o co jde.
    Například bitový posun shift left (Shl nebo <<). Na internetech jsem si přečetl co to dělá a pod, ale furt nevim kde, proč a jak tuhle funkci použít
    Minulej tejden jsem se bavil se zákazníkem a ten říkal že programuje skoro 20 let a tohle použil asi dvakrát
    Mezitím jsem vylepšil způsob ověření pomocí AmigaDos příkazu jak navrhoval Falcon_11.

    Tady je příklad s porvnáváním zařízení.
    Code:
    MODULE 'dos/dosextens'
    
    PROC main()
      DEF jo
    
       WriteF('0 existuje, 20 neexistuje\n')
       jo:=findAssign('ram disk:')
       WriteF('cislo \d\n',jo)
    ENDPROC
    
    PROC findAssign(name:PTR TO CHAR)
    /* returns 0 if it exists otherwise it returns 20 */
      DEF db:PTR TO doslibrary
      DEF rootnode:PTR TO rootnode
      DEF dosinfo:PTR TO dosinfo
      DEF devicelist:PTR TO devlist
      DEF temp[256]:STRING
      DEF temp2[256]:STRING
      DEF i=0
    
      StrCopy(temp,name)
      WHILE temp[i]            ->hleda dvojtecku ve stringu
       IF(temp[i]=":")
         SetStr(temp,i)        ->zapise do stringu to co je pred dvojteckou
         i:=-1
       ENDIF
       EXIT i=-1
       i++
      ENDWHILE
    
      IF i<>-1 THEN RETURN 20  ->kdyz chybi dvojtecka
    
      db:= dosbase
      rootnode:= db.root
      dosinfo:= (rootnode.info << 2)
      devicelist:= (dosinfo.devinfo << 2)
      Forbid()
      WHILE(devicelist.next)
        bStrC(devicelist.name,temp2)
        IF(strCmpi(temp2,temp,ALL))
          Permit()
          RETURN 0
        ENDIF
        devicelist:=(devicelist.next << 2)
      ENDWHILE
      Permit()
    ENDPROC 20
    
    PROC strCmpi(test1:PTR TO CHAR, test2:PTR TO CHAR, len)
      /* case insensitive string compare */
      DEF i,l1,l2
    
      IF len=ALL
        l1:= StrLen(test1)
        l2:= StrLen(test2)
        IF l1<>l2 THEN RETURN FALSE
        len:= l1
      ENDIF
    
      FOR i:=0 TO len-1
    
        IF charToLower(test1[i])<>charToLower(test2[i]) THEN RETURN FALSE
    
      ENDFOR
    ENDPROC TRUE
    
    PROC charToLower(c)
      DEF str[1]:STRING
      str[0]:=c
      LowerStr(str)
    
    ENDPROC str[0]
    
    PROC bStrC(bstr:PTR TO CHAR,outbuf:PTR TO CHAR)
    
     DEF str:PTR TO CHAR
     DEF loop,counter
    
     counter:= 0
     str:= (bstr << 2)
     SetStr(outbuf,str[0])
    
     FOR loop:= 1 TO str[0]
       outbuf[counter]:= str[loop]
       counter++
     ENDFOR
    
    ENDPROC
    ​
    Naposledy upravil ghh; 10.07.2024, 23:53:03. Důvod: Chybělo tam jedno jediný písmenko tak jsem ho tam připsal.
    Amiga DraCo DaMi PegasosII G4 G5

    Komentovat


      #47
      Bitový posun doleva můžeš použít například pro násobení číslem 2,4,8,16,32,64,128 a tak dale, ale používají se spíše ty nižší násobky. Ve 4 bitech se číslo 2 zapíše jako 0010. Pokud zarotuješ bity o 1 pozici doleva, tedy 0100, je to binarny zápis čísla 4. Funguje to i při cislech, co v binarnim zápisu mají obsazeno více bitů. Například s číslem 5 tedy binarne 0101. Rotací o 1 bit vlevo budeš mít 1010, co je desitkove číslo 10=5×2. Takove násobení / dělení pri posunu vlevo / vpravo je v assembleru rychlejší než kdyby se na to použila instrukce pro násobení / dělení, minimálně v případě, pokud neděláme moc bitovych posunu. Funguje to i když například chceš posunout písmeno o 1 pozici. V tom případě rotuješ o 8 bitů. Dále se rotace může použít při práci s HW registry.
      Amiga - PMD 85

      Komentovat


        #48
        Bitove posuny jsou zalezitosti predevsim assembleru, ve vyssich jazycich se pouzivaji vyjimecne.

        Komentovat


          #49
          Lisiak:Jo jo tohle jsem se dočetl na internetech že se to dá použít jako matematická operace a že to posouvá bity, ale v tomhle se zatím moc neorientuju. V příkladu to zjevně právě posouvá (listuje) ty zařízení. Můj problém je že by mě vůbec nenapadlo použít to při výpisu zařízení, nemám se to jak dozvědět
          Funguje to i když například chceš posunout písmeno o 1 pozici.
          Zajímavý tohle mi právě nedošlo že to může fungovat i takhle, všude jsem právě četl že se to používá na operace s čísly.
          Včera jsem si při procházení include souborů všimnul pár zajímavých komentářů a ještě to poladim
          Amiga DraCo DaMi PegasosII G4 G5

          Komentovat


            #50
            Já jsem z te syntaxe v příkladu jelen, nicméně rotace po 2 bitech je užitečná když chceš jemně skrolovat text. V tomhle případě po 2 pixelech doleva. Tyhle rotace písmena se musí provést u každého řádku z kterého se písmeno skládá zvlášť, nejčastěji od shora dolů. Každý řádek z písmena má tedy výšku 1 pixel a šířku u standardni velikosti 8 pixelů. A řekneme že písmeno tvoří 8 řádku. V tomhle případě by se udělalo 8 rotaci po 2 pixelech doleva, čím posuneš celé pismeno o 2 pixely vlevo. U každé rotace budeš rotovat o 1 řádek ze kterých se skládá písmeno níže.
            Naposledy upravil Lisiak; 12.07.2024, 19:22:31.
            Amiga - PMD 85

            Komentovat


              #51
              Opravdu je v tomhle pripade << bitovy posun? Me to nedava zadny smysl.

              Komentovat


                #52
                >> tohle asi nebude bitovy posun. Je ten program zde cely? Bitovy posun je pomoci "shl" a "shr" = shift left, shift right. Symbol ">>", "<<" dle vseho AmigaE ani nezna viz dokumentace a symboly jsou v indexu pod "S". Odkaz na dokumentaci je níže. Mne to prijde ze by se mohlo jednat dle toho programu jak jsem se koukal spise o bytovy posun, tedy posun po 8 bitech. To by davalo smysl, protoze se tam do promennych zapisuji informace v rozsahu 2 celych bajtů = 16 bitů a WH registre Amiga 16 bitové má. Myslim si tedy aniz bych to nejak mel nastudovany, ze se nacitaji do promennych hodnoty z HW registrů.

                Dokumentace AmigaE:


                ghh zkoušíš mou bdělost?
                Amiga - PMD 85

                Komentovat


                  #53
                  Me to pripada jako nejaka operace s objekty.

                  Komentovat


                    #54
                    Tohle << samozřejmě je bitwise shift left neboli Shl(). Je to nová věc v ECX oproti původnímu AmigaE. Lisiaku dík za odkaz, ale ten manuál jsem za těch asi 8 let co si s tim hraju přečetl tak 1236 krát.
                    Doda: právě jsou to nějaký složitě propojený struktury, ztrácím se v tom
                    Amiga DraCo DaMi PegasosII G4 G5

                    Komentovat


                      #55
                      Autorem citovaného textu je Doda Přejít na původní příspěvek
                      Opravdu je v tomhle pripade << bitovy posun? Me to nedava zadny smysl.
                      Je to bitový posun. AmigaDOS byl naprogramován v BCPL, který měl na dnešní poměry (ale i tehdejší) zvláštní pointery. Ukazovaly na čtveřici bajtů (tedy na LONG WORD). Nebyla to tedy hodnota fyzické adresy. Ta se získala tím, že se hodnota vynásobila čtyřmi -- převedla se na reálnou adresu bajtu v paměti. Proto bitový posun o dvě místa vlevo.
                      Naposledy upravil Defor; 17.07.2024, 15:14:58.

                      Komentovat


                        #56
                        Tohle jsem našel v nějakém zdrojáku.
                        Code:
                        /*
                          accessing the list of logical volumes is hairy under AmigaOS 1.x - it is
                          "hidden" in the DosBase structure, and shared among all tasks.
                        
                          Effectively this means, we need to nest the retrieval of the assigns into
                          Forbid()/Permit() calls to lock the assign list to prevent possible
                          race conditions.
                        
                          Reminder: We need to do some BCPL->C conversion here
                          BPTR are address pointers divided by 4, use BADDR to convert
                          BSTR are BPTRs to 0-terminated ASCII char arrays with a prefix length byte
                        
                          For now, we will omit device typed entries, because writing/reading to them
                          usually doesn't make too much sense.
                        */
                        ​
                        Amiga DraCo DaMi PegasosII G4 G5

                        Komentovat

                        Zpracovávám...
                        X