[ ###=mdositva v2.32 ta! ]
 --
                             ĿĿĿ
                                          
                                 Ĵ         
                                        
                             
             ĿĿĿĿĿĿ  ĿĿ
                                                 
                Ĵ                  Ŀ    Ĵ   
                              ٳ           Ĵ ڿ 
               
 --
  BAssPasC Compiler version 3.0 CardWare  *  Copyright (C) 1996-99 ESP-team
 --

 Ksztettk:      ###
 ~~~~~~~~~~~~
             Gereffy rpd  (GyikSoft)    arpi@banki1.banki.hu
             Pilszy Istvn  (PilaSoft)    Pila.1999C.Piar@email.piar.hu
             Brthzi Andrs (MikroLab)    bar_and@sparta.banki.hu
             Smulovics Pter (Szoke)       smulo@freemail.c3.hu (szoke@inf.bme.hu???)
             (...s mg sokan msok, lsd rszletesen FEJLESZT.TXT-ben!)

 --

                             Elsz
                            

  Ez a lers kzel sem teljes, s valsznleg sosem lesz az, mivel a
  fordt fejlesztse sokkal gyorsabban halad mint a lers ksztse.
  Ezrt ha valami nem vilgos, illetve innen hinyzik, akkor rj btran
  egy E-Mailt (a arpi@banki1.banki.hu cmre) s segtnk (ha tudunk)!

  rmmel vennnk mindenfajta segtsget, gy ha pldul valamit jobban
  meg tudsz fogalmazni mint mi (ezt nem lesz nehz :-) akkor tedd meg
  s kldd el neknk hogy beletegyk ebbe a lersba!
  s persze ha brmilyen hibt tallsz ebben vagy a fordtban, arrl is
  rtests minket! Ha szreveszel valamit (pl. a pldaprogramokban) ami
  hinyszik ebbl a doksibl, akkor se habozz, hanem rj!!!
  s akkor is rj neknk, ha valami 5leted van, vagy rtl egy j LIB-et.

                          Tartalomjegyzk
                         

        1. Bevezet

        2. Telepts
          2.1. A file-ok                                    -> LIST-???.TXT
          2.2. A BASSPASC.CFG belltsai                   -> CFG-FILE.TXT
          2.3. A BAPC3.EXE parancssora ###                  -> CMDLINE.TXT
          2.4. A BAPC s a TASM
          2.5. A BAPC s a NASM ###

        3. A BAP nyelv programok felptse
          3.1. A program szerkezete
          3.2. Lehetsgek
          3.3. Korltok

        4. Fordtsvezrl utastsok                       -> CONTROLL.TXT

        5. Alapok
          5.1. rtkadsok
          5.2. Matematikai s logikai opertorok
          5.3. Rvidtsek
          5.4. Cimkk
          5.5. Vltozk
          5.6. Konstansok
          5.7. String-ek
          5.8. Segmens-prefixek
          5.9. Kd-ismtls

        6. Utastsok
          6.1. Feltteles utastsok (IF, CASE)             -> CONDITIO.TXT
          6.2. Ciklusszervezs (FOR, REPEAT-UNTIL, WHILE)
          6.3. Veremkezels    (PUSH, POP)
          6.4. Billentyzet s kpernykezels
          6.5. File-parancsok  (FILE*)
          6.6. Egyb parancsok
          6.7. String-szer utastsok (STOSx,stb.)
          6.8. Az STDBAPC.H makrkszlet #######    [v3.0+]

        7. Modulris programozs
          7.1. INDIRECT-ek
          7.2. Rutingyjtemnyek (LIB-ek) hasznlata
          7.3. INCLUDE-k
          7.4. BAP Object (BPO)
          7.5. Ltkrk (PACKAGE-k) hasznlata

        8. Makrk s fggvnyek                  -> FUNCTION.TXT & MACRO.TXT
        9. A rutingyjtemnyek (LIB-ek) lersa

       10. Ingyenes regisztrci                            -> REGISTER.TXT

                        1. Bevezet       #########
                       

     Ez a programnyelv elssorban azoknak az Assembly nyelven programozknak
  kszlt, akik gyors programkdokat szeretnnek kszteni, de gyorsabb
  fejlesztsre, knnyebb ttekinthetsgre s kevesebb gpelsre trekednek.
     A BAPC els kzeltsben egy, az asm nyelvet kibvt makrkszletnek
  foghat fel. Mra viszont teljesen lefedi az asm-et, szinte minden
  megrhat tisztn BAPC utastsok hasznlatval. A LIB-ekkel s egytt
  mr a magasszint nyelvek kategrijba sorolhat, messze tllpi
  a 'makrkszlet' szintet.
     A BAPC nyelv programozs filozfija nem klnbzik az assemblytl,
  de a forrs rvidebb, tmrebb s sokkal ttekinthetbb. Ezltal nagyobb,
  bonyolultabb programok is rhatk, amik kezelse asm-ben nehzkes volt.
  Ehhez a BAPC sok lehetsget knl, pl. a gyors .BPO fordts, binris
  file-ok egyszer kezelse, cimkk lthatsgi krnek definlhatsga.

  ***  A BAPC nyelv elsajttshoz Assembly-ismeretek szksgesek!!! ***

  Errl sokan elfeledkeznek, s csupn basic vagy pascal alapismeretekkel
  prblnak BAPC programot rni, majd mikor ez nem jn ssze, felhborodottan
  fordulnak hozznk vagy a levlistra segtsgrt s "jobb" dokumentcirt.
  Ebben a lersban senkit NEM tantunk meg az assembly nyelvre!!!  Ezt
  mshonnan kell elsajttani, ez csak a BAPC s az ASM kzti klnbsgeket
  trgyalja! Teht felttelezzk hogy az olvas tisztban van az asm
  utastsokkal, a vals s vdett md fogalmval, szegmensekkel, cmzsi
  mdokkal, regiszterekkel, megszaktsokkal, file-kezelssel, stb.
  Pl. egy j _magyar_ assembly lers az ASM-Art, zso/poisonmixers-tl.

     A BAP egy keverknyelv, mivel fknt Pascal, C, Basic s PERL
  nyelvekbl tvett parancsokat tartalmaz - kisebb-nagyobb mdostsokkal.
  Sokkal egyszerbben s gyorsabban lehet BAP-ban programozni, mint
  assembly-ben, de a magasszint nyelvekkel ellenttben a program pontosan
  ugyanolyan gyors s rvid lesz, mintha tisztn assemblyben rtk volna.
     A fordt kzvetlenl Assembly (.ASM) forrskdot generl, mely utna
  sokfle clra felhasznlhat, pl. futtathat programm fordthat,
  vagy bepthet ms nyelv (pl. WATCOM C) programokba.

  Mg valami: ebben a lersban is, meg mshol is tbbfle nven szerepel
  ez a program. Ennek oka az, hogy a kezdetben BAssPasC nv fokozatosan
  vltozott, elszr BASPASC lett, majd BAPC, most mr fleg csak BAP-knt
  emlegetik. Ha gy haladunk, ez lesz a "B" nyelv... :-)
  A "hivatalos" megnevezse "BAPC3". A verziszm azrt kerlt bele a nvbe,
  mert az egyes verzik kztt nagysgrendnyi klnbsg van, s sajnos egy
  kevs inkompatibilits is (ami ltalban a rgi bug-ok vagy korltozsok
  kijavtsbl addik).

                        2. Telepts
                       

  A telepts nem bonyolult. Mivel ezt a lerst olvasod, valsznleg
  mr sikeresen kitmrtetted a programot. Ha mgsem, akkor tvedtem. :)
  Fontos: rd t a .CFG s a .BAT file-okban a path-okat a megfelelre,
  s mr megy is!

        2.1. A file-ok
       
    Lsd a LIST-???.TXT-kben.       #####

        2.2. A BASSPASC.CFG belltsai
       

    Lsd a CFG-FILE.TXT-ben.       #####

        2.3. A BAPC3.EXE parancssora
       

     BAPC3.EXE [kapcsolk] [source[.bp3] [dest[.asm] [errorfile]]]

     lsd rszletesen a CMDLINE.TXT-ben           ###


        2.4. A BAPC s a TASM
       

      A fordt TASM hasznlatt felttelezi, br tervezzk a MASM verzi
      elksztst is (csak ha van r igny).
      Viszont a TASM verzik sem kompatibilisek, ezrt ha nem TASM v3.0-s
      fordtt hasznlsz, akkor javasolt a TASM /UT300 opcija, ez
      bekapcsolja a 3.0-s verzi emullst. Egyetlen klnbsg (amit mi
      szrevettnk) hogy a 3.0-snl jabb TASM-ok mskpp kezelik a
      szegmensmegadst:
        TASM 3.0           -  MOV AX,[ES:DI]
        jabb TASM s MASM -  MOV AX,ES:[DI]
      Ez gyakorlatilag a BAP fordtnak mindegy, de a LIB-ekben a 3.0-s alak
      volt hasznlva, gy a LIB-eket hasznl programok fordtsval gondok
      lehetnek /UT300 nlkl!
      Msik lehetsges megolds a BAPC /MASM kapcsoljnak hasznlata  ###
      fordtskor, ez elvileg kijavtja a szegmenscmzseket.

        2.5. A BAPC s a NASM      ########
       

      A BAPC3 2 mdon is tmogatja a NASM assembert:
      NASM md:  (/NASM kapcsol vagy .NASM a forrs elejn)
        Ez teljesen NASM forrst fordt, teht a generlt asm forrs
        kzvetlenl fordthat a NASM-al. Htrnya hogy a BAPC forrsban
        tallhat asm elemeknek (pl. cmzsek!) is NASM szintaxisnak kell
        lenni, ami pl. a LIB-ekre egyltaln nem igaz.
      T2N md:  (/T2N kapcsol vagy .T2N a forrs elejn)
        A fordt TASM-NASM vegyes forrst kszt, elksztve az
        ASM2NASM programmal val konvertlsra. A fordts ilyenkor 3
        lpsben trtnik:  BAPC3 -> ASM2NASM -> NASM
        A BAPC forrsban hasznlhat TASM s NASM szintaxis is.

      Megjegyzem, hogy a BAPC3 a TASM-al val hasznlatra van optimalizlva,
      s tesztelve, gy sok problma akadhat a NASM hasznlatakor.  Ezeket
      ha jelzed, megprbljuk javtani, illetve te is megteheted az ASM2NASM
      trsval (forrsa mellkelve vagy ESP-team homepagerl letlthet).
      Mindenkpp a T2N mdot javaslom, mivel a NASM mdban nagyon sok
      funkci nem vagy hibsan mkdik, s a LIB-ek se hasznlhatak.


             3. A BAP nyelv programok felptse
            

      A fordt (majdnem) minden Assembly-utastst, parancsot s
  direktvt elfogad, s vltoztats nlkl tteszi az ASM-llomnyba.
  gy amg nem tudjuk hasznlni a BAP bizonyos rszeit, nyugodtan
  megrhatjuk azt a rszt Assembly-ben.
     Kt zemmdja van a fordtnak: ASM- s BAP-zemmd. Alaprtel-
  mezs szerint a BAP-zemmd rvnyes, itt hasznlhatjuk keverve az
  Assembly-t s a BAP-ot. ASM-mdban pedig csak az Assembly-t, bveb-
  ben lsd mg a fordtsvezrlsi utastsoknl (4. fejezet)



        3.1. A program szerkezete
       

      A kvetkezkben egy ltalnos programformtumot mutatunk be.
  A relcis jelek ( "<" s ">" ) kz tett adat egy paramtert jelent,
  teht a helyre majd a programban egy konkrt adatot kell rni;
  a szgletes zrjel pedig elhagyhat paramtert jelent.


   ; [Megjegyzs]                            Brhova tehetnk megjegyzst

   .x86 vagy .80x86                          Ez fordtja bele a fejlcet

   USES <1.knyvr [, 2.knyvtr [,...] ] >  LIB kiterjeszts knyvtrakat
                                             hasznlhatunk
   INCLUDE <1.header.H [, 2.header [,...]>   Bizonyos LIB-ek ignylik a
                                             header (*.H) file-okat is.

   <Programtrzs>

   [...]                                     A fprogram utastsai

   [EXIT]                                    Kilps a programbl.

   [ <Eljrs1>::
     [...]
     ret
   ]

   [ <Eljrs2>::
     [...]
     ret
   ]

   [...]

   [ INCLUDE file1[,file2...] ]              Kln file-ban tallhat
                                             eljrsok

   [ INCLUDEDx file1[,file2...] ]            Szksges binris adatfile-ok

   Megjegyzs: ez csak egy ltalnos plda volt, a legtbb parancs brhova
               rhat.

   Pldul: a klasszikus Hello World kir program:

       .386
       WRITELN'Hello World!'
       EXIT

     Ezen kvl a program szerkezete az Assembly nyelv programokval
  egyezik meg, teht ugyanolyan szablyai vannak pl. az eljrsok el-
  helyezsnek, az Assembly-makrknak (de clszerbb a BAP makrit
  hasznlni), a ciklusszervezsnek, stb.

  Megjegyzst a kvetkezkppen is elhelyezhetnk a programban:
    .COMMENT        ; Innentl kezdve nem kell lefordtani
    [...]
    .ENDCOMM[ENT]   ; Comment vge, jra fordtand rsz jn
  (Ez a lehetsg fknt hoszabb programrszletek kiiktatsakor hasznos)

  Ezen kvl hasznlhat a C nyelvbl megszokott jellsmd is:      ###
    /*  megjegyzs  */


        3.2. Lehetsgek
       

    Programsorok:
    ~~~~~~~~~~~~~
     A BAP-szintaktika s az ASSEMBLY-ben megszokott kzti legnagyobb
  klnbsg, hogy a BAP tbb utasts hasznlatt is megengedi egy sor-
  ban. Ennek kvetkeztben az sszetartoz utastsok egy sorba ssze-
  vonhatak, s a forrsprogram ttekinthetbb vlik. Az egyes utast-
  sokat a // vlasztja el egymstl.

  pl.:                  MOV AX,10 // MOV BX,10
  vagy BAP-osabban:     AX:=10//BX:=10

  Ennek a ksbbiekban az n. egszsoros utastsoknl lesz nagy
  jelentsge, pl. PUSH(), REP(), THENCMD, DO...

    Tbb sorba rt egy sor:
    ~~~~~~~~~~~~~~~~~~~~~~~
  Mint az ANSI C-ben, lehet egy utastst vagy akrmit tbb sorba
  is rni, ekkor a kvetkez sorokat \ jellel kell kezdeni. (nem
  lehet eltte space vagy tab!!)  Nhny plda:

        IF (AX=7 AND BX=6)
      \ OR (AX=6 AND BX=7)
      \ THENCMD !Rutin

        vagy:

      WRITELN'Ez egy tbbsoros szveg',13,10,
      \'amiben ez a 2. sor!'

  Megjegyzs: a teljes hossz legfeljebb SORMAXSIZE hossz lehet!   ###
  (a SORMAXSIZE konstans rtkt az BAPC3 /INFO paranccsal lehet kiiratni)


    Eljrsok:
    ~~~~~~~~~~
  Deklarci:
       <Eljrs>::
       [...]
       [ret]

  Vagy a hagyomnyos mdon:
       <Eljrs> PROC [NEAR]
       [...]
       <Eljrs> ENDP
  Megj.: a NEAR sz elhagyhat, ilyenkor a fordt ptolja!

  Megjegyzs: a :: s a PROC-os deklarci ellltja ^ rtkt, ezrt   
  ha ez nem lenne clszer, akkor <Eljrs>:. -al is deklarlhatjuk.    ###
  Ez fknt tbb belpsi pontos rutinoknl clszer.


  Eljrshvs:
       !<Eljrsnv>
  A fordts eredmnye: Call <Eljrsnv>


        3.3. Korltok        ######
       

  Korltozva van a BAPC nyev sor maximlis hossza, valamint
  a cimkk szma, utastsmlysg.  Mivel ezek a korltok
  a fejleszts sorn srn vltoznak, a pontos rtkeket
  az aktulis verzi INFO parancsval nzhetjk meg:
       BAPC3.EXE /INFO                                        ######


                4. Fordtsvezrl utastsok    #########
               

        lsd a CONTROLL.TXT-ben!!!!!!!



                      5. Alapok
                     

        5.1. rtkad utastsok
       

     ltalnos alak: "aa:=bb"
  lefordtva:
   - ha aa=bb, akkor semmi  (pl. MOV AX,AX-nek nincs rtelme)
   - ha sizeof(aa)<>sizeof(bb) akkor "MOVZX aa,bb"  (pl. ECX=DH)
   - ha bb=0 s aa=regiszter akkor "XOR aa,aa"  (pl. AX:=0)
   - egybknt "MOV aa,bb"   (pl. AX:=3)

  'bb' lehet HI:LO formtum is, azaz kln adjuk meg az adat fels
  felt s az als felt, ":"-tal elvlasztva.
  Pl.:  "AL:=3:8"  egenrtk az "AL:=16*3+8"-utastssal.
  Megjegyzs: ha aa nem regiszter, akkor nem fogja tudni a hosszt,
  ezrt 16 bitesnek felttelezi!

  Szegmensregiszter rtkads:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Szegmensek esetn hasznlhat a vermen keresztli rtkads is,
  pl.:  ES=0B800h   ezt a fordt PUSH 0B800h//POP ES -nek fordtja.
  vagy pl.: DS=CS
  Erre azrt van szksg, mert az assembly nyelvben nem mkdne a
  MOV ES,0B800h vagy a MOV DS,CS utasts.

  Mutat rtkads:
  ~~~~~~~~~~~~~~~~~
  regiszter->ahova_mutat
  Pl: DX->FILENAME  (ASM-ben:  LEA DX,FILENAME)

  Ha nincs a -> utn semmi, akkor a kvetkez indirect-vltskor
  ltrehozott cimkre fog mutatni, pl:  DX->//VAR PUFFER:DB*8192
  ( DX->PUFFER // VAR PUFFER:DB*8192 )

  Ugyanez az OFFSET-re is igaz, pl: AX:=OFFSET//CONST VALAMI:DD=1234

  Megjegyzs: a v3.0+ verzikban a CONST s VAR eltt kzvetlenl is  ###
  lehet a ->, nem kell kz //-t tenni!

  Kzvetlen regiszter-rtkads:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pl.: DOS #(4c00h,BX=CX,,0,SI=7,ofs TABL)
hatsa:
   MOV AX,4c00h
   MOV BX,CX
   XOR DX,DX   ; A MOV DX,0-T OPTIMALIZLTA
   MOV SI,7
   MOV DI,OFFSET TABL
   INT 21H
Ha egy sorban #(-t s )-t tall, akkor a kzte lv dolgokat, mint
kzvetlen rtkadst rtlemezi a fordt:
1. pl.: #(4C00h)
 ekkor nincs regiszter megadva, teht a soron kvetkez regiszterbe
 kerl az adat.  (AX-rl indul a szmols)
regiszterek sorrendje: (default: AX)
  EAX,EBX,ECX,EDX,ESI,EDI,EBP
  AX,BX,CX,DX,SI,DI,BP
  AL,BL,CL,DL,AH,BH,CH,DH
  ES,DS,FS,GS
  - ha kt , kztt nincs semmi, akkor az annak megfelel regiszterrel
    nem csinl semmit: #(8,,5) -> AX:=8,CX:=5 de BX rtke nem vltozik!
  - ha valamelyik regiszternek 0 rtket adunk, akkor azt a fordt
    MOV helyett XOR-ral fordtja (gy rvidebb)
2. pl: #(BX=7) vagy #(BX:=7)
  itt volt regiszter, teht ebbe kerl az adat (MOV BX,7 lesz az .ASM-ben)
  Ha ez a regiszter megtallhat a fenti regiszter-sorrend-listn, akkor a
  regiszterszmll automatikusan rll:
  pl.: #(BX=7,8) akkor BX=7 s CX=8 lesz, s a reg.szmll a DX-re
       fog mutatni.


  mem->mem rtkadsok:
  ~~~~~~~~~~~~~~~~~~~~~
    RMOV dest,src        =>  AX:=src//dest:=AX
    RMOV dest:=src       =>  AX:=src//dest:=AX
    SMOV dest,src        =>  PUSH src//POP dest
    SMOV dest:=src       =>  PUSH src//POP dest
    RMOV(reg) dest,src   =>  reg:=src//dest:=reg
    RMOV(reg) dest:=src  =>  reg:=src//dest:=reg
  Megj.: lehet kzvetlen a ) utn is rni, csak gy ronda (de kdik)  ###
         pl.: RMOV(AX)CIMKE1:=CIMKE2

  LDD, LDDM, SDD, SDDM utastsok:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 LDD[M] op1:op2,op3  ; op1:=HI(op3) s op2:=LO(op3)  ;32 bites adat sztbontsa
    LDD: veremen keresztl: PUSH op3//POP op1//POP op2
    LDDM: memriaindexelssel: MOV op2,WPT op3 // MOV op1,WPT op3[2]
 SDD[M] op3,op1:op2   ; op3:=(op1 SHL 16)+op2        ;32 bites adat sszeraksa

 Megj.: a vermen keresztliekkel (SDD,LDD)  MEM->MEM is lehet!


        5.2. Matematikai s logikai utastsok
       

        BAP:       ASM:      funcki:

       ++aa      INC aa     aa=aa+1        nvels 1-el
       --aa      DEC aa     aa=aa-1        cskkents 1-el
       aa+=bb    ADD aa,bb  aa=aa+bb       hozzads
       aa-=bb    SUB aa,bb  aa=aa-bb       kivons
       aa&=bb    AND aa,bb  aa=aa AND bb   logikai S
       aa|=bb    OR  aa,bb  aa=aa OR bb    logikai VAGY
       aa?=bb    CMP aa,bb  aa ? bb        sszehasonlts
       aa<>bb   XCHG aa,bb  aa<=>bb        csere

       Megjegyzs: a <> (csere) mkdik akkor is ha egyik sem regiszter,
       ilyenkor a veremen keresztl csinlja. Pl: DS<>ES,  MEM1<>MEM2

       >>aaa     SHR aaa,1
       <<aaa     SHL aaa,1
       aaa>>n    ROR aaa,n
       aaa<<n    ROL aaa,n
       aaa>0>n   SHR aaa,n
       aaa<0<n   SHL aaa,n
       aaa>C>n   RCR aaa,n
       aaa<C<n   RCL aaa,n

     Paramterelhagysok:
     ~~~~~~~~~~~~~~~~~~~~
 Bizonyos utastsoknl nem kell felttlenl az sszes
 paramtert megadni:
 1. SHR,SHL,RCR,RCL,ROR,ROL,SAR parancsoknl a ,1 elhagyhat
     (pl: SHL AX = SHL AX,1 )
 2. XOR,ADD,SUB,OR,TEST,AND parancsoknl egy paramter esetn
 ugyanaz mindkett
     (pl: XOR AX = XOR AX,AX )


        5.3. Rvidtsek
       

    SH  = SHORT
    OFS = OFFSET
    BPT = BYTE PTR
    WPT = WORD PTR
    DPT = DWORD PTR
    QPT = QWORD PTR
    TPT = TBYTE PTR


        5.4. Cimkk
       

 Automatikus cimke-generls:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    @:  ; ez generl egy cimkt, melyre a @ vagy @n szimblummal
    lehet hivatkozni.  A @n esetn n a relatv sorszmot adja meg:
      @0 = @ = elz @:
      @1 = kvetkez @:
      @-1 = elz eltti @:
    Jl hasznlhat pl. ciklusszervezsnl:  @: ciklusmag // LOOP @

 MULTIKUKAC:
 ~~~~~~~~~~~
   Mostmr a @:-on kvl van @A:...@Z: is, s mind kln szmllval.
   gy sszesen 27 kukaccal gazdlkodhatunk! :-)
   Remlem ennyi mindenkinek elg lesz...
   pl:
   JMP @A1 >Ŀ
   @:       <Ŀ 
   CX:=10           
