
                   BAPC 3.0 - A fordt felptse       by A'rpi
                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Utolso frissites:  1999.1.2.   aktualis BAPC verzio: v3.0a17  build #0454

Az itt lertak ismerete nem felttlenl szksges a programozshoz,
de sokat segthat a fordt mkdsnek (s a dokumentci:)) megrtsben.

A fprogram:  BAPC1M29.BPE
~~~~~~~~~~~~~~~~~~~~~~~~~~
  - parancssor feldolgozs  (COMMANDLINE options)
  - tbbmenetes fordts vezrlse  (PASS_INIT)
valamint ebben tallhat a 2. szint kirtkel, az X_COMP_LINE rutin is.

1 sor fordtsnak lpsei:
~~~~~~~~~~~~~~~~~~~~~~~~~~~

0. szint: COMPILE_FILE (COMPFIL2.INC)
  - READLN   (READLN.INC)
  - .OUT kirtkelse ha van
  - megjegyzsek levgsa  (; utnrl, /* */)
  - STR0_NYIR - felesleges szkzk, TAB-ok eltvoltsa    (STR0_BAPC.LIB)
  - indirect-ek kezelse: { s } levgsa    (OPENF.INC)
1. szint:  (a string mr nem tartalmaz megjegyzst, indirect-vltst)
  - fordtsvezrl utastsok kirtkelse (pl: .ASM .BAP)
  - INCLUDE s trsai kirtkelse     (rekurzi, INCLFILE.INC, INCL_DB.INC)
  - FALSEMOD.INC hvsa  (nem teljesl felttel tugrsa)
  - .BPO-ra fordtsnl: GOTO 0. szint
  - X_COMP_LINE meghvsa  (2. szint)
