Preview
BAssPasC Compiler version 3.x - VERSION HISTORY
=================================================
BAPC v3.0 à1 2 menetes forditas
~~~~~~~~~~~~
- nem tud semmit :) azon kivul hogy 2 menetben fordit
- a .BPO-ra forditas nem lett tesztelve!!!!
- a .PACKAGE sem lett tesztelve!!!!
- nem keres BASSPASC.REG-et
BAPC v3.0 à2 tmnytelen bugfix...
~~~~~~~~~~~~
- BUGFIX: minden INCLUDE-t INDLUDEPROC-knt ford¡tott, mert vletlen
AH-ba raktam a LIB_MODE-t s nem AL-be... (az .OPEN kirtkelskor)
- ha regisztr lva van, akkor kiirja, de ha nincs akkor SE szamolgat
vissza meg sipol
Ford¡t sos teszteknl kiderlt hib k:
- ESP\V19_2\SFXRUT:
problma: kiir egy "Section CONST not found" hibat, ami
hulyeseg, azert irja ki mert volt egy .INDIRECTALL es utana
meghivodott a COMPILE_HEADER "CONST"-ra az automatikus INDIRECTALL
miatt.
megold s:
£j v ltoz¢: COMPFILE_LEVEL. 0 ha k¡vl vagyunk a fprogramon
(teh t .LIB, .IND esetn) klnben pedig az INCLUDE mlysge.
Csak akkor ford¡t HEADERS(..VAR)-t ha COMPFILE_LEVEL=0
teh t a fprgben lev .INDIRECTALL mindig a ..CODE tartom nyba
fog kerlni. (v2.4b4-ig is igy volt) (a TSR progik irasa miatt)
- PATH kiirasa BAPLINE-ben -> jav¡tva, ha LIB_MODE=1 akkor nem ¡r PATH-ot.
- JAVITVA: BAPLINE sorsz moz s nem ok (az .OPEN-ek miatt elcs£szott)
- PilaSoft's SB16 digizoben XMS makro miatt XMS struktura rosszul fordult le...
(a makr¢def. ksbb van, de 2 menetnl ez nem sz mit...)
"megold s": #XMS=XMS %1 %2 makr¢ a STRUCT el.
jobb lenne valami makr¢ undef funkci¢.
#makr¢nv=
vagy:
#-makr¢nv
tal n:
-#makr¢nv
esetleg:
.UNDEF makr¢nv
- .INDIRECTALL problm ja: (felmerlt: Pila SB16 digizjnl)
pass1: - berakja az .INDIRECTALL sort
- berakja a .LIB-eket (.OPEN-.CLOSE)
- berakja az .IND-eket (felesleges...)
pass2: - tal l .INDIRECTALL-t -> berakja az .IND-eket
- ut na jnnek a LIB-ek. (.OPEN...)
kvetkeztets: .LIB-ek s .IND-ek sorrendje megfordul!!!! ;-(
megold s:
pass1: - berakja az .INDIRECTALL sort (felesleges, de akkor mg nem tudja)
- berakja a .LIB-eket
- nem rak be .IND-et, mert felesleges...
- berak egy .INDIRECTALL2 sort !!!
pass2: - tal l .INDIRECTALL-t, de nem foglalkozik vele!
- jnnek a .LIB-ek, ok.
- tal l .INDIRECTALL2-t, hat s ra berakja az .IND-eket
ad¢dott elny: a forr sba ¡rt .INDIRECTALL2 azt jelenti, hogy
csak az .IND-eket rakja bele, a .LIB-eket ne.
- STACKSIZE problm ja: ( HEADERS() miatt)
"STACK DW 0 DUP(?)" sort csin lt, aminek a TASM nem rlt t£lzottan...
megold s: IF STACKSIZE_STR=0 OR STACKSIZE_STR='0' THEN ^SKIP
BAPC v3.0 à3 LABELS.INC
~~~~~~~~~~~~
- LABELS.INC/SET_LABEL-ben hiba: nem a string ut n rakta az EQU rtkt,
hanem a kvetkez pointere helyre (DI+=LENGTH+4 hi nyzott)
- SETPROC.INC mexuntetve.
elg szarul volt m r v2.4b5 ¢ta a mem¢riakihaszn l s:
- proc_tabl (SETPROC.INC)
- package_tabl
- labels_tabl
SETPROC fonosabb rutinjai (pl. LISTPROC) t¡rva hogy SET_LABEL/GET_LABEL-t
haszn lj k. £j rutin: SETPROCDEF.
Elnyk: - cimkeknt defin lt (teh t nem :: csak :) rutinnvet is elfogadja
(pl: CALL RUTIN ..... RUTIN: ... RET)
- gyorsabb (HASH miatt)
Hiba mg:
- kisbet-nagybet meg van klnbztetve
-> JAVITVA! ha UPCASE_MOD=1 akkor SEARCH_LABEL eltt !STR0_UPC
- FILENAME rsz tdolgozva (COMPFIL2,ALRUTIN1,INCLFILE,BAPC*.BPE)
eddig volt:
FILENAME_OFS ami SOR[]-ba mutatott -> WRITE_BAP_ERROR hlylt...
FILENAME_WITH_PATH: csak akkor haszn lta ha INCLUDE-olt m s PATH-b¢l
mostant¢l:
FILENAME_OFS likvid lva :)
maradt FILENAME_WITH_PATH, ebben van az pp ford¡tott file neve m solva
MAKE_BAPLINESTR rutin: ez csin lja a BAPLINE_STR-t, ezt hivja
a COMPFIL2 es az INCLFILE is.
BAPC v3.0 à4 .PACKAGE & bugfixek
~~~~~~~~~~~~
- BRUTAL CRASH BUG JAVTVA!!!!!!!!!!!!!
Ugyanis az ALIGN_CMD v ltoz¢nak az OPENF adott rtket att¢l fggen
hogy a VAR.IND-ben vagyunk-e. PASS1 esetn viszont nem h¡v¢dik meg az
OPENF, de a ".ALIGN" kirtkeldik... s ha a string>SOR_MAXSIZE akkor fagyi.
(2 napig tartott mig rajottem... mert ofcoz debuggerrel nem fagyott)
- .PACKAGE tesztelse, nagyj b¢l mkdik, kisebb hib kkal:
lok lis cimkket nem nagyon szerette, mivel a ^-t figyelmen kivul
hagyta, s ha m sutt is volt ilyen nev lok l. cimke akkor
keverte...
- .PACKAGE tdolgozva: a PACKAGE_CIMKEKERESO-t atraktam X_COMP_LINE
elejrl a '^' kiertekelo utan, es a CJ.INC-be is.
Uj(?) hiba:
- a rutinon beluli lokalis cimkekre a rutinon kivulrol (de ugyanabban
a package-ben) valo hivatkozasokat nem ismerte fel.
(pl. FELTETELES_SIGN esetn)
=> javitasa: PACKAGE_EXPORTLOCALS valtozo, ha 1 akkor a
belso cimkeket is berakja PACKAGE_TABL-ba.
hibaja: a PACKAGE_SETLABEL nem ellenorzi a tobbszor
elofordulo cimkeket, es igy eleg hamar betelik a 32k memoria.
=> javitasa: lehetetlen.
- BUGFIX: PROC:: s PROC:. kirtkelnl az STR0_LENGTH2 megh¡v sa
miatt el ll¡t¢dott AL, s ezgybl a PROC:.-ot is PROC::-nak vette.
- LABELS.INC supportolja a PACKAGE-t
+1 byte cimknknt, amely a ltrehoz sakor aktu lis PACKAGE sz ma
(ACTUAL_PACKAGE_NUM)
Keressnl SH-ban package sz ma, ha nem tal l olyat ami
abban lenne, akkor keresi a 0- s (MAIN) package-ben levt.
- MAKROK: makrodef-nl tirtam hogy ne ^USOR-t hasznalja, hanem hivja
meg COMP_CIMKE2 utan STR0_IUPC2-t (az STR0_IUPC2 uj rutin, abban kulonbozik
a simatol, hogy helyben vegzi el az UPC-t, es elmenti SI-t es DI-t)
(package-ben levo lokalis makrok miatt kellett (pl: #^DEBUG=...)
- PACKAGE1.INC-ben bugfix: a --SI -t atraktam elobbre, mert aa 2. idezojelen 2x
ment at, es emiatt a '*** PASS-1 ***'-et atirta '*** Package1__PASS-1 ***'-re
=> YEAH! leforditja sajat magat ugy hogy az egesz benne van egy Package-ben!
- egy hiba van csak, ami nem is hiba:
SOR_MAXSIZE a Package-n belul volt definalva, viszont STR0_BAPC.LIB
is hasznalta (volna)... megoldas: kiraktam a package-n kivulre a def-et
- Valami nem 100% okes a PACKEGE_CIMKEKERESO-ben, beleraktam egy vedelmet,
ha "internal error???" uzenetet ir ki, akkor irj nekem!
Egyelore nalam nem jelentkezik a hiba semelyik forrasnal.
Egyebkent nem veszes, csak az fordult neha elo, hogy lokalis
cimkevel hivodott meg a rutin, ami ezugybol hulyeseget csinalhatott
(pl '^CIMKE' ami lokalis, de a ^ kierteklo utan nem szabadna ilyen eloforduljon)
- kicsit javitottam a forditas vegen levo kiirasokon, a Main lines-t
kiszedtem mert mindig hulyeseget mutatott (nemtommiert) es beraktam
egy LABELS_DB-t ami a jegyzett cimkek szama.
Az Output_lines se tokeletes, mert ha jol latom a HEADERS-t
nem szamolja bele.
- uj kapcsolo a forditonak: /LABELS -> kilistazza a cimkeket a vegen
('tipus package cimkenv=rtk' formatumban)
- PACKAGE.INC-bol kiszedtem ami foloslegesse valt (LABELS.INC miatt)
- BERAKTAM egy automatikus '.PACKAGE OFF'-ot az USES kiertekeles el.
BAPC v3.0 à5 WRITE_CMP2
~~~~~~~~~~~~
- Atirtam teljesen a WRITE_CMP-t (es atneveztem WRITE_CMP2-nek)
bemenetkent kapja a cimke offsetjet DI-ben, es a felttel _k¢dj t_
DL-ben, valamint DH-ban hogy a hiv¢ rutin t mogatja-e az IF-EQU-t.
Rszletesebben l sd IF2B.INC-ben...
Uj rutin mg a MIEZ::, ami kb. megmondja a stringrl hogy micsoda:
Be: SI->str Ki: DL= 0=imm(EAX=value) 1=reg(EAX=hossz) 2=mem 3=???
(mg nincs ksz, csak a 0-t s a regisztereket ismeri fel)
Elnyk:
- IF-EQU t mogat sa
- egy csom¢ szart ki lehetett trlni IF2B-ben, mivel a WRITE_CMP2
megoldja (pl. llando FELTETELES_SIGN figyels)
- jobban optimaliz l:
- pl. IF AH<0 THEN... -re kiirja hogy hlyesg (always FALSE)
(ha eljelesen akarjuk, akkor ugyeb r IFS AH<0 THEN... kell!!!)
- pl. IF AH>0-n l is OR-t ford¡t (nem CMP-t)
^REGN0_* v ltoz¢k is elt vol¡tva.
- XGETNUM.INC modositva, hogy ne kelljen STR0_UPC elotte
- MIEZ:: befejezve, tudja:
- "0" (azrt kln kezelve, mert ez a leggyakoribb)
- regiszterek (!WHAT_REG_UPC) -> TYPE=1
- DEC/HEX sz mok (!XGETNUM) -> TYPE=0
- cimkk (LABELS.INC/!GET_LABEL)
- DEF/EQUW/EQUD -> TYPE=0
- DATAx (DB/DW/DD/DQ/DT/STRUC) -> TYPE=2
- minden egyb -> TYPE=-1
====> mkdik az IF-EQU!!!!!!!!
megjegyzs: az IF-EQU-n l is figyelembe veszi a SIGN flag-et, teh t
az IF -3<5 THEN FALSE-t fog adni, mert a (-3)-at unsigned-re konvert lja!!!
ha eljelesen kell, akkor IFS -3<5 THEN -> ez m r TRUE lesz.
- WRITE_CMP-be:
ha olyat tal l hogy P1_TYPE=imm akkor megcserli a 2 paramtert,
s megford¡tja a mveleti jelet is. (pl.: IF 5>AX THEN AX_KISEBB_MINT_5)
(mivel CMP 5,AX nem leford¡that¢, csak a CMP AX,5)
- IF2B.INC-be: IN]a..b[ s t rsai
(nyitott s z rt intervallumok kezelse)
Ha ellenkez ir nyban van a [ vagy ] mint lenne IN[] esetn, akkor abba
az ir nyba nincs megengedve az egyenlsg. (DL&=NOT 4)
pl: AX IN[3..5] === 3<=AX<=5
AX IN[3..5[ === 3<=AX<5
AX IN]3..5] === 3<AX<=5
AX IN]3..5[ === 3<AX<5
- Kis m¢dositas a felttel-k¢dokban:
0=JS
7=JNS (eddig UNUSED volt)
IF xxx:S THEN... t¡rva hogy WRITE_CMP-t haszn ljon, valamint
IF xxx:NS THEN... is mkdik mostant¢l. (mg IF-EQU-val is)
- FUNCTION.INC-be: bels v ltoz¢k s utas¡t sok:
.UPC = az UPCASE_MODE bels v ltoz¢ rtke (1 ha nem CASE SENSITIVE)
.CPU = a CPU tipusa amire ford¡t (pl.: 386)
.TYPE cimke = a "cimke" t¡pus val tr vissza (LABELS.INC alapj n)
0 = nem defin lt (vagy trlt)
1 = EQU (rtkt a BAPC nem tudta kisz molni) pl: CIMKE EQU 3*7
2 = EQU WORD pl: CIMKE EQU 12345
3 = EQU DWORD pl: CIMKE EQU 123456789
8 = DATA
9 = DB
10 = DW
11 = DD
12 = DQ
13 = DT
15 = STRUC
16 = LABEL pl: CIMKE:
17 = CALL (*) pl: CALL CIMKE (csak ha nincs CIMKE nev proc
vagy cimke sehol)
18 = PROC pl: CIMKE:: vagy CIMKE:. vagy CIMKE PROC
!!! ez mg nem vgleges, esetleg megv ltozhat hamarosan!
(ezrt clszer a LABELTYP.H-val haszn lni!!!)
.DEF cimke = 1 ha a LABELS.INC szerint ltezik a "cimke", klnben 0
( .DEF === .TYPE>0 )
.VAL cimke = a "cimke" LABELS.INC szerinti rtke (0 ha nem ltezik)
.REG xyz = 0 ha "xyz" nem regiszter, klnben a reg. mrete BIT-ben!
.NUM xyz = 1 ha "xyz" sz m (pl: "12345"), klnben 0
.IMM xyz = 1 ha "xyz" immediate (sz m vagy EQU-s konstans)
.MEM xyz = 1 ha "xyz" DB/DW/DD/DQ/DT/STRUC tipusu (LABELS.INC szerint)
( .MEM === .TYPE IN[8..15] )
Ezekre fggvnyknt hivatkozhatunk, de ez ltal IF-ben is felhaszn lhat¢,
¡gy lehet ford¡t skor kirtkeld IF-et (IF-EQU) is csin lni vele.
Pl.: IF .CPU<586 THEN
.OUT *** This library requires Pentium! ***
ENDIF
Ez ha pl. 386-ra ford¡tunk, akkor __ford¡t skor__ kiirja a fenti
zenetet a kpernyre.
Pl.: #NULL=IF .REG %1 THEN//XOR %1,%1//ELSE %1&=0//ENDIF
- WARNING-ol ha nincs semmi a THENCMD ut n
- FLAG felttel igy is megadhat¢:
Pl.: IF FLAG <= THEN... (ez ua. mint az IF FLAG BE THEN...)
Pl.: CMP EAX,EBX//IF FLAG <= THEN ugyanaz, mint IF EAX<=EBX THEN
mire jo? optimalizalasra, amikor valahol volt mar egy CMP,
akkor annak az eredmenyet felhasznalhassam:
Pl: AX?=5
AX:=10 ; a FLAG-ek nem v ltoznak!
IF FLAG < THENCMD !KISEBB//=>^NEXT ; IF AX<5 THENCMD !KISEBB
IF FLAG > THENCMD !NAGYOBB//=>^NEXT ; IF AX>5 THENCMD !NAGYOBB
!EGYENLO
^NEXT:
BAPC v3.0 à6 IF-EQU
~~~~~~~~~~~~
- IF-THENCMD-s IF-EQU is mukodik, pl:
IF 3<5 THENCMD IGAZ//ELSE HAMIS
egy jobb plda:
IF .DEF HIBAKEZELES AND (FLAG C OR AX<CX) THENCMD WRITELN'FILE ERROR!'
ez csak akkor fordit IF FLAG C OR AX<CX THENCMD WRITELN'FILE ERROR!'
sort, ha van defin lva HIBAKEZELES nevu cimke...
- Volt egy "kis" bug az X_FELTETELES::-ben, mgpedig hogy eggyel tbb
neg l s volt a kelletnl...
Nem nagy dolog, csak 5 oraig tartott mig rajottem :(
(a DeMorgan-os NEG-optimalizalasom bekavart egy kicsit)
Le kell tesztelni alaposan az egsz IF-EQU-t (forditaskor kirtkeld
felttelek)!
pl. beirni ilyet hogy:
IF 0 OR (0 AND (1 OR 0) OR 0 AND 1) AND (1 OR 0) THEN
.OUT IGAZ!
ELSE
.OUT HAMIS!
ENDIF
s megnzni hogy j¢l rtkeli-e ki.
BAPC v3.0 à7 IF-EQU bugfix, MACRO paramterek
~~~~~~~~~~~~
- Macro paramterek:
- lehet 9-nl tbb paramter is, pl:
#XYZ=WRITELN'A 13. paramter: %(13) '
teh t a 9-nl nagyobb sz mokat ()-be kell tenni!
(klnben csak az els sz mjegyet dolgozza fel)
- paramterek balra grgetse: %<
az eddigi %1-et trli, helyre a rgi %2 kerl, a %2 helyre a %3...
- sszes paramter: %*
pl: #XYZ=WRITELN'A makro sszes paramtere: %*'
vagy pl:
#XYZ=X1(%*)//X2(%*)//X3(%*)
*** Kne mg: paramterek t¡r sa, jobbra grgets...
- j bels utas¡t s FUNCTION-ba:
".NB xyz" -> 1 ha van xyz, 0 ha nincsen (csak ".NB" van)
mire j¢? Makr¢kba megnzni hogy van-e megadva paramter
pl: #XYZ=IF .NB %3 THENCMD <van 3. paramter megadva>
pl: #WRITELN2=IF .NB %1 THENCMD WRITELN'%1'//ELSE WRITELN
Megj.: NB=Non-Blank=nem-semmi :) (TASM utan)
- IF-EQU megint bugfixve, a THENCMD az elbbi (à6) NEG-es bugfix
miatt nem mkdtt j¢l...
- m sik IF-EQU bugfix: az ENDIF-et XCOMPLINE-al ford¡totta, ¡gy ha
FALSEMOD-ban vagyunk, akkor nem kapcsol¢dik ki. mo: FALSEMOD:=0
("IF 0 THENCMD XYZ" ut n FALSEMOD-ban felejtdtt a ford¡t¢)
- j ford. vezrl opci¢k:
.NICEASM = .SZEPASM+.MEGJ ON+.NOBAPLINE
.INCSRC = kommentknt berakja a .BP3 forr s sorait is az .ASM-be
(hibakeresshez, ASM-BAP sszehasonl¡t shoz)
- !!! a kiadott verzioban bugos a hibakezeles !!!
BAPC v3.0 à8 ERRORS, PASS_DB=1, .INCLUDELIBS
~~~~~~~~~~~~
- Hibakezeles ujrairva. (ERRORS.H es ERRORS.INC)
hibatipusok:
^UNDEF=0 - nem definalt (fenntartva torolt hibauzeneteknek)
^MSG=1 - csak uzenet (pl. Processing "xtsyus.inc")
!! egyelore az uzenetek meg sima WRITELN-al vannak
kiiratva, nem ezzel !!
^WARN=2 - WARNING=figyelmeztetes.
^ERROR=3 - ERROR=hiba. nagy valoszinuseggel hibas .ASM keletkezik.
^INTERNAL=4 - A forditoprg hibaja!!! belekerult par ellenorzes
amivel sajat magat teszteli neha, igy elkerulve par
lefagyast illetve hibat. Ha ilyet ir ki, akkor
_FELTETLENUL_ irj nekem E-Mailt, es tedd el azt a
forrast (illetve csatold a levelhez ha lehet)
ami a hibat elohozta!!!!!
Ezek az ellenorzesek foleg az uj funkcioknal vannak,
ezzel probalom felderiteni azokat a specialis
eseteket, amivel esetleg nem szamoltunk a tervezesnel.
Mivel ezek az ellenorzesek altalaban a lehetetlen
esemenyek teljesuleset figyelik, igy eleg valoszinutlen
hogy ilyen hiba elojon, de minden elkepzelheto...
Pl: van egy kiertekelo rutin ami akkor hivodik meg,
ha van a parameterben kettospont, de ha a rutin nem
talalja sehol a :-ot akkor valami gaz van... :)
^FATAL=5 - olyan hiba, ami miatt a fordito nem tud tovabb
forditani, pl. file I/O hiba, vagy keves a memoria.
- A 2-menetes forditas opcionalis lett!!!!!!!!
oka: altalaban eleg egy menet is, es igy gyorsabb.
Es a DEFAULT = 1 menet!!!!!!!
parancssori opciok:
/1 - 1 menetben fordit (csak PASS2-t hajtja vegre) <- default!
/2 - 2 menetben fordit (PASS1 es PASS2 is)
- Lehetoseg a HEADERS.H kikerulesere:
.ASM - .BAP koze ird be amit kell... (header-t, segmens kezdet/veget stb)
.INDIRECT TEXT,CONST -al kerheted a konstansok forditasat
.INDIRECT VAR -al kerheted a valtozok forditasat
.INCLUDELIBS -el kerheted a hasznalt LIB-funkciok forditasat [NEW!]
(vagy INCLUDEPROC lib1,lib2... -el is, az elobbi az USES-ra vonatkozik)
.INDIRECTALL -al a fenti 3 egyuttesen, LIB,CONST,VAR sorrendben.
Megj: a LIB-ek tartalmazhatnak konstanst, valtozot, tehat a LIB-ek
forditasanak elobb kell lenni, mint a tobbinek!!!
- WRITE_CMP-ben atirtam hogy OR reg,reg helyett TEST reg,reg-et forditson,
mivel ugyanaz a hatasa, de allitolag pentiumon gyorsabb.
- BUGFIX(?): Ha PMODE akkor a FOR mindenkeppen ECX-et fordit.
(eddig CX-et forditott, illetve a "3" hatasara ECX-et de
a LOOP-ot meg DB 67h-val prefixelte...)
Tehat a FOR hasznalata:
REAL MODE: sima FOR
FLATREAL: FOR3
PMODE: FOR (FOR3-at nem szabad!)
- FPU kiertekelo alpha -1000 verzio...
FPU=valami -nel szetszedi valami-t elemeire es kiirja hany muveletbol all.
- FPUCONST: immediate is haszn lhat¢ nh ny FPU utas¡t s ut n:
pl: FADD 3.7
FADD 8 ; ilyenkor ebbl 8.0 lesz!!! (int->float conv.)
FIADD 8 ; itt viszont marad 8, mert integer...
FADD QPT 1.35263256342692789 ; QPT -> DQ lesz a konstans tipusa!
leford¡tva:
csin l egy "BPC_FPUCnnn Dx y" konstanst (CONST.IND-be),
ahol:
nnn=sorsz m, automatikusan nvexik...
Dx = tipus, ha PTR-el meg van adva a sz m eltt
default: DD (DWORD)
y = a sz m, ha egsz volt, de float-os utas¡t ssal,
akkor .0 vgzds hozz ¡r¢dik, klnben a TASM szarul ford¡tja
A sz mot kicserli a BPC_FPUCnnn cimkre.
t mogatott utas¡t sok: FLD,FMUL,FADD,FSUB,FDIV (illetve ezek FI* verzioi)
van mg olyan utas¡t s, aminl kne?
BAPC v3.0 à9 MANY BUGFIX :((( thanx to Panther & Pila for bugreports!
~~~~~~~~~~~~
- BUGFIX-ek doksikban: [Panther]
- TUDJA3.TXT-ben hibasan voltak a cimke tipusok a .TYPE leirasanal
(eggyel el voltak csuszva a valtozok tipusai)
- v2.3x doksikban egy helyen .COMPROC van irva .COMPPROC helyett!!!
- OPTIONS.TXT-bol hianyzott a .COMPPROC es a .DEFPROC leirasa
- LABELS bug:
a konstansokat mindig WORD tipusunak tarolta, igy adodott a kovetkezo
hiba:
^MAX_SQRT=10000h ; a LABELS rutin ezt 0 ertekunek tarolta el :(
IF EAX<^MAX_SQRT THENCMD EBX+=SQRT_TABL[EAX*4]
leforditva:
TEST EAX,EAX ; itt CMP EAX,^MAX_SQRT kene legyen!!!
JAE BPC_IF123
ADD EBX,SQRT_TABL[EAX*4]
BPC_IF123:
ami mg erdekes, hogy nem jelzett "conditional always FALSE" hibat sem.
=> erre rajottem miert van, mert nem always FALSE, hanem always TRUE! :)
-> javitva, mostmar az always TRUE-t is jelzi.
Bar meg nem tokeletes, mert az IF rutin szempontjabol valoban
TRUE a feltetel, mert az ugras mindig teljesul, de a mi szempontunkbol
viszont FALSE mert ami az IF-en belul van az nem hajtodik vegre...
- FPUCONST: [Panther]
nem igazan muxik, kisbetuvel semmi, naggyal meg a ?PT-k nem
javitva:
- REP CMPSB elott nem volt DI+=SORUSOR
- SI a "PTR "-re mutatott a szam helyett...
- FOR:
- atirtam a hatarokat:
regen: max 20 db FOR, max 128 char/for
most: max 10 db FOR, max 256 char/for
(a darabszam melysegben ertendo, 1mas utan akarmennyi lehet...)
- ha PMODE akkor .ALIGN helyett ALIGN-ot fordit
- bugfix: PMODE=0 eseten is kiirta az "Using FOR3 in PMODE" warningot
- Modositas a ~ karakter korul: [Pila]
eredetileg a 0-as szinten ertekelte ki a ~= -t, es a ^ kiertekelo
utan a ~ -t. viszont ez bugos, mert pl. a ~=^VALAMI nem mukodik...
2 megoldas lenne:
1. a ~ kiertekeles utan ertekeli ki a ^ -ot
2. a ^ kiertekeles utan ertekeli ki a ~= -t
a 2. lett megcsinalva, mert igy mukodik ez is:
XXX::
CIMKE: <ÄÄÄÄÄÄÄ¿ide ugrik!
~=^ ³
... ³
YYY:: ³
CIMKE: <ÄÄÄÄ¿ ³
=>^CIMKE ÄÄÄÄÄÙ ³
=>~CIMKE ÄÄÄÄÄÄÄÄÙ
- Ujabb belso valtozok lettek elerhetok fuggvenykent:
.PASS = visszaadja hogy hanyadik menetnel tart a forditas
1 menetes forditasnal mindig 2, kulonben 1 vagy 2 erteku
.PMODE = visszadja a modot amire fordit:
0 = REALMODE (valos mod, mas neven v86)
1 = PMODE v2.x by TRAN extenderhez
2 = PMODE/W v1.x by Daredevil & Tran extender (DPMI)
.EXE = memoriamodell szama:
0 = .COM program
1 = .EXE, 1 szegmens CS=DS=SS
2 = .EXE, 2 szegmens CS<>DS=SS
3 = .EXE, 3 szegmens CS<>DS<>SS
Ezeket IF-EQU-val egyutt sok mindenre fel lehet hasznalni,
legfokeppen az uj LIB-ekhez lesz jo.
- BUGFIX: eddig csak max. egy @-ot ertekelt ki utasitasonkent, [Pila]
mostmar vegigkeresi a sort es mindet kiertekeli
(eredeti bug: "DB @2-@1"-et rosszul forditotta)
- LABELS: KONSTANSok koruli bug: [Pila]
XYZ = 5 -ot pl. nem ismeri fel a SPACE-k miatt.
javitva
- az " ="-t is elfogadja az " EQU" es "=" mellett
- XGETNUM-ba beirtam hogy a szam elott levo SPACE-ket vagja le
BAPC v3.0 à10 bugfixes
~~~~~~~~~~~~~
- BUGFIX: VAR valtozo->hova -t PMODE-ban hibasan forditotta, mert
a cimnek csak DW-t fogallt DD helyett!
- INT 3 kezelse:
- eddig WARNING-olt ha talalt, ez maradt csak mostmar az
ERROR() makroval iratja ki
- .NOINT3 kapcsolo hatasara kitorli az INT 3 utasitasokat! <NEW!>
- VAR.IND:
.INDIRECTALL regen: 1. minden .IND kiveve a VAR.IND
2. a VAR.IND
mostantol:
1. minden ami nem VAR*.IND
2. minden ami VAR*.IND
igy lehet tobb valtozo csoport is, es nem kell kulon gondoskodni
a sorrendrol.
A .VARIND= opcioval egyutt atfedett valtozo teruletek is keszithetoek.
- Ez nem volt semmi: SZAM.INC elejen:
eredeti comment:
;IN=SI-> UPCASED STR (SZAMOK, '/*+-()',SIN,COS)
uj:
; In: SI->STR (szamok, /*+-()^, UPCASED fuggvenyek, e,ã,X)
Ha uj commenttel forditom, akkor nem talal 2 fuggvenyt a COPROC1.LIB-ben.
jo, mi? :)
A hiba oka: a /* a C-tipusu komment kezdetet jelzi...
(a BAPC inkompatibilis a rgi verzi¢kkal, mert a ; ut n nem szabadna
semmit rtelmeznie... )
Megold s: a C-style kommentek tdolgoz sa.
- elbb rtkeli ki a ;-t s ut na a /* */-t
- egym sba gyazott tbb szint /* */ kommentek kezelse:
KELL /* KOMMENT /* KOMMENT_A_KOMMENTBEN */ EZ MEG KOMMENT */ NEM_KOMM
- hibajelzsek:
- ha a prg vgre marad nyitott /*
- ha */-ot tal l amihez nincs /*
- ->IND bug .EXE filen l:
pl: DX->VAR PALETTA:DB*768
.EXE-nl a cimke a DATA szegmensbe kerl, amit a TASM nem rtkel...
javitva: nem 'CIMKE:' hanem 'CIMKE LABEL' forditodik.
BAPC v3.0 à11 LABELS, MAKROK
~~~~~~~~~~~~~
- BUGFIX: a 'Too many labels' hibauzenet helyett 'Redefining label to
different TYPE!'-ot irt ki
jav: a hiba nem FATAL lett, hanem ERROR, es csak letiltja a maradk
cimke logol s t
- LABELS kicsit tirva, az EQU rtkeket nem a cimkenv ut n teszi, hanem
kulon, es csak egy pointert tarol a 'data descriptor'-ra a cimkenev utan
tovabba tipuskodok is valtoztak, ezutan van egsz, float es string tipusu EQU
(rszletek a LABELTYP.H-ban, s aj nlatos azokat a konstansokat haszn lni)
£j rutinok: LABEL_SAVE_INT:: s LABEL_GET_INTEGER::
- Internal: NO_FPU konstans: ha 1 akkor nem hasznalhatok FPU utasitasok
(hogy a fordito fusson olyan gepen is amiben nincs FPU...)
- LABELS t rolja a konstansokat egsz sz mknt (+/-) vagy string-knt
kell mg: FLOAT sz mbeolvas¢+t rol¢
- MIEZ2 rutin els verzioja mar muxik, tesztels:
MIEZ xxxxx ; kiirja forditaskor xxxxx parametereit (type,size,value)
tudja:
- regiszter (cpu,segment,fpu)
- integer (dec/hex, XGETNUM-ot hivja)
- label
- memory (size mg nem ok)
- integer (ok.)
- float (not tested)
- string -> rekurzivan kveti, max 10 szintig aztan hibauzenet
- £j parancssori kapcsol¢: /LDMP - label dump
a ford¡t s vgn kimenti LABEL_SG-t egy LABELDMP.DAT nev fileba.
- MAKRO definalo es kiertekelo teljesen atirva, mivel a makrok mar a
LABEL_SG-ben vannak, nem a MAKRO_MEM-ben.
- egyszerre mindig csak a kovetkezo %.-ig terjedo reszt dolgozza fel,
igy lehet akarmekkora is a makro (tobbsoros makrok elokeszitese)
- mivel felszabadult 8kB a MAKRO_MEM miatt, a SORMAXSIZE-t vissza¡rtam
400-r¢l 512-re
- kis m¢dos¡t s: ha a % ut n rtelmezhetetlen karaktert tal l (azaz
amihez (mg) nincs funkci¢ rendelve) akkor nem kiirja hanem tugorja.
Ez kell a ksbbi fejlesztsekhez... (b r kicsit inkompatibilis a rgi
verzi¢kkal :( )
teh t eddig pl a %A esetn A-t irt ki, mostant¢l semmit.
(igaz b¢l ugyis %A-t kellett volna kiirjon...)
A % jel tov bbra is a %%-al irhat¢ ki.
- j parancssori kapcsol¢: /INFO
kiir egy oldalnyi hasznos inf¢t:
----------------------- Compiler info ----------------------------
Memory:
Code: 32765 ; a BAPC k¢dj nak mrete (LIB-ek nlkl)
Data: 58432 ; adatszegmens mrete (STACK nlkl)
Free mem at start: 516 kB ; a BAPC ind¡t sakor szabad mem¢ria
Free memory now: 403 kB ; a bels modulok inicializ l sa ut ni szabad mem.
Memory limits:
READ_buffer=2048 ; olvas si puffer. fileonknt kln van.
WRITE_buffer=4096 ; ¡r si puffer, egy van, indirect-v lt skor flush. :(
FUNCTABL=8192 ; ide t rolja a fggvnyek kimen paramtereit
LABELS=32768 ; ide teszi a cimkket, EQU-kat s a makr¢kat is
Length limits:
SORMAXSIZE=512 ; egy sor max. hossza
LABEL_MAXSIZE=128 ; egy cimke max. hossza
Nest limits: ; egym sba gyaz si korl tok:
MAX_IF=64 ; IF-[ELSE]-ENDIF vagy IF-THENCMD
MAX_UNTIL=32 ; REPEAT-UNTIL
MAX_WHILE=32 ; WHILE-ENDWHILE
MAX_FOR=10 ; FOR-NEXT
MAX_CASE=16 ; CASE-ENDCASE
------------------------------------------------------------------
Ezek a bels konstansok rtkei, kivve a mem¢ria foglal sok.
- sz mozott ford¡t s, igy knnyebb lesz beazonos¡tani a BAPC verzi¢j t:
BAssPasC Compiler v3.0a11 build #0044 Copyright (C) 1996-98. ESP-team
ez a ford¡t s sorsz ma -->---^^^^
egy kls progi a BAPC minden £jraford¡t sakor nveli ezt az rtket.
- Tbbsoros makr¢k!
defin l s:
#makronev(parameterek):kimenet
...
...
ENDM
Megj:
- param s kimenet nem ktelez
- nem lehet = jel a #-os sorban! (mert akkor egysoros makr¢nak veszi)
(illetve a param.vagy kimenet tartalmazhat, de a kimenet ut n nem
lehet semmi.)
- az ENDM-el csak akkor forgalkozik ha ppen egy tbbsoros makr¢ban
vagyunk. teh t a TASM-os MACRO-ENDM dolgot nem piszk lja!
- rekurzi¢ s makr¢def a makr¢ban nem megy mg :(
- a makrodef a 0- s szinten hajt¢dik vgre, ami nem a legjobb mg most,
de meg fogom csin lni hogy a 0- s szinten rtkelje majd ki a makr¢kat
s akkor lehet indirect-eket, .ASM/.BAP, meg mindent csin lni makr¢val is
- Internal: £j: DEBUG.H
makr¢k vannak benne a debuggol s egyszers¡tsre...
a MACRODEF rsz m r ezeken keresztl ¡rja ki a debug zeneteit.
BAPC v3.0 à12 - viny¢ elsz ll s ut n... MAKROK 4ever!
~~~~~~~~~~~~~
- WR_MACRO bug fixed: kiertekeleskor FS:LODSW helyett LODSW volt,
emiatt nem mindig talalta el hany parameter van...
- IF-EQU: megcsinaltam hogy ne forditson felesleges cimkeket...
jol bele kellett nyulni az egesz IF rendszerebe, remelem nem rontottam
el semmit :)
- /LDMP - LABELS-t kiirja LABELDMP.DAT fileba
/LDMP=file - file-t beolvassa LABELS_SG-be
hogy ez mire j¢??? PRECOMPILED HEADERS!!!
elore le lehet forditani az osszes makronkat, EQU-nkat, igy nem
kell minden forditaskor ujra kiertekelni a sok .H filet...
Kerdes persze hogy megeri-e, gyorsit-e egyaltalan valamit.
- MAKROK megint...
- tobbszorosen definalt makrok:
a sor kiertekelesenek idejere ervenyteleniti az utolso macrodefiniciot,
igy elkeruli a rekurziot vagy begerjedest.
Pl:
#XXX=NOP//XXX
#XXX=CLC//XXX
XXX
leforditva:
CLC ; az utolj ra defin lt makr¢ rtkeldik ki...
NOP ; az utols¢ eltti is, mert az utols¢ hivatkozik r (//XXX)
XXX ; az ut. eltti is hivatkozik XXX-re de nincs belle tbb :)
- rekurz¡v makr¢k:
ha egy sorban %R is van, akkor a sor forditasanak idejere nem
ervenyteleniti az utolso makrodef-et, azaz rekurzio is lehetsges
az elobbi pelda alapjan:
#XXX=CLC//%R XXX
XXX
leforditva:
CLC
CLC
CLC
CLC
...
* FATAL Error: virtual stack overflow!
Tehat rekurziv makroba mindig kell valami leallasi feltetel!!!
Pl:
#XXX=IF .NB %1 DO AX:=%1//%< %R XXX(%*)
XXX(1,2,3,4)
leforditva:
MOV AX,1
MOV AX,2
MOV AX,3
MOV AX,4
Megj.: a fenti peldaban jobb lenne a kovetkezot alkalmazni:
#XXX=IF .NB %?1 DO AX:=%?1//%< %R XXX(%*)
(tehat %1 helyett %?1-et, ami a 'nem kotelezo parameter' jelzese)
mivel az utolso szinten nem lesz egy parameter sem, es
ha nem %? van akkor a BAPC hibauzenetet fog adni.
A rekurzio max. melysege: fogalmam sincs :)))
- fugg a virtual stack meretetol (alapbol 64k) illetve hogy
mennyi szabad belole. (pl az INCLUDE-k erosen csokkentik a helyet)
- egy makro leiro block merete 1024+6+SORMAXSIZE, tehat ennyit
foglal a v.stackban -> max. kb 40 szintre eleg a stack
- Makro paramtere lehet makr¢.
pl:
#RND(AX):AX=!RANDOMX
#PUTPIXEL(BX,DI,AX)=IMUL DI,320//[ES:DI+BX]:=AL
PUTPIXEL(RND(320),RND(200),RND(256))
eddig nem tudta leford¡tani, mostm r megy.
ehhez kellett:
- WR_MACRO-ban a !WRITE_MOV idejre SAVEVAR-ozni mindent
- WRITE_MOV-ban a !FUNCTION idejre menteni [BX]-et
- Latszolag mukodik a makrodef tobbsoros makroban:
pl:
#TOBBSOROS
CLC
#XYZ=NOP
STC
ENDM
...
XYZ
TOBBSOROS
XYZ
- BUGFIX: hibasan muxott a makrodef ervenytelenites, mert
a RESTOREVAR elott probalta visszallitani mikor meg a ^PTRtoPTR
erteke hulyeseg volt... :(
BAPC v3.0 à13 - MAKROK SUXXX
~~~~~~~~~~~~~
- elkezdtem megirni az STDBAPC.H-t (alap BAPC utasitasok megoldasa makrokkal)
- MAKRO-ban (tobbsoros) az IF-EQU-bol csak az IF..THENCMD mukodott,
az IF..THEN..ENDIF struktura nem, mert a FALSEMOD_KIERTEKELO-t
meg a COMPFIL2 hivta, nem az X_COMPLINE...
beraktam egy IF FALSEMOD..!FALSEMOD_KIERTEKELO..ENDIF-et az X_COMPLINE-be is
- az .NB nem mindig mukodott jol, mert neha egy space ottmaradt a parameter
vegen (".NB ") -> megoldas: a space-ket skippeli az .NB ellenorzes
- MAKRO-n belul hasznalhato:
%N = a bemeno parameterek szama
Pl:
#OUTB
IF .NB %1 DO AL:=%1
OUT DX,AL
IF %N DO %< %R OUTB %*
ENDM
Ez muxik igy is: XYZ(1,,2,)
Mig a sima .NB teszteres elhalna az elso ures parameteren!
- WR_MACRO BUGFIX: ha nem volt parameter megadva akkor ^INPUTDB veletlen
erteku volt 0 helyett!
- Elkeszult az STDBAPC.H els verzioja! TESZTELNI!!!!!!!!!!!!!!!
csak egy INCLUDE STDBAPC.H kell a progi elejere, ez
kiiktatja a beepitett makrokat es helyettesiti oket...
sebesseg:
gyorsabb lesz minden ha a beepitett makrokat kitorlom a forditobol.
ok: az uj makrokat HASH-tablas kereso ertekeli ki, mig a beepitett
makroknal: minden utasitas mindegyik makroval osszehasonlitasa -> lassu
tudas:
nemelyik utasitas tobbet tud, jobban hasznalhato lett.
pl: GOTOXY 5,10 rovidebb kodot fordit, UPCASE-nek lehet tobb parametere...
BAPC v3.0 à14 - LABELTYP.H bugfix *** BAPC3UP1.ZIP released ***
~~~~~~~~~~~~~
- ilyen egy hibat! elfelejtettem atirni a LABELTYP.H-ban a konstansokat :)))
ezugybol mindenfajta EQU 4-es kodot kapott, ami nem mindig a legnyerobb...
raadasul a hiba csak negativ egeszeknel jelentkezett :)
de legalabb az internal error checkpoint megfogta a bugot!
bugreport by Szoke (Smulovics Peter)
BAPC v3.0 à15 .EVAL, IF-EQU bugfix meg makr¢k mg mindig... ja meg DOKSIK!!!
~~~~~~~~~~~~~
- .INDIRECTALL nem mukodott 1 menetes forditasnal - bugreport by Pila
- MACRO_COMPLINE:: rutin forditja le a %-os parancsokat
a WRITE_MACRO:: es FUNCTION:: is ezt hivja, nem 2x van megirva kb ugyanaz
-> a kimeno parameterekben is lehet hasznalni minden %-os dolgot,
kiveve a %.-ot (de pl. a %? %N %< stb muxik)
- Kimeno parameter sors ra is lehet hivatkozni %O-val
pl: ECX:=XYZ
akkor az XYZ makroban a %O helyere ECX fog kerulni...
- % ut ni I azt jelenti hogy le kell v gni az idzjelet a paramterrl
pl: #KETSZER=%I1//%I1
KETSZER 'MOV AX,5'
- MAKROnv ut n kzvetlen lehet: space, zarojel, idezojel, vesszo
teh t pl:
XYZ(5)
XYZ 5
XYZ'5'
XYZ ,5 vagy XYZ,5 (az STR0_NYIR miatt a 2. lesz az elsbl is)
- STDBAPC v1.1 - WRITE, WRITELN utasit sok
- IF2_X.INC-ben volt egy felesleges sor: :)))
IF ^NEG THENCMD XOR AL,1
de emiatt nem muxott tokeletesen az IF-EQU kiertekelo:
IF (0 AND AH='-') OR (1 AND AL='-') THEN
XXX
ENDIF
ezt nem jol forditotta, ui. az els AND-nal kitalalta hogy az egsz
'biztosan true', pedig nem. :(
- IF2_X s IF2B atirva hogy a DEBUG() makrot hasznalja hibakeressnl
- Doksik.
£j: MACRO.TXT, FUNCTION.TXT meg FEJLESZT.TXT
tdolgozva: OPTIONS.TXT, szt lett szedve CMDLINE.TXT s CONTROLL.TXT-re
- BAPC fprogram letiszt zva nagyj b¢l (kommentek, meg felesleg kitrlse)
- £j parancssori kapcsol¢: /LMS=nn - LABEL mem¢ria mretnek megad sa kB-ban
default: 32kB nn=1..64
pl.: BAPC3 /LMS=64 NAGYPRG.BP3
- LABELS: kicsit m¢dositottam a hibakezelsen:
- 17-es tipusn l (PROC_CALL) sose jelez 'label redef. to diff. type'-ot
- warningol a makro atdefinalasra
- Uj bels fggvny: .EVAL - lebegpontos kirtkel
Pila kifejezs kirtkeljt haszn lja (SZAM.INC).
lehetsgek:
.EVAL xxx = lebegpontos sz mot ad vissza (pl.: 3.14159265E0000)
.EVALI xxx = egsz (kerek¡tett) sz mot ad vissza (pl.: 3)
.EVALD xxx = lebegpontos sz mot ad vissza HEXA-ban (pl 12832594h)
.EVALQ xxx = lebegpontos sz mot ad vissza HEXA-ban, de ez QWORD
.EVALT xxx = lebegpontos sz mot ad vissza HEXA-ban, de ez TBYTE
Az els akkor hasznos ha valami bonyolultabb rtket akarsz adni
egy konstansnak, pl: CONST SZORZO:DD=.EVAL 2ã/44100
A 2. a fixpontos aritmetik n l hasznos, pl: EAX+=.EVALI 65536/(240/200)
Az utolso 3 akkor j¢, ha pl. MOV-al akarsz rtket adni egy float
v ltoz¢nak/regiszternek. ui. a TASM nem engedi pl az EAX:=1.31 -et!!!
***
- A haszn lhat¢ fggvnyek, funkci¢k:
+ - * / ^ ! û ( ) (x^y=hatv nyoz s, !x = x faktori lisa)
SIN(), COS(), ABS(), SQR(), LN(), LG(), TAN(), CTG(), ABS(), INT()
- Ha nem tud rtelmezni valamit akkor meghivja a GET_LABEL_FLOAT-ot,
az meg ha string konstanst talal akkor rekurzivan meghivja a
KIERTEKELI::-t (SZAM.INC) !
Igy pl ez is megy:
ABX=2ã
XYZ=2-3*ABC ; ez nem most ertekelodik ki!
EAX:=.EVALI XYZ ; itt ertekelodik ki az egesz, rekurzivan...
- F* utasitasok is t mogatj k, st mg az .EVAL se kell!
pl: FADD 2ã/SAMPLEFREQ
pl: FILD DPT 65536*3/7532
(a ?PT-bl meg az I-bl kital lja a tipust)
- a CONST is t mogatja, .EVAL-al:
CONST SZOG_D:DD=.EVAL 1/SAMPLEFREQ
- Lehet idzjelet is haszn lni:
CONST SZOG_D:DD=.EVAL '2^(1/12)'
(ez foleg a speci jeleknl rdekes, pl: ^ )
de igy is jo:
CONST SZOG_D:DD=.EVAL ^lokalisvaltozo'^'(1/12)
[gyakorlatilag skippeli az osszes idezojelet...]
***
TESZTELNI!!!!!!! Nem biztos hogy mindig jol muxik!!!!!!!!
***
- NASM. SUX...
megprobaltam NASM-al leforditani... hat nem nagyon hagyta magat...
- FPU utasitasok.
- TASM2NASM nem ismerte, megoldva
- a NASM nem ismeri az FWAIT utasitast...
- a NASM nem ST(1) meg ST meg hasonlokat hasznal hanem ST0..ST7
- NASM nem ismer sima "FDIVR" meg hasonlokat csak ha "FDIVRP ST1,ST"
- NASM-ban TWORD-nek hivjak a TASM-os TBYTE-ot
- a NASM nem szerette a SORUSOR definiciojat (offsetek kulonbsege)
=> mindez javitva a TASM2NASM meg a NASMSUX.H segitsegevel
- ez a legjobb:
az IF2B-ben a Jcc_TABL: a kodszegmensben volt definalva, de DS:-el
volt hivatkozva ra, de a TASM-al forditva valamiert megis mukodott!!!!
NASM-al ofcoz nem ment... valoszinu az ASSIGN miatt.
javitva.
- a TASM-os DW 'ab' a NASM-ban DW 'ba'-nak felel meg... sux.
IF-EQU-kkal javitva a forrasban. (COMPILE_TO_NASM EQU 0/1)
===> LEFORDUL JOL!
- FPUCONST bug: nem rakott lez r¢ 0-t az egsz sz m ut n (FI*)
- BAPC3UP2 es BAPC3UP3 released!
BAPC v3.0 à16 kif.kiertekelo & MAKE & FPU-support
~~~~~~~~~~~~~
- Elkeszult a FPU-s kif.kiertekelo __TESZT__ verzioja...
tud mindenfelet, reszletek kifkiert\arpi1.txt-ben...
hasznalata: (CSAK TESZTre! ez nem marad benne...)
FPU=kifejezes
ez beteszi ST-be a kif. erteket, illetve fordit kodot ami ezt kiszamolja...
- MAKE:
uj resz a HEADERS.H-ban, ami a forditast irja le (TASM,TLINK stb...)
ebben hasznalhato:
%1=forras filenev kiterj. nelk.
%2=generalt .ASM file neve
%T=tempdir
%O=asmoptions
%L=linkoptions
pl:
..MAKE
TASM %2 %Ttempfile.obj /UT300 %O
TLINK %L %Ttempfile.obj, %1.EXE
..END
configfileban:
MAKEFILE=make.bat ; ha ez nincs akkor nem general makefilet, kulonben
; meg itt lehet megadni mi legyen a neve
ASMOPTIONS=/m ; assemblernek atadando default parameterek (%O)
LINKOPTIONS=/x ; linkernek atadando default parameterek (%L)
ezek felulbiralhatok a forditando programban is, pl:
.ASMOPTIONS=/m2
.LINKOPTIONS=/3 /x
Default compiler nevek A HEADERS.H-ban: TASM,TLINK,NASM32,ASM2NAS
Ha ez nemjo, akkor sajna a HEADERS.H-ban at kell irni mindenutt...
Forditas ezutan:
BAPC3 filenev.bp3 [temp\akarmi.asm]
MAKE.BAT
- "regi" ASM2NAS mar nem birta leforditani a tul sok cimke miatt :(
-> ASM2NAS modositva: BPC_xyz -> _xyz konvertal.
- LABELS: tipuskezeles ismet atdolgozva, a kif.kiertekelo miatt, meg
egyebkent is ideje volt mar ;)
Mostantol a memoriavaltozok 4 csoportba sorolhatoak:
DATA -> kompatibitas miatt van, a DB,DW,DD,DQ,DT stb. valtozok
FLOAT -> lebegopontos valtozok
UNSIGNED -> pozitiv egesz valtozok
INTEGER -> elojeles egesz valtozok
Meretuk lehet:
B=byte
W=word
D=dword (32 bit)
Q=qword (64 bit)
T=tbyte (10 byte)
S=struct (?? bit)
Jelolesuk 2 betubol all, a csoport kezdobetuje + a meret jele.
Pl: DW = Data word (ez ugye a TASM-kompatibilis Dx megadas...)
FQ = FLoat qword (ez az uj BAPC-szintaxis)
Ezutan az IF, es a kif. kiertekelo figyelembe fogja venni a tipust.
VIGYAZAT! A szamertekek a LABELTYP.H-ban megvaltoztak!
- BUGFIX: FPUCONST: ha kif.kiertekelot hasznalta, akkor a ^FLAGS nem
lett allitva, emiatt neha hozzafuzodott egy .0 a szamhoz!!! (TASM nem csipte)
- BUGFIX: enyhen elszallt a CONST szam:DD sortol. mert nem volt
ertek megadva (pl CONST szam:DD=0). Javitva, warningol es
automatikusan 0 ertekunek veszi.
- COMMANDline parameterekben : is hasznalhato = helyett [Pila]
(pl /LMS:64 is jo /LMS=64 helyett)
az egesz a .BAT parameterezes miatt kell. (ha .BAT-nak adsz parametrekent
= jelet, azt a command.com atirja space-re!!!)
BAPC v3.0 à17 Pila 5letei, ASM_FUNC, FPUCONST v2, FOR
~~~~~~~~~~~~~
- parancs hogy ne haszn ljon HEADER-filt: .NOHEADER
pl.: .NOHEADER
.386
...
elnye: ASM fileokat,amelyekben m r benne van a header,¡gy knnyebb trakni.
- hiba ford¡t skor: csak 16 biten t rolja a sorsz mokat,¡gy hosszabb :)
fileok esetn rossz eredmnyt mutat,amikor ki¡rja,h ny sorb¢l llt a file.
-> JAVITVA -> lehet irni 4milli rd soros programot jol ;-)
- Mostm r a CONST is kezeli az £j tipusokat.
- MIEZ s WRITE_CMP kezeli az £j tipusokat.
pl: VAR DD_VALTOZO:DD
VAR ID_VALTOZO:ID
VAR UD_VALTOZO:UD
IF DD_VALTOZO<5 THEN ; unsigned
IFS DD_VALTOZO<5 THEN ; signed
IF ID_VALTOZO<5 THEN ; signed
IF UD_VALTOZO<5 THEN ; unsigned
IFS UD_VALTOZO<5 THEN ; unsigned ez is!
lnyege:
A Dx-es tipusok az IF-nl megadott eljelkezelst haszn lj k (IF vagy IFS)
am¡g az Ix (INTEGER) s Ux (UNSIGNED) tipusuakat nem befoly solja ez.
Ha egy integert hasonl¡t akarmivel akkor signed lesz, ha unsignedet
ak rmivel (kivve integer-rel) akkor unsigned. klnben meg a default.
Kell mg: - FLOAT sszehasonl¡t sok. (FLOAT-IMM, FLOAT-MEM, FLOAT-FLOAT)
pl: IF ST<ST(2) -> FCOM ST(2)
pl: IFP ST<ST(2) -> FCOMP ST(2)
IF FD_VALTOZO<5 -> FLD FD_VALTOZO/FCOMP BPC_IMM_5
IF ST<FD_VALTOZO -> FCOM FD_VALTOZO
- SZAM.INC-be: hexa sz mok kezelse is (!XGETNUM)
pl: EAX:=.EVALI 0A0000h+GETMAXX/8*(240/200)
-> kitrltem az FPUCONST-b¢l a rgi sz m-detekt l¢t, mert elmletileg
a KIERTEKELI:: miatt teljesen feleslegess v lt. ha mgse akkor ¡gyj r s.
- j FPUCONST cimkegener l¢ by Pila (SZAM2CIMKE::, az FPUCONST.INC-ben van)
a cimke nevben benne van a konstans rtke es tipusa:
pl: BPC_IW_5 = integer WORD, erteke 5
BPC_FQ_3Em4 = float QWORD, erteke 3.0E-4
-=>
- olvashat¢bb lesz az .ASM (kit rdekel? :))
- nem lesz tbb cimke defin lva ugyanahhoz a konstanshoz!!! <- MUXIK
lebegpontosn l a default t¡pus DD (DWORD), ami az £j .FLOAT=tipus
paranccsal megv ltoztathat¢. a .FLOAT ut n 1 bet kell, W,D,Q vagy T
- asm_functions: ***> NAGYON NAGYON BETA!!!!!! <***
az assembly utasitasok parametereire is meghivja a FUNCTION_CALL-t
pl.: IMUL LODSD,.EVALI 65536*360/ã
leforditva:
LODSD
IMUL EAX,7509872
- BUGFIX: rossz sorrendben volt a [DI-1]:=AL s a !STR_LENGTH
DEFAULT: _kikapcsolva_!!!, a .ASMFUNC ON|OFF paranccsal kapcsolhato be/ki
- Uj commandline kapcsolo: /MAKE=makefilename (vagy /MAKE:makefilename)
pl: BAPC3 /MAKE=MAKE.BAT FILE.BPP
ugyanaz mintha a configfileban lenne egy MAKEFILE=makefilename sor.
mire jo? pl. ird ezt a VC.EXT-be:
BP3: BAPC3 !.! !.ASM
TASM !.ASM
TLINK -t !.OBJ
BP*: BAPC3 /MAKE=MAKE.BAT !.!
MAKE.BAT
Tehat ha a kiterjesztes nem hatarozza meg egyertelmuen hogy kell
az .ASM-ot leforditani, akkor bizzuk a BAPC-ra!
- Uj LIB: READTXT.LIB (es a pmode-os verzio: READTXT.L32)
nagyon egyszeru .TXT (szovegfile) olvaso rutinok.
READTXT_OPEN:: ; Be: DX->filename Ki: CF=error
READTXT_READLN:: ; Be: ES:DI->puffer Ki: CF=EOF
READTXT_CLOSE:: ; Be: -
kell hozza 2 konstanst definalni:
READTXT_PUFFERSIZE ; a puffer hossza
SOR_MAXSIZE ; egy sor max. hossza (READLN-nak)
Kne mg:
- tobb filet kezelo TXT olvaso (BP->TXT_STRUC)
kozos vagy kulon puffer?
- TXT iro (soremelessel/anelkul, milyen soremeles (13,10,13+10))
- tobb filet kezelo TXT iro
- tobb filet kezelo TXT iro/olvaso/pozicionalo
- FOR bovitesek:
- FORL-nl is haszn lhat¢ az E flag, itt azt jelenti hogy a sz ml l¢=0
esetben mg visszaugrik (teh t --ECX//JNZ helyett --ECX//JNS van a vgn)
- megadhat¢ a ciklussz ml l¢ regiszter a kvetkez m¢d¢n:
FORL(ciklusregiszter,ciklussz m)
pl:
FORLPE(EDX,32)
...
NEXT
leforditva:
MOV EDX,32
@:
PUSH EDX
...
POP EDX
DEC EDX
JNS @
Ha meg van adva cikl. regiszter akkor az S flag-et nem veszi figyelembe!
- Bugfix: a CONFILEFILEban a REGFILE= nem szamitott semmit, mivel a
regisztracio ellenorzes elobb volt mint a configfile beolvasas
BAPC v3.0 à18 Service Pack #1 [ bugreports by Panther and Tom Rehak ]
~~~~~~~~~~~~~
1. M r az elz verzi¢ is tudta, csak kimaradt a doksib¢l: [Panther]
BUGFIX: a CASE meghulyult a zarojektol:
CASE AL OF
'(': valami
a ( miatt nem vette figyelembe a 2. idezojelet, es elszallt
":" missing erroral.
Oka: a CASE az LDDM.INC-ben levo SEARCH_KETTOSPONT-ot hasznalta,
ami meg onmagaban nem lenne bug, de az bugos volt!
Es mivel eredetileg az LDDM-hez keszult, amiben igen ritkan fordul
elo idezojel kozti zarojel, ezert nem derult ki eddig. :(
2. Doksi BUG: [Panther]
par sorral feljebb ez volt:
NAGYON TESZTELNI: ASMFUNC-ot! (.ASMFUNC=ON)
ami hibas, mert az .ASMFUNC utan nem kell = jel!
tehat igy korrekt:
NAGYON TESZTELNI: ASMFUNC-ot! (.ASMFUNC ON)
3. LABELTYP.H "bug": [Panther]
A LABELTYP.H-ban nem voltak kulon konstansok definalva az
uj tipusokhoz, tehat nem volt pl. LABELTYPE_FW
Ezt ugyan lehet mas tipusbol szarmaztatni, de ugy maceras:
LABELTYPE_FW=LABELTYPE_DW-LABELTYPE_DATA+LABELTYPE_FLOAT
A hivatkozasnal pedig kell egy .EVALI kulonben nem ertekeli ki.
3.a. JAVITVA:
A GET_LABEL meghivta a 7-es (EQU-STRING) tipusra is a GET_LABEL_INTEGER-t,
az viszont nem kezelte le ezt az esetet korrektl (mindig 1-et adott vissza).
Kijav¡tottam, hogy ezt is kezelje, ¡gy nem kell mostant¢l az .EVALI-t
oda¡rni. pl.:
K1=76
K2=K1-3
IF 3=K1-K2 DO .OUT 'Mukodik!'
Megj.: j¢ lenne ha ezt FLOAT-knt rtkeln ki, mert most INTEGER-knt csin lja.
¡gy pl. szerinte a '3.3=3.14159265' felttel az TRUE. :(
3.b. Csak akkor mkdtt az .OUT ha a sor elejn volt.
JAVITVA -> mostm r b rhol lehet, de ha nem a sor elejn van, akkor
csak a kvetkez //-ig ¡rja ki. (a // ut nit pedig leford¡tja...)
4. HEADERS.H bug: [Tom]
A TASM-COM-REAL modnal a MAKEFILE primitivnel a TLINK utan
valamiert 2 db vesszo volt, emiatt a TLINK a MAP filet irta a .COM-ba. :(
Erdekes egy hiba volt :)
5. Mg egy HEADERS.H bug: [Tom]
Az ASM2NASM helyett ASM2NAS volt irva a T2N-es modok makefile-jaihoz. :(
Megj.: megneztem, nalam ASM2NAS-nak hivjak, nem ASM2NASM-nak, valoszinu
ezert volt igy.
6. PUSH-POP bug: [Tom]
programreszlet:
push ax,bx,cx,dx
push ax,bx,cx,dx
gotoxy cl,ch
pop dx,cx,bx,ax ;<<<<<<<<<<<<<<
ax:=0//bx:=0
al:=dl//--al//bl:=31//mul bl
add ax,menuk
writestr ax
pop
ret
igy leforditva a vegen levo pop muxik. ha viszont az elso pop-ot
atirom sima pop-ra (a 'pop dx,cx,bx,ax'-et) akkor a vegen levo
pop nem muxik, sima 'pop '-ot fordit.
----> JAVITVA. 'POP'-n l vletlenl 2x hajt¢dott vgre a --PUSH_VEREM_MUT.
BAPC v3.0 à19 Service Pack #2 [ bugreports by Panther & Pila ]
~~~~~~~~~~~~~
1. Bug: A GET_LABEL_INTEGER rutin string kirtkelskor [Panther]
le llt INTERNAl ERROR-al, mert veletlen kitrldtt egy JMP belle :)
2. Problma: [Panther]
XYZ=.TYPE valami
IF XYZ=sz m THEN...
Az EVAL nem tudta kirtkelni a fggvnyh¡v st (a .TYPE az fggvny).
JAVITVA:
Az =-jeles rtkad sokra a BAPC meghivja a fggvny kirtkelt,
s az eredmnyt ¡rja az .ASM-be is. (Az EQU-kat bknhagyja.)
Pl:
I=27
J=.TYPE I
K EQU .TYPE I
AX:=J
BX:=.VAL J
leforditva:
I=27
J=4
K EQU .TYPE I
MOV AX,J
MOV BX,4
3. Bug: az .eval nem muxik, csak az .EVAL [Panther]
JAVITVA. mukodott ez, csak nem tokeletesen :)
minden kisbetus eval-bol (pl .evali) sima .EVAL-t forditott.
oka: az .eval utani modosito karaketreket nem UPCASE-olta.
4. Bug: FALSEMOD+IFN bug [Pila]
false IF-EQU kozt ha volt IFN vagy IFS akkor elcsosztak az ENDIF-ek
pl:
IF 0
IFN AX=5 ; ezt nem vette eszre hogy IF...
...
ENDIF ; ...ezert azt hitte ez az ENDIF tartozik az 'IF 0'-hoz
ENDIF ; es ez felesleg -> error
a hiba oka: ^USOR IN['S','N'] volt ^USOR[2] IN['S','N'] helyett a
FALSEMOD.INC-ben.
5. Bug: IN[] + COMP_CIMKE [Pila]
rosszul forditotta: IF AX IN[^CIMKE] DO RET
javitva, az IN[] kiertekelo nem hivta meg a [] koztire a COMP_CIMKE-t
6. Egy csomo forditasvezerlo utasitas atkerult a 0-as szintrol a
2-esre, igy mostantol makroban is hasznalhato.
lehet // elotte, de utana NEM! (mivel egesz soros utasitaskent
vannak kiertekelve, pl a .CHAR= miatt)
-> csak tobbsoros makroban lehet hasznalni
ezek kerultek at:
.ASM s .BAP ; ezek megmaradtak a 0. szinten is
.VARIND=nev
.LABEL nev ; ez mar not supported, csak egy warningot ir ki
.PACKAGE [OFF|nev]
.ASMFUNC [ON|OFF]
.UPCASE [ON|OFF]
.LIBMODE [ON|OFF]
.FLOAT=tipus
.FC [ON|OFF]
.CHAR=utasitasok
.ANTIDEBUG [ON|OFF]
.NOINT3
.CODE=a,b
pl.:
#SHORT_JZ
.ASM
.286
JZ %1
.386
.BAP
ENDM
hat ez eleg bena pelda lett :) vkinek van jobb 5lete?
7. Default INDIRECT-ek nevenek atallitasa [Pila]
eddig is volt:
.VARIND=nev
ujak:
.TEXTIND=nev
.CONSTIND=nev
.FPUCONSTIND=nev
A nev max 8 karakter (filenev tipusu, pont nelkul), a .IND nem kell a vegere!
8. Az FPUCONST ne a CONST.IND-be pakoljon [Panther]
az FPUCONST altal generalt konstansok (pl. FILD 5 miatt)
nem a CONST.IND-be, hanem az FPUCONST.IND-be (vagy amit az .FPUCONSTIND= -el
beallitottak) kerulnek. -> nem fog belezavarni a tudatosan epitett CONST
adatstrukturaba, se az align-olasat nem fogja elrontani.
BAPC v3.0 à20 Service Pack #3 [ bugreports by Szoke ]
~~~~~~~~~~~~~
1. filecmd2.inc-ben ez volt vhol: Mov CX,CX az Xor CX,CX helyett [Szoke]
2. falsemod.inc: ha a sor #-al kezoddott akkor skip. de a #()-ot is! [Szoke]
3. .EVAL modositasok: [A'rpi]
- idezojelen belul nem lehet cimke
- beepitett fuggvenynevek (pl. SIN,LN...) csak nagybetuvel lehetnek!
ha kicsivel van akkor cimkenek veszi
- beepitett fuggveny neve utan nem lehet kozvetlenul cimke:
LNXYZ nem jo, csak igy: LN XYZ
ezt regen elfogadta, de ezugybol sajna ezt rosszul forditotta:
LN_SCALE=1024
EAX:=.EVALI LN_SCALE*12.345
(a _SCALE nevu (nem letezo) konstans logaritmusat akarta venni)
- .EVALx meg mindig bugzik ha x kisbetu ???
BAPC v3.0 pre2 Package SUXXXXXXX
~~~~~~~~~~~~~~
1. Package teszt -> szp kis bug volt a CJ.INC-ben:
SI->^SOR volt SI:=^SOR helyett!!!!!! :(
Ezrt az IF BPORA_FORDIT THENCMD ... sorokat nem forditotta jol :-o
2. Mg 1 durva bug:
P r helyen (pl. *.BPE-ben a MACR keressnl) nem volt berakva DH-ba
a package sz ma mikor megh¡vja a SEARCH_LABEL-t! Csoda hogy eddig ment...
Mostm r megy a package-n bell defin lt makr¢ h¡v sa bellrl.
3. Sz¡v s:
VALAMI::
#^XYZ=NOP
^XYZ
Mert:
A makr¢ keressnl Package0__VALAMI_XYZ keresdik...
Az egsz megold sa: !!!!
A PACKAGE_CIMKEKERESO-t nem a kirtkels eltt, hanem _ut na_ kell
megh¡vni! A fordito ugyis a LABELS adatb zisban t rolja hogy mi
melyik package-be tartozik, nem nv alapj n mint a v2.x verzi¢k.
Megval¢s¡t s:
- A PACKAGE_GETLABEL rutin hat stalan¡tva (egy sz l RET) -> ksbb kiszedni!
- PACKAGE_CIMKEKERESO hiv sok kiszedve (a .BPE-bl s a CJ.INC-bl)
- OPENF.INC-be a FILE2_WRITE_STR s FILE2_WRITELN_STR rutinokba:
if PASS=2 and ACTUAL_PACKAGE_NUM then
copy [SI] -> temp
PACKAGE_CIMKEKERESO(temp)
SI->temp
endif
Felmerlt problm k:
- megjegyzsek is kaptak prefixet -> javitva a PACKAGE_CIMKEKERESO::-ben
- a fordito forrasban volt egy LEGNAGYOBB nev konstans a package-n
bell defin lva amire az FPU.LIB hivatkozott, ez nyilv nval¢ hiba
a forr sban, nem a ford¡t¢ban. javitva.
- a FOR-n l voltak gondok, mivel a gener lt BPC_IFxxx: cimkk
visszakerlnek a NEXT miatt a 2. szint kirtkelhz, ami
bejegyzi az adatb zisba s ezrt Package prefixet kap, de a 2
menet miatt elcs£szhat a sz moz s, s nem j¢ kapja a prefixet...
g nyol s: a 'BPC_' kezdet cimkket nem jegyzi be a SET_LABEL
ezzel gond lehet a .BPO-n l! (mivel akkor nem 'BPC_'-vel kezddik)
-> megold s lehet: a NEXT ford¡t s nak idejre kimaszkolni a cimkket!
Ez sem igaz n mkdik, fleg akkor nem ha elbb van a DEF s ut na a CALL!
Teljesen £j terv:
1. LABELS_RESET-et el kell felejteni -> gond lesz a LIB-ekkel ->
a cimkkhez t rolni kell a PASS sz mot is (package legfels bitben)
2. spec. eset kezels kell: (PACKAGE.TXT)
- ha PASS=2-ben local CALL kell, s csak local CALL-t tal l,
akkor azt trlni kell s ltrehozni globalt
- PASS=2-ben nem hozhat ltre local CALL-t csak globalt (^NINCSILYEN)
LIB-ek kezelse jav¡tva:
SETPROCDEF-ben LIB_MODE=1 esete:
- ha nem tal lta meg akkor RET
- ha LABEL_DEF vagy PROC_DEF s PASS=1 akkor kell (2 menetes ford. miatt)
- klnben ha nem PROC_CALL akkor RET (1 menetes f.)
Vletlen kiderlt bug:
LIB_MODE=1 AND PROC_OK=0 esetn is jegyezte a cimkket (de nem ford¡totta)
ez v2.x szerint ok, de v3.x szerint bug, mert ott cimkre is lehet CALL-ozni
(v2 szerint se jo, mert foglalja a mem¢ri t, de nem befoly solja a forditast)
Problma a maszkol ssal:
.PACKAGE XYZ
.PACKAGE MASK=2
!HELLO ; call pkg=1
HELLO:: ; def pkg=0
hiba: a HELLO:: hi ba global, a package_cimkekereso:: tal l egy HELLO
nev cimkt (a call-t) az aktu lis pkg-ben (1) s ezrt prefixezi :(
Megold s: a p.cimkekereso csak akkor prefixez, ha:
- az aktu lis pkg-ben van a tal lt cimke
- ha nem PROC_CALL a t¡pusa (itt lehet hogy kne warning, legal bb /2-nl)
Problma:
.PACKAGE XYZ
.PACKAGE MASK=2
!HELLO
HELLO:
MASK=2-nl kiirta Proc not found-oknak a LABEL-re vonatkoz¢ call-okat.
A hiba mexnt mag t¢l :)))
(illetve val¢szin att¢l hogy az if MASK&2 and CALL do pkg=0 ki lett szedve)
Egyebek:
~~~~~~~~
- FOR bugok:
1. _FOR_SIZE=7 volt 8 helyett
2. IF BX>MAX_FOR volt BX>=MAX_FOR helyett
3. a 'NEXT' alatt letiltja a SET_LABEL-t hogy a BPC_IFnnn: -ot ne jegyezze meg
- #() bug javitva: nem !JAV-ozott ut na s ezrt nh ny dolog, pl.
FILE-mveletek nem mentek: FILEOPEN SZAM #(DX=NAME1)