>@A:      <
  !RUTIN//JNZ @ 
LOOP @A

 Loklis cimkk: ^
 ~~~~~~~~~~~~~~~~~
 rtkads:
    - WITH cimkenv      ;  ^ = cimkenv
    - ENDWITH            ;  ^ = WITH eltti cimkenv
    - name::             ;  ^ = name  (szubrutin neve)
    - name PROC [NEAR]   ;  ^ = name  (szubrutin neve)
    - name ENDP          ;  ^ = PROC eltti cimkenv
  Megj.: a cimkenvhez mg hozzaddik egy _ (alhzs) jel is: ^ = cimke + '_'
  Pl.:  RUTIN:: JCXZ ^VEGE//...//^VEGE: RET
  Lnyege: ugyanaz a cimkenv elfordulhat tbb szubrutinban is (pl.: ^VEGE:)
  Megj.: a WITH az utols 32 cimkre emlkszik, s egy cimke max.
  128 karakter hossz lehet.
  Megj.: a BAP v2.32-tl kezdve mkdik a WITH..DO is:
    pl.  WITH ATTRIB DO CX:=^HIDDEN+^SYSTEM+^SUBDIR
    Itt hasonlan a WHILE..DO-hoz a sor vgig lesz rvnyes a WITH utasts
    teht a "WITH xx DO yy" megfelel a "WITH xx//yy//ENDWITH"-nek!
    Megj.: a DO elhagyhat, teht  WITH ATTRIB CX:=^HIDDEN+^SYSTEM+^SUBDIR
           is elegend!

 tdefinlhat cimke: ~
 ~~~~~~~~~~~~~~~~~~~~~~
  rtkads:  ~=cimkenv
  A kvetkez ~= -ig nem vltozik meg, teht fggetlen a szubrutinoktl.
  Ez jl hasznlhat pl. a LIB-ekben, mikor az adott LIB-ben mindentt
  knnyen hozz kell frni ugyanahhoz a vltozhoz, de lehetleg az ne
  zavarja a tbbi LIB-et vagy ms programrszeket.

 Soreleje-cimke: 
 ~~~~~~~~~~~~~~~~~
  Ez a BAPC v2.3 ta ltez lehetsg a rvid ciklusok rst knnyti meg.
  Ugyanis a "@: ciklusmag//LOOP @" sor helyett elg a "ciklusmag//LOOP " is.
  A fordt a sor elejre generl egy cimkt, s a sorban tallhat -ek
  helyre azt helyettesti be. Ez all egyetlen kivtel a PUSH() utasts,
  mikor ez a mdszer hibs programot eredmnyezne, ezrt ilyenkor a
  PUSH() utn rakja a cimkt:
   STOSW//LOOP //PUSH(DI) LODSB//++CX//JNZ //PUSH(SI) LODSB//STOSW//LOOP 
   <           <           <

  Pl.: PUSH(BX) !RUTIN//--BX//JNZ 
  Lefordtva:
    PUSH BX
      cimke:
        !RUTIN
        --BX
      JNZ cimke
    POP BX

 Specilis cimkk:
 ~~~~~~~~~~~~~~~~~
   ENDIF mint cimke: a kvetkez ENDIF-re ugrik
   RET, RETC, RETS : az elz (vagy ha nincs, akkor a kvetkez)
                     ilyen utastsra ugrik


        5.5. Vltozk
       
  A tiszta ASM nyelvben a vltozkat elklntve a kdtl, egy helyre rtuk,
  valahogy gy:
      VALTOZO1 DW ?
      VALTOZO2 DD ?
      VALTOZO3 DD ?
      TOMB DB 256 DUP(?)
      ...

  A BAP lehetv teszi, hogy a vltozkat a kd kz rjuk.
  A vltozk megadsa kicsit a PASCAL nyelvre emlkeztet mdn trtnik.
  Az elz plda BAP-ban:
      VAR VALTOZO1:DW
      VAR VALTOZO2,VALTOZO2:DD
      VAR TOMB:DB*256
  A VAR utastsokat brhov rhatjuk, nem kell egy helyre, a kd utnra
  sszegyjteni. Ez lehetv teszi hogy kzvetlenl az inicializl
  rtkads mell tegyk:  VAR VALTOZO:DW // VALTOZO:=kezdrtk
  Ezt sokkal egyszerbben is rhatjuk: VAR VALTOZO:DW=kezdrtk
  St, ha a kezdrtk egy regiszterben van, akkor a tpus is
  elhagyhat, s pl. VAR TEMP_AX=AX is elg, ez a gyakorlatban
    VAR TEMP_AX:DW//TEMP_AX:=AX-nek felel meg.
  Ha a vltoz egy mutat, akkor a kezdrtk gy is megadhat:
    VAR MUTATO->AMIRE_MUTAT
  Ez a VAR MUTATO:DW//MOV MUTATO,OFFSET AMIRE_MUTAT-nak felel meg...
  Megjegyzs: tmbnek is adhat kezdrrtk, de az csak a tmb els
  rekordjba kerl be, nem tltdik fel vele az egsz tmb.

  Megj.: A vltozk a VAR nev indirect-be kerlnek.
  Kivve, ha a .VARIND=valami -vel tdefinltuk az indirect-nevet.

        5.6. Konstansok
       
  A tiszta ASM nyelvben a konstansokat elklntve a kdtl, egy
  helyre rtuk, valahogy gy:
      KONSTANS1 DW 1234
      KONSTANS2 DB 'Hello world!'
  A BAP lehetv teszi, hogy a konstansokat a kd kz rjuk.
  Ez a BAPC-ban gy nz ki:
      CONST KONSTANS1:DW=1234
      CONST KONSTANS2='Hello world!'
   (STRING ESETN A TPUS ELHAGYHAT)

  Megj.: A konstansok a CONST nev indirect-be kerlnek.

        5.7. Stringek
       
  Stringek ltrehozhatk az utastsok paramtereknt is, nem kell ket
  kln nvvel elltva a konstansok kz rni.
  Pl: WRITE 'Hello world'
  Ez ASM-ben gy nzne ki:
    ; kd:
    LEA DX,cimke
    MOV AH,9
    INT 21h
    ...
    ; konstansok:
    cimke DB 'Hello world',36

  Specilis esetekben is hasznlhatunk ilyen string-megadst, az STROFS
  segtsgvel:
    DX:=STROFS'Hello world',36
  vagy mg egyszerbben:
    DX->'Hello world',36

  Megjegyzsek:
    - az STROFS helyett OFSSTR is rhat
    - a -> -as megads csak akkor hasznlhat ha utna ' kvetkezik, mg az
      STROFS-etet szmok is kvethetik:  SI:=STROFS 13,10,'Hello',13,10,36
    - Az gy ltrehozott stringek a TEXT nev indirect-be kerlnek.

        5.8. Szegmens-prefixek:
       

   CS:,DS:,ES:,FS:,GS:,SS:  ezeket 'DB nn'-nek fordtja le,
   gy minden(!) parancs eltt hasznlhat.
   Pl.: ES:LODSB   (ez ASM-ben gy lenne: LODS BYTE PTR [ES:SI])
   Vigyzat! az ES: szegmens nem definlhat t! (STOSx,SCASx)

        5.9. Kd-ismtls:
       
   Formtuma:  REP(hnyszor) mit
   A "mit"-et fordtja le egyms utn "hnyszor"-szor.
   Pl:  REP(16) STOSB//AL+=3
   A "hnyszor" decimlis vagy hexa szm kell legyen, cimke vagy ms
   nem lehet!

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 6. Utastsok $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

        6.1. Feltteles utastsok
       

    Felttelek:
    ~~~~~~~~~~~
      lsd rszletesen a CONDITIO.TXT-ben!!!!!        ######

    THEN cimke -szerkezet:
    ~~~~~~~~~~~~~~~~~~~~~
       A felttel teljeslsekor ugrik a cimke-re:
       IF felttel THEN cimke

    THEN/ELSE/ENDIF -szerkezet:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
       - az ELSE nem ktelez
       - a THEN nem ktelez (elg csak: IF felttel)
       - max. 64 szintig lehet egymsba rakni IF-eket
       IF <felttel> THEN
          [parancsok...]
          [...]
       ELSE
          [parancsok...]
       ENDIF

    THENCMD-szerkezet:
    ~~~~~~~~~~~~~~~~~~
       IF <felttel> THENCMD <parancsok...>
       ezt rvid parancsoknl hasznlhatjuk, pl:
       IF AX>CX THENCMD AX:=CX
       megj.: a THENCMD-tl a sor vgig (s nem a //-ig!)
       tartozik az IF-hez.!
       A gyakorlatban az IF <felttel> THENCMD <valami> gy fordtdik:
         IF <felttel> THEN
           <valami>
         ENDIF
       ezrt megengedett az ELSE hasznlata is a THENCMD utn is!
       Pl: IF AX=5 THENCMD WRITELN'AX=5'//ELSE WRITELN'AX<>5'

       Megjegyzs: v3.0+ verziktl a THENCMD helyett DO is hasznlhat: ###
         pl.: IF AX>CX DO AX:=CX

    CASE utasts:
    ~~~~~~~~~~~~~~
  Pl.:  CASE AL OF
        1,3,^XYZ: NOP           ; THENCMD-tpus
        128:                    ; THEN..ENDIF tpus
          PARANCS1//PARANCS2    ; Akrhny sor r6, a vgt "END" jelzi!
          PARANCS3//END
        'A'..'Z':>RUTIN         ; a RUTIN-ra ugrik
        ELSE
          Ez itt az ELSE terlet!  ; ha a fentiek kzl 1 se teljeslt...
        ENDCASE
  Megj.: a CASE s ENDCASE kztt (kivve ha END-el lezrt rsz van)
  az els  kettspont eltti dolgok mint felttel mennek,  pl.:
  "abc: parancsok"  ez egyenrtk az  "IF case_var IN[abc] THENCMD
  parancsok"-kal!     (ahol case_var a CASE s OF kzti valami)
  Teht a : elttiekre az IN[..]-nl lertak rvnyesek!
  A "abc:>cimke"-bl "IF case_var IN[abc] THEN cimke" lesz!

        6.2. Ciklusszervezs
       

      Elltesztel ciklusok:
     ~~~~~~~~~~~~~~~~~~~~~~
   Amg a felttel igaz, addig ismtli a ciklusmagot.
   Megj.: a <felttel>-re az CONDITIO.TXT-ben lertak vonatkoznak! ###

   WHILE/ENDWHILE szerkezet:
      WHILE <felttel>
        <parancsok...>
      ENDWHILE

   WHILE/DO szerkezet:
      WHILE <felttel> DO <parancsok...>
      vagy
      WHILE <felttel> DOCMD <parancsok...>


     Htultesztel ciklus:
     ~~~~~~~~~~~~~~~~~~~~~
   REPEAT/UNTIL szerkezet:
      REPEAT
        <parancsok...>
      UNTIL felttel
   A ciklus mindenkpp vgrehajtdik egyszer, s amig a
   felttel hamis, addig ismtli. (Ha a felttel igaz, akkor ll le)


     Nvekmnyes ciklusok:
     ~~~~~~~~~~~~~~~~~~~~~
   1. Egyszer LOOP-os ciklusok:
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      LOOP(size) valami//valami2//...
      LOOPF(size) valami//valami2//...

   A LOOPF az elejn megnzi egy JCXZ-vel, hogy lefuthat-e.
   A 'size' kerl a CX-be, ez lesz a ciklusszm.

   2. FOR utasts:
   ~~~~~~~~~~~~~~~~
   2 alaptpusa van, a CMP-s s a LOOP-os tpus.  Mindkett
   FOR-al kezddik, s a ciklusmag vgt NEXT parancs jelzi!

   1. FOR[P][F][E][An] a[:]=b [DOWN]TO c [STEP x] [DO cmd1//cmd2...]
      F=forward (elltesztels)
      S=signed  (a szmok eljelesek)
      E=EQU (hogy elrje-e 'a' a 'b'-t)
      P=push a  (a ciklusmag idejre lementi a rtkt a verembe)
      An = .ALIGN n  (csak sebessgre optimalizlt kdban hasznlatos)

      - a TO = elre szmol, a DOWNTO htra.
      - ha van megadva STEP x akkor a nvekmny x lesz (a:=a+x)
      - ha van megadva DO akkor a DO utni rsz a ciklusmag, s nem kell
        NEXT a vgre.

      Mkdse: a futs sorn 'a' rtke folyamatosan halad 'b'-tl      ###
      'c' fel, az E flag esetn el is ri azt. Lpskze TO esetn +1,
      DOWNTO esetn -1, STEP esetn pedig 'x'

   2. Alakja:                                 #############
 FOR[P]L[P][An][F][S][([lr,]lc)] a:=b [TO|DOWNTO|STEP x] [DO cmd1//cmd2...]
      P=push a   (az L eltt) - elmenti 'a'-t
      L=loop     (ktelez paramter)
      E=hogy elrje-e a ciklusszmll a 0-t  
      P=push CX  (az L utn)  - elmenti a ciklusregisztert
      An = .ALIGN n
      F=forward test - ha a ciklusszm 0, akkor nem fut le egyszer sem
      S=short  (a  --CX//JNZ  helyett LOOP utastst hasznl, max. 128
                byte hossz ciklusmaghoz)
      lr=loop register, ciklusregiszter. default: CX/ECX     (v3.0a17+) ###
      lc=loop counter,  ciklusszam, a ciklusregiszter kezdrtke lesz.

      Mkdse: a futs sorn 'a' rtke folyamatosan halad 'b'-tl,  ###
      lpskze TO esetn +1, DOWNTO esetn -1, STEP esetn pedig 'x'.
      A ciklusregiszter (lr) folyamatosan szmol a ciklusszmtl (lc)
      1-ig, illetve az E flag esetn 0-ig.
      MEGJ.: ha E flag is van, lc+1-szer fut le a ciklusmag!

   Megjegyzs: az opcik sorrendje mindegy, kivtel a P s L viszonya.

   Pl.
   Hibs:
     FOR a:=b
     FORL a

   J:
     FORPL a
       @: PUSH a//...//POP a//loop @
     FORL a:=5
       MOV a,5//@:...//LOOP @
     FORL a TO
       @: ...//++a//LOOP @

        6.3. sszetett veremkezels:
       

  1. PUSH r1,r2,r3... s POP r1,r2,r3...
     (nem kell a sorrendet megfordtani)

  2. specilis rtkek:
     ALL = PUSHA         (pl.: PUSH ALL,FL,CIM1)
     AD  = PUSHAD
     FL  = PUSHF
     FD  = PUSHFD
     AS  = PUSH ALL,DS,ES

  3. egsz soros utasts:  PUSH(r1,r2,...) xxxx
     ez az xxxx parancsok idejre menti le a verembe az
     r1,r2,... vltozkat
     ( PUSH r1,r2,...//xxxx//POP r1,r2,...)

  4. Ha csak egy 'PUSH' van (nincs utna semmi) akkor az utols
     PUSH parancs paramtereit rja utna, teht pl. a PUSH AX//PUSH//
     az AX-et 2szer menti le!

     Ha csak egy 'POP' van (nincs utna semmi) akkor a megfelel
     PUSH parancs paramtereit rja utna, teht
     pl. a PUSH AX//POP// lementi majd visszatlti az AX-et!

     A PUSH/POP 32 szintig 'emlkszik', s max. 63 karakter
     hossz sort ment el!

     Pl.:

       PUSH AX//PUSH//PUSH ^CIMKE   =>  PUSH AX//PUSH AX//PUSH ^CIMKE
       utna:
       POP//POP//POP   =>  POP ^CIMKE//POP AX//POP AX


        6.4. Billentyzet s kpernykezels
       

    Billentyzetkezels:    ; kimenet: AH=scan-kd AL=ascii-kd
    ~~~~~~~~~~~~~~~~~~~~
  WAITKEY       ; XOR AX//INT 16h     vrakozs 1 billentyre
  READKEY       ; AH:=1//INT 16h      puffersttusz lekrdezse
  READSHIFT     ; AH:=2//INT 16h      SHIFT/CTRL/ALT gombok llapota
  GETKEYn       ; AH:=n//INT 16h      az elz 3 utasts ms alakban

    Pozcionls a kpernyn:
    ~~~~~~~~~~~~~~~~~~~~~~~~~
  GOTOXY x,y         ; DL:=x//DH:=y//GOTOXY
  GOTOXY y:x         ; DX:=y:x//GOTOXY
  GOTOXY
  WHEREXY            ; x => DL  y => DH

    Kpernyre rs:
    ~~~~~~~~~~~~~~~~
  WRITE'string'      ; sztring kirsa
  WRITELN'string'    ; -//- s soremels
  WRITELN            ; csak soremels
  WRITESTR cimke     ; = DX->cimke//WRITESTR
  WRITESTR           ; = DOS 9
  WRITECHR c1,c2,,c3 ; karakterek kirsa. ha ,, kzt nincs semmi,
                     ; akkor az elzt ismtli

  Megj.: a karakterkir parancs tdefinlhat:
    .FC opci:    FastChar, ekkor a kirst az INT 29h vgzi
    .CHARCMD=xxx: felhasznl ltal definlt kir rutin (pl: AH:=15//STOSW)


        6.5. File-parancsok
       

   ltalnos formtum:  FILExxx [VAR] [handle]
   A 'handle' a file-vltoz neve, a VAR pedig azt jelezheti, hogy
   ezt a fordtnak kell ltrehoznia, nem neknk.  Parancsok:

   Megnyits:
   ~~~~~~~~~~
     FILEOPEN   =  DOS 3D00h[//handle:=AX]    filenyits olvassra
     FILEOPENR  =  DOS 3D00h[//handle:=AX]    filenyits olvassra
     FILEOPENW  =  DOS 3D01h[//handle:=AX]    filenyits rsra
     FILEOPENRW =  DOS 3D02h[//handle:=AX]    filenyits rsra s olvassra
     FILEOPENP  =  DOS 3D10h[//handle:=AX]    vdett filenyits olvassra
     FILECREATE =  CX:=20h//DOS 3Ch[//handle:=AX]  file ltrehozsa

   Kezels:
   ~~~~~~~~
     FILEREAD   =  [BX:=handle//] DOS 3Fh     blokk olvassa
     FILEWRITE  =  [BX:=handle//] DOS 40h     blokk rsa
     FILECLOSE  =  [BX:=handle//] DOS 3Eh     file lezrsa
     FILECALL   =  [BX:=handle//] DOS         ltalnos filemvelet-hvs
   Megj.: FILECLOSE utn tbb file-vltoz is megadhat. ###

   Pozcionlsok:
   ~~~~~~~~~~~~~~~
     FILEPOS     =  [BX:=handle//] DOS 4200h  file elejhez kpest
     FILEPOS0    =  [BX:=handle//] DOS 4200h  file elejhez kpest
     FILEPOSREL  =  [BX:=handle//] DOS 4201h  relatv
     FILEPOS1    =  [BX:=handle//] DOS 4201h  relatv
     FILEPOSBACK =  [BX:=handle//] DOS 4202h  file vghez kpest
     FILEPOS2    =  [BX:=handle//] DOS 4202h  file vghez kpest

   Specilis pozicionlsok:
   ~~~~~~~~~~~~~~~~~~~~~~~~~
     FILEHOME    =  [BX:=handle//] XOR CX//XOR DX//DOS 4200h  file elejre ugrik
     FILEAPPEND  =  [BX:=handle//] XOR CX//XOR DX//DOS 4202h  file vgre ugrik
     FILEWHATSIZE=  [BX:=handle//] XOR CX//XOR DX//DOS 4202h  DX:AX=file mrete
     FILEGETPOS  =  [BX:=handle//] XOR CX//XOR DX//DOS 4201h  DX:AX=file pozici

   A FILEPOS mint vltoz:   (BAPC v2.32-tl)                ###
   ~~~~~~~~~~~~~~~~~~~~~~~
     FILEPOS:=x  ->  FILEPOS = x
     FILEPOS+=x  ->  FILEPOS = FILEPOS + x
     FILEPOS-=x  ->  FILEPOS = FILESIZE - x  (Teht NEM FILEPOS=FILEPOS-x !!!)
   Megj: "x" mg csak szm tpus lehet, memriavltoz s regiszter mg nem
         megengedett!

   Egyb:
   ~~~~~~
     FILEDELETE  = Trli a file-t
     FILERENAME  = tnevezi a file-t
     MKDIR       = knyvtr ltrehozs
     CHDIR       = knyvtr vlts
     RMDIR       = knyvtr trlse

  Plda egy rvid file kirsra:
  .386
  DX->'filenv',0
  FILEOPEN VAR SZAM               ; Megnyits, nv a DX-ben
  ;
  DX->VAR PUFFER:DB*8192
  CX:=8192
  FILEREAD                        ; Olvass, hely DX-ben, hossz CX-ben
  ;
  SI:=DX
  LOOP(AX) WRITECHR LODSB         ; Kirs a kpernyre
  ;
  FILECLOSE                       ; Lezrs
  EXIT

  Megj: ez a program rszletesen dokumentlva a FILE.BP2 nven
        megtallhat a pldaprogramok kztt!   ### v3.0-ban NEM!

        6.6. Egyb parancsok:
       

   - UPCASE reg  : reg:=UPCASE(reg), a kisbetkbl nagybet lesz.

   - DECODE reg  : reg:=decode(reg), dekdols a .CODE=x,y paranccsal
                   belltott kdokkal.

   - INTCALL xx  : megszakts-rutin hvsa,  PUSHF//CALL DPT xx

   - DOS         : INT 21h   (DOS-funkcik hvsa)
     DOS xx      : AH:=xx//INT 21h
     DOS xxxx    : AX:=xxxx//INT 21h

   - MOUSE xxxx  : AX:=xxxx//INT 33h
     EGERBE      : bekpacsolja az egrcursort
     EGERKI      : kikpacsolja az egrcursort
     GETMOUSE  =>  BX=bill., CX=x  DX=y      egr koordinta lekrdezs
     SETMOUSE  <=  CX=x, DX=y                egr koordinta bellts
     RESETMOUSE vagy INITMOUSE  => AX=0 ha nincs, AX=255 ha van, BX=gombok szma

   - BIOS,
     BIOS xxxx   : VIDEO-BIOS funkcik, AX:=xxxx//INT 10h

   - DOSEXIT,      Kilps a programbl,vissza a DOS-ba...
     DOSEXIT xx  : AX:=4C00h+xx//INT 21h  (xx=visszatrsi rtk)

   - EXIT,
     EXIT xx     : alaphelyzetben ua. mint a DOSEXIT, de ez az
                   .EXIT=xxx paranccsal  tdefinlhat!

   - OUTAL s OUTAX  : OUT DX,AL s OUT DX,AX
   - OUTB p1,p2,...  : AL:=p1//OUTAL//AL:=p2//OUTAL...
                       a paramterek megadsa teljesen megfelel a WRITECHR-nak

   - RETC        = CLC//RET   ; Megj: ezekre cimkeknt is lehet hivatkozni!
   - RETS        = STC//RET

   - ALDIV xx -> DB 0D4h,XX  [Ez a nem dokumentlt utasts az AL-ben lv
            szmot osztja xx-el, a maradk AL-be, az eredmny AH-ba kerl.]
                      >> SPEC. ESET: ALDIV 10  DB D4,0A  AMM <<

        6.7. String-szer utastsok:
       

   STOSxy:    ltalnos alak: STOSxy adat1,adat2...
   ~~~~~~~
   gy rtelmezi, hogy ha STOSxy (ha nincs y, akkor y=x), akkor
     x szerint az utastst: STOSx
     y szerint veszi a regisztert (B->AL, W->AX, D->EAX)
   gy lehet STOSBW,STOSWB,STOSDD, meg minden kombinci is)
   Pl:  STOSWB 'H','W'   =>   AL:='H'//STOSW//AL:='W'//STOSW
   Pl:  STOSB 'H','W'    =>   AL:='H'//STOSB//AL:='W'//STOSB

   OUTB s OUTW, ugyangy mkdnek, mint a STOSx:
   ~~~~~~~~~~~~
     OUTB x1,x2,...  ->  MOV AL,x1//OUT DX,AL//MOV AL,x2//OUT DX,AL...
     OUTW x1,x2,...  ->  MOV AX,x1//OUT DX,AX//MOV AX,x2//OUT DX,AX...

   REP*n:
   ~~~~~~
   a REP prefixnl kzvetlenl megadhat az ismtlsek szma, pl:
   REP*1000 STOSD 0
   lefordtva:
     CX:=1000
     EAX:=0
     REP STOSD

        6.8. Az STDBAPC.H makrkszlet #######          [v3.0+]
       

   A fent lert beptett utastsok folyamatos kivltsra kszlt az
   STDBAPC.H, mely ezek tbbsgt tartalmazza makrk formjban.
   Hasznlatval ezek kirtkelse gyorsabb lesz, s nhny esetben
   az utasts jobban paramterezhet, pl. az UPCASE utn megadhat
   tbb regiszter is, stb. Msik elnye hogy a makrk rtegesen
   egymsra plnek, gy OOP-szeren egy makr mdstsa az azt
   hasznl valamennyi makrra rkldik. Pl. a WRITECHR trsa
   (felldefinlsa) befolysolja valamennyi kir utastst.
   Mindehhez csak egy "INCLUDE STDBAPC.H" sor szksges a prg. elejre.


$$$$$$$$$$$$$$$$$$$$$$$$$$ 7. Modulris programozs $$$$$$$$$$$$$$$$$$$$$$$$$$$$

  7.1. Indirect-ek:
 

  Ez azt jelenti, hogy tbb rszt szerkeszthetnk egyszerre a for-
  rsbl. Teht: ha egy utastst, utastscsoportot { }-ek kz
  helyeznk, akkor a { } kzti rsz egy tmeneti file-ba kerl,
  melynek neve kzvetlenl a nyit zrjel utn irand. Ezeket a
  file-okat a kvetkezkben az .INDIRECT nv1, nv2, ... utastssal,
  vagy egy .INDIRECTALL-lal illeszhetjk be a megfelel  helyen.

  Pl.:
  .386
  WRITELN'ELSO'
  {XYZ WRITELN'HARMADIK' }
  WRITELN'MASODIK'
  .INDIRECT XYZ
  WRITELN'NEGYEDIK'
  EXIT

  Tipikus felhasznlsi terlete:
   - vltozk, konstansok definlsa a kd kzben
   - programrszletek thelyezse
   - inicializcis rutinok megadsa

  Lteznek specilis INDIRECT-ek is:
     VAR   ide kerlnek a vltozk (lsd a VAR parancsnl)
     CONST ide kerlnek a konstansok (lsd a CONST parancsnl)
     TEXT  ide kerlnek a szvegek (lsd WRITE... s STROFS-nl)
     FPUCONST ide kerlnek az FPU miatt generlt konstansok (pl. FLD 5.3) ###
  ezek neve megvltoztathat a .VARIND= .CONSTIND= ... parancsokkal.      ###

  Ezekbe kzvetlenl is rhatunk:
    CONST: DB 'ez a CONST-ba kerl!'
  egy gyakorlati plda:
    VAR: .ALIGN 16

  Fontos megjegyezni, hogy a fordt a program vgre berakja az
  sszes olyan indirectet, amit nem illesztettnk be sehova, a
  sorrend a ltrehozs sorendje, kivve hogy a VAR-al kezdd nev     ###
  indirectek mindig a legvgre kerlnek.

           7.2. Rutingyjtemnyek (LIB-ek) hasznlata
          

 A BAP fordt segtsgvel rutinknyvtrakat is hasznlhatunk,
 melyekbl mindig csak az ltalunk hasznlt eljrsok kerlnek
 lefordtsra.

 Az ilyen rutingyjtemnyek ltalban .LIB kiterjeszts (PMODE-s verzijuk
 pedig .PML kiterjeszts) fileokban vannak, s egy (vagy tbb) kln
 knyvtrban vannak, amit (/amiket) a BASSPASC.CFG file-ban a LIBDIR=
 vltoz ad meg.  A BAP-hoz tartozik egy alap LIB-kszlet, mely az
 sszes fontosabb rutint tartalmazza, a string-mveletektl kezdve egszen
 a grafikai s hangkrtyk programozst segt rutinokig. (lsd 9. fejezet)

 Az jabb (BAP v2.0+ -hoz kszlt) LIB-ekhez ltalban tartozik egy .H
 kiterjeszts file is, ami a fggvnyeket, makrkat, s struktrkat
 tartalmazza, ezeket a program elejn egy INCLUDE paranccsal kell berakni.


 Az ehhez hasznlhat parancsok a kvetkezk:

 CALL eljrsnv   vagy   !eljrsnv
 ~~~~~~~~~~~~~~~          ~~~~~~~~~~~
 Szubrutin hvsa, ha a hvott rutin nem tallhat meg a program
 forrslistjban, akkor az USES-el kijellt LIB-ekben keresi.

 .COMPROC eljrsnv
 ~~~~~~~~~~~~~~~~~~~
 Kri az eljrs befordtst, olyan, mintha CALL lenne, de nem
 fordt CALL utastst.
 ltalban megszaktskezel rutinoknl hasznljuk, melyeket nem
 CALL-al hvunk.

 .DEFPROC eljrsnv
 ~~~~~~~~~~~~~~~~~~~
 Megmondja a fordtnak, hogy az 'eljrsnv' az egy eljrs.
 Ez akkor kell, ha pl. az 'eljrsnv'-et eljrsknt hvjuk, de
 az nem annak van definlva. (pl. cimknek, vagy vltoznak)
 Hasznlata nem ktelez, de ajnlott, ha nem szeretnnk WARNING-
 ot a fordts vgn.
 Pl:
   CALL ROUTINE_PTR
   .DEFPROC ROUTINE_PTR
   VAR ROUTINE_PTR:DW

 USES lib1,lib2...
 ~~~~~~~~~~~~~~~~~
 Ezt az utastst a program elejn javasolt hasznlni, hatsra
 a szksges rutinok a program vgn, vagy az .INDIRECTALL pa-
 rancsnl fognak bemsoldni.

 INCLUDEPROC lib1,lib2...
 ~~~~~~~~~~~~~~~~~~~~~~~~
 A szksges eljrsok a parancs helyn fognak bemsoldni.


                    7.3. INCLUDE file-ok befordtsa
                   

    INCLUDE file.inc [,file2,file3...]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  BAP nyelv file-t/-okat illeszt be.
  Megjegyzs: a fordt elszr az INCLUDE parancsot tartalmaz file
              knyvtrban (ami nem felttlenl az aktulis knyvtr)
              keresi, ha ott nincs akkor pedig a LIB-ek knyvtr(ai)ban.
  Megjegyzs: a header (.H kiterjeszts) fileokat is ezzel szoktuk berakni,
              de a program legelejn.

    INCLUDEDx file.dat (x lehet B=byte, W=word, D=dword, s Q=qword)
    ~~~~~~~~~~~~~~~~~~
  Binris adatfile-t illeszt be DB/DW/DD/DQ-k formjban.

  Ha nem kell az egsz file, megadhat a tartomny is:
     INCLUDEDB filenv[kc,vc]
     ha - eljel a szm akkor a file vghez kpest van megadva
     ha + eljel a VC akkor pedig hozzaddik a KC-hez, azaz a hosszt adtuk
     meg.
   Persze ez az sszes INCLUDEDx-el megy...
   Ha vc>filesize akkor kir egy !!Warning!!-ot is.
   Megjegyzs: a vc az utols byte (s nem az utols utni!!!) cme!
               de pl. INCLUDEDW-nl nem az utols WORD cme, hanem akkor is
               az utols byte...


    CODEINCLUDEDx file.dat
    ~~~~~~~~~~~~~~~~~~~~~~
  Az adatfile-t kdolva illeszti be. (lsd. mg: DECODE reg s .CODE a,b)

    ASMINCLUDE file.asm
    ~~~~~~~~~~~~~~~~~~~
  gy illeszti be az assembly nyelv file-t, hogy nem fordtja le,
  gy gyorsabb lesz a fordts.

                    7.4. BAP Object (BPO)
                   

  A .INC file-bl egy sokkal gyorsabban fordthat, de azzal teljesen
  egyenrtk .BPO file kszthet, ha a fordtt a /BPO kapcsolval
  futtatjuk.
  A ritkn mdostott .INC fileokat teht rdemes .BPO-ra fordtani (egyszer),
  s az "INCLUDE file.INC"-et kijavtani "INCLUDE file.BPO"-ra.
  Megj.: Ha mdostasz az .INC-en akkor neked kell jrafordtanod!!!
  (A fordt szreveszi a mdostst, s figyelmeztet!)

  Ennek csak akkor van jelentsge ha nagyon lass gpen fordtasz, vagy
  nagyon hossz a program forrslistja, klnben nem jelents a gyorsuls.

  Megjegyzs: BPO-ra fordtskor gondoskodni kell, hogy a .H fileok a
  fordtand BPO-ban is INCLUDE-olva legyenek, klnben a makrk nem
  kerlnek lefordtsra. Valamint OOP programokat ne fordtsunk .BPO-ra,
  mert akkor nem rkldnek a makr-vltozsok.

  A .BPO file felptse:
  ~~~~~~~~~~~~~~~~~~~~~~~

  .FILEINFO filename,size,datetime  ; ebbl tudja a fordt ha mdostva lett
  .ASM
  ...    ;A program (.INC) lefordtva ASM-re
  .BAP
  USES xxxx
  .DEFPROC xxx  ;; Hogy a CALL-ok stimmeljenek (ne legyen Proc Not Found)
  .COMPPROC xxx ;; Hogy a .LIB-ek stimmeljenek (lefordtsa, amit kell)
  {indirect1_name  ; Az .IND file-ok tartalma
  .ASM
  ...  ; az .IND file tartalma
  .BAP
  }
  {indirect2_name
  ...
  }
  ...

                    7.5. PACKAGE-k hasznlata
                   

  FONTOS! Ez a funkci mg tesztels alatt ll, s nem mindig mkdik jl.
  gyhogy vatosan hasznlni!!!
  megj.2.: a PACKAGE-k hasznlathoz SZKSGES a 2-menetes fordts! ###

  tvettem a PERL nyelvbl (UNIX-script) a PACKAGE parancsot.
  Lnyege: kijellhetk terletek, s az azon bell definlt vltozk
  nem ltszanak kvlrl! Megknnyti klon rt programok egybeptst,
  nem fognak keveredni a vltoznevek. A cimkkre s makrkra is igaz ez. ###
  Hasznlata:
  .PACKAGE nv   ; a 'nv' nev ltkrzetet nyitja meg
  .PACKAGE OFF   ; kikapcsolja a ltkrt
  .PACKAGE       ; az utoljra hasznlt ltkrt kapcsolja vissza
  .LABEL cimke   ; cimke megadsa, hogy elbb tudjuk hasznlni, mint
                 ; definltuk volna (!! ezzel mg gondok vannak...)

rtelme: ha egy mskor rt programrszletet akarsz beleincludeolni
valamibe, akkor ltalban egy csom azonos nev cimke keletkezik...
Erre j megolds, ha az INCLUDE eltt irsz egy .PACKAGE valami-t s
akkor az fggetlen lesz a tbbitl, teht hiba ugyanaz a cimkk neve,
nem zavarjk egymst.

Plda:
  VAR I,J:DW
  I:=17
  J:=99
  IF AX=7 THEN CIMKE  ; Na, ez vajon melyik CIMKE-re ugrik? Nan, hogy a 2.-ra
  .PACKAGE VALAMI
  VAR I:DW      ; Ez az I vltoz tk fggetlen az elztl
  CIMKE:        ; Cimkket is lehet hasznlni...
  I:=22         ; Vigyzat! Ltkrkben a VAR-nak elbb kell lenni, mint az
  J:=23         ;   els hivatkozsnak
  .PACKAGE OFF  ; Ltkr vge.
  CIMKE:        ; Ez mintha mr lett volna!? Persze, de msik ltkrben.
  BX:=I         ; BX rtke 17 lesz. (nem 22, mert az egy msik ltkrben van)
  CX:=J         ; CX rtke 23 lesz, mivel az nincs jradefinlva a ltkrben
                ; teht az eredeti J vltozra vonatkozott a 2. rtkads is

Msik:
  VAR I:DW  ; Ez legyen az A vltoz
  .PACKAGE AKARMI
  I:=17     ; A:=17
  VAR I:DW  ; Ez a B vltoz
  I:=22     ; B:=22
  ; rthet?  Szval amg nincs jradefinlva egy vltoz, addig az elz
  ; ltszik. Teht az I:=17 az elszr definlt I vltozra vonatkozik,
  ; nem pedig a package-n bellire. Erre val a LABEL:
  ; Ha a .PACKAGE AKARMI utn odairjuk: .LABEL I  akkor mind2 a B-re vonatkozik

Megjegyzs: a ltkrn bell kicsit lasabb a kirtkels, de nem sokkal.
Pl. 600 ltkrben definlt cimknl is csak 3x lett lassabb, pedig az azt
jelenti hogy minden egyes sznl meg kell nzni mind a 600-at.
Ha sok ltkr van, de kevs vltoz egy krben, akkor viszont nagyon gyors.
### v3.0 ez nem igaz!

$$$$$$$$$$$$$$$$$$$$$$$$$$ 8. Makrk s fggvnyek $$$$$$$$$$$$$$$$$$$$$$$$$$$$$

                8. Makrk s fggvnyek
               

  Kezdetben a makr s a fggvny 2 kln dolog volt a BAPC-ban, mostanra
  elgg sszefondott!

  Definlsa:
    #makrnv(bemen_paramterek):kimen_param=utastsok

  Hasznlata:
    makrnv(bemen_paramterek)
  vagy
    makrnv bemen_paramterek

  makrnv  = a makr neve, egy sz legyen, mintha egy cimke lenne

  bemen_paramterek = regiszter vagy cimke, ekkor a megadott bemen
                       paramterek ide fognak msoldni!
                         Pl.:        #MAKRO(CX,EAX,CIM)=!RUTIN
                         hvs:      MAKRO(BX,DH,12)
                         Lefordtva: CX:=BX//EAX:=DH//CIM:=12//!RUTIN

  kimen_paramter = ha a makr fggvny, akkor ez lesz a kimen paramtere
                         Pl.:        #MAKRO(DX):BX=!RUTIN
                         hvs:      CIM:=MAKRO(12)
                         Lefordtva: DX:=12//!RUTIN//CIM:=BX
                     Megj: a %n itt is hasznlhat!

  utastsok = ide kerl a vgrehajtand rsz, ami a bemen paramterek
               s a kimen kz kerl. Elhagyhat, de az = -jelet akkor
               is ki kell rni! ( Pl.: #MAKRO(AX):AX= )

               A bemen paramterek a BATCH-nyelvhez hasonlan %n-en keresztl
               rhetk el, pl. a #MAKRO=BX:=%1  egyenrtk  #MAKRO(BX)= -el!
               Ha hivatkozunk %n-el valamire, amit hvskor nem adtak meg,
               akkor hibazenetet ad. Ezrt a nem ktelez paramtereket
               jellni kell: %?n -el.
               Pl: #REP32=DB 67h//REP %?1
                 Ez hvhat 2 fle kppen is:
                    REP32   vagy:    REP32 LODSB
                 s egyik esetben sem ad a fordt hibazenetet!

  ha van kimen paramter is megadva definlskor, akkor a makrk
  fggvnyknt is hasznlhatk:
  pl.:  Def.:   #ALLOCMEM(BX):AX=DOS 48h
        Hvs:  MEMSG:=ALLOCMEM(1000h)

  Specilis kimen paramterek is megadhatak, pl:
  def:    #SZAM:(%1 IN ['0'..'9'])=
  hvs:  IF SZAM(AL) AND SZAM(AH) THENCMD WRITELN'Ez szm!!!'

  A kimen paramter vtozhat, a bementl fggen:
  pl.:  #MEM_OSSZEAD:%3=%3:=%1//%3+=%2
        CIM3:=MEM_OSSZEAD(CIM1,CIM2,AX)
        (a 3. paramter itt a hasznland regisztert adja meg)

; s vgl egy furcsa, de nagyon hasznos makr:    ### v3.0 alapbol tudja
;   #AX(AX):AX=
; Hasznlata:
;   mivel az IF CIM1=CIM2 THEN... nem lefordthat (nincs CMP mem,mem utasts)
;   ezrt IF AX(CIM1)=CIM2 THEN... -t kell rni.

  Ezekkel a makrkkal lehetv vlik az objektumorientlt programozs
  megvalstsa BAP-ban. St, mg a BAP utastsok is tdefinlhatk,
  pl. a  #MOV=MOV %2,%1  utn "megbolondul' a fordt, mert felcserli
  a MOV utasts paramtereit! ;)
  Erre j gyakorlati plda a WAITKEY utasts tdefinlsa, mikor
  pl. screensavert s keybart is akarunk hasznlni...

    A "csak-fggvny"-ek:
    ~~~~~~~~~~~~~~~~~~~~~
  Mint mr emltettem, kezdetben a makr s a fggvny 2 kln dolog volt,
  s - fleg kompatibilitsi okokbl - megmaradt nhny dolog:

  SETOUT rutinnv=kimenparam     ; rutinok kimen paramternek megadsa
  Pl: SETOUT !RUTIN2=CX   utn az AX:=!RUTIN2 lefordtva: !RUTIN2//AX:=CX

  Megjegyzs: ha fggvnyknt hivatkoztunk egy rutinra, aminek nem volt
  SETOUT-tal megadva a kimenete, akkor alaprtelmezsknt AX-bl vette azt.
  Pl: DX:=!RUTIN  lefordtva:  !RUTIN//DX:=AX  (csak ha nem volt SETOUT !)

  ####################
  A makrk szintaxisnak, paramterezsnek rszletes lersa megtallhat
  a  MACRO.TXT fil-ban, a beptett, specilis makrk s fggvnyek listja
  pedig a FUNCTION.TXT fileban!
  ####################

;   Specilis fggvnyek:
;   ~~~~~~~~~~~~~~~~~~~~~
; LODSx     pl.:  WRITECHR LODSB
;           Lefordtva:  LODSB//WRITECHR AL
;           (Makrval megadva gy lenne:  #LODSB:AL=LODSB )
;
; ++,--,>>,<<
;           pl:  CX:=++AX     Lefordtva:  ++AX//CX:=AX
;           pl:  CX:=--<<AX   Lefordtva:  SHL AX//--AX//CX:=AX


$$$$$$$$$$$$$$$$$$$$$ 9. A rutingyjtemnyek lersa $$$$$$$$$$$$$$$$$$$$$$$$$$$

                9. A rutingyjtemnyek lersa
               

  Ezeket a LIB-DOC knyvtrban tallod meg libnv.TXT nven, ha mgsem
  akkor arrl a LIB-rl mg nem kszlt lers. :(
  Ebben az esetben javaslom a .H s a .LIB fileok tanulmnyozst,
  ltalban a kommentekbl kiderl minden. Valamint a pldaprogramok
  tanulmnyozsa is hasznos lehet...

$$$$$$$$$$$$$$$$$$$$$$$ 10. Ingyenes regisztrci $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

                 10. Ingyenes regisztrci
                

  Mivel a BAPC CardWare, teljesen INGYEN regisztrltathat!!!

  A regisztrci lebonyoltsa:
  - Olvasd el s tltsd ki a REGISTER.TXT file-t!!!
  - Vedd fel velnk a kapcsolatot s kldd el neknk, cserbe kapsz
    egy BASSPASC.REG file-t, amit a fordt knyvtrba kell majd msolnod.
    (illetve msolhatod mshova is, ekkor a BASSPASC.CFG-be be kell rnod
     hogy hova raktad)

    - kldd el E-mailben, szerintem ez a legegyszerbb megolds.

      a cmem:     Gereffy rpd (GyikSoft)
                    arpi@banki1.banki.hu

        a SUBJECT-be rd: BASSPASC REGISTRATION   (mindenkppen ezt rd!!) ###

    - vagy kldd el hagyomnyos postai ton, DE kldj egy disk-et
      s egy felblyegzett vlaszbortkot is!
      (ha rtl vmi j progit, azt is vedd r a disk-re! :-)
      a cm:       Brthzi Andrs (Boogie)
                  1043, Budapest Nyr utca 53.

 Bizonyra felmerl benned a krds: ha gyis INGYENES, akkor meg mi rtelme?
 A vlasz egyszer: mivel a BAssPasC egy j kezdemnyezs, szeretnnk
 nyomonkvetni hogy mennyire terjed el, hnyan hasznljk, rdemes-e
 ksbbi verzikat is publiklni, vagy rajtunk kvl gyse hasznlja senki?
 Teht ha tetszik, szeretnl jabb verzikat, akkor rj neknk, regisztrltasd!

 Mirt j ha regisztrltatod?
   - nem fog a fordt visszaszmllgatni (mr ezrt megri :-)    ###?
   - folyamatosan kapod az inft az jabb verzikrl (ha kred)
   - ha elakadsz valahol, nem rtesz valamit, akkor rhatsz neknk egy
     E-Mail-t s mi segtnk (ha tudunk)

-------------- Vge! --------- THE END -------------- Vge! --------------------