2. szint: X_COMP_LINE (BAPC1M29.BPE)
  - szegmenscmzsek korriglsa (.MASM)    [xS:valami] -> xS:[valami]
  - STR0_UPCASE->USOR, jabb STR0_NYIR
  - cimkk levgsa, WITH, ha proc akkor megnzi le kell-e fordtani (.LIB)
  - makr definicik kezelse  (#makrnv...)
  - egsz soros (sor vgig tart) utastsok   (IF-THENCMD, PUSH() stb.)
  - // keresse, els szakasz kivgsa s kirtkelse -> 3. szint
3. szint:     (a string mr nem tartalmaz //-t)
  - cimkk s rvdtsek fordtsa  (@ ~ xPT -> stb.)  kb. mint a CJ.INC
  - beptett utastsok fordtsa:
    WRITE*, !,  stb
    := += stb -> C_MATH1.INC
    PUSP/POP -> PUSHPOP.INC
    FILE* -> FILEMUV2.INC
    sokminden -> CMD1.INC
    VAR, CONST -> VARCONST.INC
  - makrk fordtsa
ha nem sorvge akkor GOTO 2. szint, klnben GOTO 0. szint


A fordt egyb moduljai:
~~~~~~~~~~~~~~~~~~~~~~~~~
na innentl csak annak rdekes, aki teljesen meg akarja rteni a TUDJA.TXT-t,
mert ott sokszor van hivatkozs ezekre a fileokra, rutinokra:

---------------- FILEKEZELS: --------------------------------------
COMPFIL2.INC ; COMPILE_FILE   (OPEN, 0-s szint)
   Az els szint fordtst a COMPFIL2.INC-ben tallhat COMPILE_FILE::
   rutin vgzi. Ez kapja bemenetknt a fordtand file nevt, s hogy az
   LIB vagy INCLUDE tpus (ez lesz a .LIBMODE default rtke).
   Ez tartalmazza a file megnyitst (s keresst az aktulis knyvtrban
   illetev a LIBDIR-ben megadott helyeken).
   Ez a rutin rekurzv felpts, mivel az INCLUDE s trsai
   (pl. INCLUDELIBS) kirtkelsekor sajt magt hvja meg.

READLN.INC   ; READLN, 1 sor beolvassa az pp fordtott file-bl
   bemenetknt kapja a cmet ahov beolvas, a file paramterei, puffere
   a COMPFIL2.INC-ben van.

INCLFILE.INC ; INCLUDE_FILE - egy teljes file bemsolsa, fordts nlkl
   Ezt az .INDIRECT parancs hasznlja, a mr lefordtott .IND file-ok
   bemsolshoz.

OPENF.INC    ; OUTPUT KEZELSE  (OPENF,CLOSEF,FILE2_WRITE*) - az .ASM rsa.
   Ez kezeli az indirect-ek megnyitst s vltogatst.
   Meg ebben vannak az output-ot r rutinok, FILE2_WRITE s FILE2_WRITELN
   ami bemenetknt kapott stringet soremelssel v. anelkl ment.

FILEOPEN.INC ; BVTETT FILEOPEN, by PilaSoft (INCLUDEDx-HEZ)
   Ez olvassa eb az INCLUDEDx parancs utni nevet, kezdcmet, hosszt stb,
   majd megnyitja s bepozicionlja a file-t.

FILEINFO.INC ; .FILEINFO ELLENRZSE (.BPO-hoz)
INCL_DB.INC  ; INCLUDE_DB::  - binris file beszrsa (INCLUDEDx utastsok)
CONFIG.INC   ; CONFIG-FILE beolvas (BASSPASC.CFG), by Boogie

---------------- FORDTS: -----------------------------------------
CMD1.INC     ; standard BAPC utastsok fordtsa. nagyrszt
               helyettesti az STDBAPC.H file.

VARCONST.INC ; a VAR s CONST fordtsa.

IF2B.INC     ; FELTETELES::     s WRITE_CMP::            3. szint
IF2_X.INC    ; X_FELTETETELES::                           2. szint
IF_CMD.INC   ; EZ ERTEKELI KI PL. AZ IF...THEN[CMD] -T    1. szint
  A feltteels utastsok fordtsa 3 szinten trtnik:
    1. szint:  maga az utasts beolvassa, ez a parser szint.
       sztbontja a stringet utastsra (IF//WHILE//stb.), mdostkra
       (S s N flag), felttelre s parancsokra/cimkre.
       pl.:
       IFS (AX<5) OR XYZ THENCMD DX:=SI
       ٳ Ĵ         Ĵ
         mdostk    felttel      parancsok
    2. szint: sszetett felttel felbontsa egyszerekre
       ez vgzi a zrjelek, AND, OR s NOT kirtkelst.
       pl: "(AX<5) OR NOT XYZ"  -> "AX<5" s "XYZ"
    3. szint: egyszer felttelek kirtkelse.
       ilyen pl:     AX<5
                     KEYPRESSED
                     DL IN[1..9,17]
       Ez a rutin az sszehasonltsokhoz a WRITE_CMP rutint hvja,
       ami bemenetknt kap 2 paramtert (bal s jobb oldal), valamint
       a mvelet kdjt (ami tartalmazza a < = > jeleket, eljelet, neglst),
       valamint egy cimkenevet amire ugrani kell a felttel teljeslsekor.
       Ha mindkt paramter konstans, akkor kirtkeli a felttelt, ha nem,
       akkor a rutin generl egy CMP vagy ekvivalens (pl OR AX,AX) utastst
       (amelyik az optimlisabb), s egy Jcc [CIMKENV]-et.
       Visszatrskor AX=1 ha true, AX=0 ha false, s AX=-1 ha nem
       tudta kirtkelni hanem kdot fordtott.

CJ.INC       ; CSAK A CIMKEK FORDITASAHOZ: OFS,SH,@,^,xPT,ENDIF
    Nhny egszsoros parancsot kirtkel rutin ezt hvja meg, hogy
    a cimkeneveket lefordtsa (^ ~ @ stb.), mivel ezek mg eltte
    hvdnak meg mieltt az X_COMP_LINE megtenn...

COMP_MOV.INC ; WRITE_MOV::
    Ez fordt MOV utastst. Bemenete a 2 paramter (forrs, cl).
    Ez kezeli le a HI:LO megadst, az XOR-al val optimalizlst,
    fggvny hvst is.

CONVPSTR.INC ; CONVERT_PARAMSTR::   (makrkhoz)
    A makr paramtereit "(p1,p2...)" vagy "p1,p2,..." szedi szt
    klnll ASCIIZ stringekre.

WRMACRO.INC  ; WRITE_MACRO::
    Ez fordtja le a makrt. Bemenete a makrdescriptorra (LABEL_SG)
    mutat pointer.

WRITE_HZ.INC ; WRITE_HESMARK_ZAROJEL::   #()
    Ez fordtja le a #(...) sorokat.
    [nem nagyon hasznlt]

FUNCTION.INC ; FUNCTION_CALL::
    Fggvny kirtkel.
    Ez kezeli a beptett fggvlnyeket (lsd FUNCTION.TXT) s a
    fggvnyknt mkd makrkat is ez hvja meg.

SHL_MUL.INC  ; *=
    Az SHL/ADD/SUB parancsokkal helyetetstett szorzs (MUL) fordtsa.
    [nem nagyon hasznlt]

FOR1.INC     ; FOR*...NEXT
    FOR utastsok fordtsa. bemenetknt kapja az egsz sort,
    ez szedi szt az utastst FLA-ekre s paramterekre, s generl
    kdt.  hvja a fggvnykirtkelt, de NEM a WRITE_CMP-vel fordtja
    az sszehasonltst. :(

FILEMUV2.INC ; FILExxxx [VAR] [szam]
    FILE parancsok fordtsa. Ez kezeli az aktulis file-szmot,
    azok ltrehozst (VAR), s tblzat alapjn az utasts fordtst.

PUSHPOP.INC  ; PUSH..., POP...
    PUSh s POP fordtsa, paramterek sorrendjnek megfordtsa, specilis
    push-ok (FL,AD,ALL) kezelse.

FPUCONST.INC ; F[I]xxx CONST  (Pl: FADD 3.17)
    FPU utastsokban kzvetlenl megadott konstansok kezelse.
    Ebben van (3.0a17+) a SZAM2CIMKE rutin is, ami egy konstansbl
    arra utal cimkenevet generl.

KIFKIERT.INC ; KIF.KIERTEKELO    !!!!!!! DEVELOPER ONLY !!!!!!!!
    Kifejezs kirtkel, mg fejleszts/tesztels alatt.  [RUNTIME]
    Teljes matematikai kifejezst fordt le (s optimalizl) FPU kdd.

MIEZ2.INC    ; MIEZ v2.0         !!!!!!! DEVELOPER ONLY !!!!!!!!
    Tpus elemz, mg fejleszts alatt.
    Bemenetknt kap egy stringet, s meg kne mondja hogy az micsoda
    s milyen mret, rtk. (regiszter/szm/cimke/memriav/stb)

SZAM.INC     ; KIERTEKELI::  (.EVAL)     by Pila
    matem. kifejezs kirtkel. [COMPILE-TIME]
    ez nem kezel vltozkat, s kdot sem fordt, csak kiszmolja az
    eredmnyt. viszont lekezel mindenfle fggvnyt (pl SIN, INT) s
    beptett konstansokat (e, )
    Az .EVAL bels fggvny s az FPUCONSt rutin hvja.

PACKAGE1.INC ; .PACKAGE
    Package-k (ltkr-k) kezelst vgzi. j bonyolult ;-)

FALSEMOD.INC ; FALSEMOD_KIERTEKELO::   (IF-EQU)
    Ez vglis egy fake-fordt, akkor fut, amikor t kell
    ugrani egy FALSE (hamis) kdrszt. pl:
    IF 3>5 THEN
    ...
    ENDIF
    mivel 3>5 nem igaz, a ...-ot nem szabad lefordtani. ennek
    a rutinnak a feladata megkeresni az ENDIF-et, ami egyltaln
    nem egyszer, mivel lehet kzte msik IF, makr, stb is.

LABELS.INC   ; CIMKK kezelse (LABEL_SG)
    Ez kezeli le az sszes cimkt s makrt, amiket a LABEL_SG nev
    szegmensben (mrete llthat /LMS=xx cmdlien kapcsolval) trol.
    j cimke felvtele (SET_LABEL), keressek (GET_LABEL*) s
    listzsok vannak benne.

HEADERS.INC  ; HEADERS.H kezelse
    Fejlcek kezelse, a HEADERS.H filet ez olvassa.

--------------- EGYB: --------------------------------------
SAVEVAR2.INC ; Virtual STACK for Recursive Calls
    2 rutin tallhat benne: SAVE_VAR s RESTORE_VAR.
    ezek valstjk meg a rekurzinl a loklis vltozk
    elmentst s visszalltst, verem-szeren.

SR1.INC      ; GEN_FILENAME, WHAT_REG*
    Mindenfle hasznos segdrutinok.
    GEN_FILENAME:  filenv felbontsa, kiterjeszts mdostsa stb.
    WHAT_REG s WHAT_REG_UPC: megmondja hogy a bemenetknt kapott string
           egy regiszter-e, s ha igen, az milyen hossz (bitben mrve)

ALRUTIN1.INC ; COMPILE_STR::, WRITE_BAP_ERROR::, stb...
    Mindenfle hasznos segdrutinok. A 2 legfontosabb:
    COMPILE_STR::
         egy mini fordt, bemenetknt kap egy vezrl stringet,
         max. 3 paramtert s abbl fordt egy sort.
         A vezrl stringben %1..%3 lehet hivatkozni a paramterekre,
         %e-vel egy PMODE-fgg E bett kapunk, ~ helyre v86r_ kerl
         ha .PMODE be van kapcsolva, stb...
    WRITE_BAP_ERROR::
         a BAPC rgi hibakezelje, de mg most is sok minden hvja.
         a hibt opcionlisan fileba rja, szmolja az error-ok s
         warning-ok szmt, kirja a hibs file-t/sorszmot stb.

XGETNUM.INC  ; HEX+DEC  STRING->LONGINT konvertl
    Univerzlis szm beolvas. kezeli a dec s hex szmokat.

CIMKE.INC    ; BPC_LOCxxx, ... generl
    Ebben tallhat a legtbb cimkegenerl rutin, ami a @, IF-ek s
    egyb utastsok szmra generl egyedlll (szmozott) cimkeneveket.

INFO.INC     ; /INFO
    A parancssori /INFO parancs vgrehajsa. amgy meg mindenfle
    fejlesztknek s felhasznlknak fontso infotkat r ki, pl.
    memriafoglals, korltozsok stb.

----------------- Tblzatok: --------------------------------------
CMD_TABL.INC ; param. nlkli parancsok tblzata
CMD_TABL.PM  ; param. nlkli parancsok tblzata PMODE-hoz
ERRORS.INC   ; hibazenetek listja




