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 fordtott, mert vletlen AH-ba raktam a LIB_MODE-t s nem AL-be... (az .OPEN kirtkelskor) - ha regisztrlva van, akkor kiirja, de ha nincs akkor SE szamolgat vissza meg sipol Fordtsos teszteknl kiderlt hibk: - 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. megolds: j vltoz: COMPFILE_LEVEL. 0 ha kvl vagyunk a fprogramon (teht .LIB, .IND esetn) klnben pedig az INCLUDE mlysge. Csak akkor fordt HEADERS(..VAR)-t ha COMPFILE_LEVEL=0 teht a fprgben lev .INDIRECTALL mindig a ..CODE tartomnyba fog kerlni. (v2.4b4-ig is igy volt) (a TSR progik irasa miatt) - PATH kiirasa BAPLINE-ben -> javtva, ha LIB_MODE=1 akkor nem r PATH-ot. - JAVITVA: BAPLINE sorszmozs nem ok (az .OPEN-ek miatt elcsszott) - PilaSoft's SB16 digizoben XMS makro miatt XMS struktura rosszul fordult le... (a makrdef. ksbb van, de 2 menetnl ez nem szmit...) "megolds": #XMS=XMS %1 %2 makr a STRUCT el. jobb lenne valami makr undef funkci. #makrnv= vagy: #-makrnv taln: -#makrnv esetleg: .UNDEF makrnv - .INDIRECTALL problmja: (felmerlt: Pila SB16 digizjnl) pass1: - berakja az .INDIRECTALL sort - berakja a .LIB-eket (.OPEN-.CLOSE) - berakja az .IND-eket (felesleges...) pass2: - tall .INDIRECTALL-t -> berakja az .IND-eket - utna jnnek a LIB-ek. (.OPEN...) kvetkeztets: .LIB-ek s .IND-ek sorrendje megfordul!!!! ;-( megolds: 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: - tall .INDIRECTALL-t, de nem foglalkozik vele! - jnnek a .LIB-ek, ok. - tall .INDIRECTALL2-t, hatsra berakja az .IND-eket addott elny: a forrsba rt .INDIRECTALL2 azt jelenti, hogy csak az .IND-eket rakja bele, a .LIB-eket ne. - STACKSIZE problmja: ( HEADERS() miatt) "STACK DW 0 DUP(?)" sort csinlt, aminek a TASM nem rlt tlzottan... megolds: 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 utn rakta az EQU rtkt, hanem a kvetkez pointere helyre (DI+=LENGTH+4 hinyzott) - SETPROC.INC mexuntetve. elg szarul volt mr v2.4b5 ta a memriakihasznls: - proc_tabl (SETPROC.INC) - package_tabl - labels_tabl SETPROC fonosabb rutinjai (pl. LISTPROC) trva hogy SET_LABEL/GET_LABEL-t hasznljk. j rutin: SETPROCDEF. Elnyk: - cimkeknt definlt (teht 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 hasznlta ha INCLUDE-olt ms PATH-bl mostantl: FILENAME_OFS likvidlva :) maradt FILENAME_WITH_PATH, ebben van az pp fordtott file neve msolva MAKE_BAPLINESTR rutin: ez csinlja 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 vltoznak az OPENF adott rtket attl fggen hogy a VAR.IND-ben vagyunk-e. PASS1 esetn viszont nem hvdik 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, nagyjbl mkdik, kisebb hibkkal: loklis cimkket nem nagyon szerette, mivel a ^-t figyelmen kivul hagyta, s ha msutt is volt ilyen nev lokl. 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 meghvsa miatt ellltdott AL, s ezgybl a PROC:.-ot is PROC::-nak vette. - LABELS.INC supportolja a PACKAGE-t +1 byte cimknknt, amely a ltrehozsakor aktulis PACKAGE szma (ACTUAL_PACKAGE_NUM) Keressnl SH-ban package szma, ha nem tall 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 _kdjt_ DL-ben, valamint DH-ban hogy a hiv rutin tmogatja-e az IF-EQU-t. Rszletesebben lsd 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 tmogatsa - egy csom szart ki lehetett trlni IF2B-ben, mivel a WRITE_CMP2 megoldja (pl. llando FELTETELES_SIGN figyels) - jobban optimalizl: - pl. IF AH<0 THEN... -re kiirja hogy hlyesg (always FALSE) (ha eljelesen akarjuk, akkor ugyebr IFS AH<0 THEN... kell!!!) - pl. IF AH>0-nl is OR-t fordt (nem CMP-t) ^REGN0_* vltozk is eltvoltva. - 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 szmok (!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-nl is figyelembe veszi a SIGN flag-et, teht az IF -3<5 THEN FALSE-t fog adni, mert a (-3)-at unsigned-re konvertlja!!! ha eljelesen kell, akkor IFS -3<5 THEN -> ez mr TRUE lesz. - WRITE_CMP-be: ha olyat tall hogy P1_TYPE=imm akkor megcserli a 2 paramtert, s megfordtja a mveleti jelet is. (pl.: IF 5>AX THEN AX_KISEBB_MINT_5) (mivel CMP 5,AX nem lefordthat, csak a CMP AX,5) - IF2B.INC-be: IN]a..b[ s trsai (nyitott s zrt intervallumok kezelse) Ha ellenkez irnyban van a [ vagy ] mint lenne IN[] esetn, akkor abba az irnyba 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] === 30 ) .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" szm (pl: "12345"), klnben 0 .IMM xyz = 1 ha "xyz" immediate (szm 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 ezltal IF-ben is felhasznlhat, gy lehet fordtskor kirtkeld IF-et (IF-EQU) is csinlni vele. Pl.: IF .CPU<586 THEN .OUT *** This library requires Pentium! *** ENDIF Ez ha pl. 386-ra fordtunk, akkor __fordtskor__ 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 utn - 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 vltoznak! 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 1 ha van xyz, 0 ha nincsen (csak ".NB" van) mire j? Makrkba megnzni hogy van-e megadva paramter pl: #XYZ=IF .NB %3 THENCMD 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 jl... - msik IF-EQU bugfix: az ENDIF-et XCOMPLINE-al fordtotta, gy ha FALSEMOD-ban vagyunk, akkor nem kapcsoldik ki. mo: FALSEMOD:=0 ("IF 0 THENCMD XYZ" utn FALSEMOD-ban felejtdtt a fordt) - j ford. vezrl opcik: .NICEASM = .SZEPASM+.MEGJ ON+.NOBAPLINE .INCSRC = kommentknt berakja a .BP3 forrs sorait is az .ASM-be (hibakeresshez, ASM-BAP sszehasonltshoz) - !!! 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 hasznlhat nhny FPU utasts utn: 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! lefordtva: csinl egy "BPC_FPUCnnn Dx y" konstanst (CONST.IND-be), ahol: nnn=sorszm, automatikusan nvexik... Dx = tipus, ha PTR-el meg van adva a szm eltt default: DD (DWORD) y = a szm, ha egsz volt, de float-os utastssal, akkor .0 vgzds hozzrdik, klnben a TASM szarul fordtja A szmot kicserli a BPC_FPUCnnn cimkre. tmogatott utastsok: FLD,FMUL,FADD,FSUB,FDIV (illetve ezek FI* verzioi) van mg olyan utasts, 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! - 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 verzikkal, mert a ; utn nem szabadna semmit rtelmeznie... ) Megolds: a C-style kommentek tdolgozsa. - elbb rtkeli ki a ;-t s utna a /* */-t - egymsba gyazott tbb szint /* */ kommentek kezelse: KELL /* KOMMENT /* KOMMENT_A_KOMMENTBEN */ EZ MEG KOMMENT */ NEM_KOMM - hibajelzsek: - ha a prg vgre marad nyitott /* - ha */-ot tall amihez nincs /* - ->IND bug .EXE filenl: 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 logolst - LABELS kicsit tirva, az EQU rtkeket nem a cimkenv utn 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 ajnlatos azokat a konstansokat hasznlni) 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 trolja a konstansokat egsz szmknt (+/-) vagy string-knt kell mg: FLOAT szmbeolvas+trol - 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 fordts 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 visszartam 400-rl 512-re - kis mdosts: ha a % utn rtelmezhetetlen karaktert tall (azaz amihez (mg) nincs funkci rendelve) akkor nem kiirja hanem tugorja. Ez kell a ksbbi fejlesztsekhez... (br kicsit inkompatibilis a rgi verzikkal :( ) teht eddig pl a %A esetn A-t irt ki, mostantl semmit. (igazbl ugyis %A-t kellett volna kiirjon...) A % jel tovbbra is a %%-al irhat ki. - j parancssori kapcsol: /INFO kiir egy oldalnyi hasznos inft: ----------------------- Compiler info ---------------------------- Memory: Code: 32765 ; a BAPC kdjnak mrete (LIB-ek nlkl) Data: 58432 ; adatszegmens mrete (STACK nlkl) Free mem at start: 516 kB ; a BAPC indtsakor szabad memria Free memory now: 403 kB ; a bels modulok inicializlsa utni szabad mem. Memory limits: READ_buffer=2048 ; olvassi puffer. fileonknt kln van. WRITE_buffer=4096 ; rsi puffer, egy van, indirect-vltskor flush. :( FUNCTABL=8192 ; ide trolja a fggvnyek kimen paramtereit LABELS=32768 ; ide teszi a cimkket, EQU-kat s a makrkat is Length limits: SORMAXSIZE=512 ; egy sor max. hossza LABEL_MAXSIZE=128 ; egy cimke max. hossza Nest limits: ; egymsba gyazsi korltok: 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 memria foglalsok. - szmozott fordts, igy knnyebb lesz beazonostani a BAPC verzijt: BAssPasC Compiler v3.0a11 build #0044 Copyright (C) 1996-98. ESP-team ez a fordts sorszma -->---^^^^ egy kls progi a BAPC minden jrafordtsakor nveli ezt az rtket. - Tbbsoros makrk! definls: #makronev(parameterek):kimenet ... ... ENDM Megj: - param s kimenet nem ktelez - nem lehet = jel a #-os sorban! (mert akkor egysoros makrnak veszi) (illetve a param.vagy kimenet tartalmazhat, de a kimenet utn nem lehet semmi.) - az ENDM-el csak akkor forgalkozik ha ppen egy tbbsoros makrban vagyunk. teht a TASM-os MACRO-ENDM dolgot nem piszklja! - rekurzi s makrdef a makrban nem megy mg :( - a makrodef a 0-s szinten hajtdik vgre, ami nem a legjobb mg most, de meg fogom csinlni hogy a 0-s szinten rtkelje majd ki a makrkat s akkor lehet indirect-eket, .ASM/.BAP, meg mindent csinlni makrval is - Internal: j: DEBUG.H makrk vannak benne a debuggols egyszerstsre... a MACRODEF rsz mr ezeken keresztl rja ki a debug zeneteit. BAPC v3.0 12 - viny elszlls utn... 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 utoljra definlt 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 :) - rekurzv makrk: 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 lefordtani, mostmr 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 makrk 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 sorsra is lehet hivatkozni %O-val pl: ECX:=XYZ akkor az XYZ makroban a %O helyere ECX fog kerulni... - % utni I azt jelenti hogy le kell vgni az idzjelet a paramterrl pl: #KETSZER=%I1//%I1 KETSZER 'MOV AX,5' - MAKROnv utn kzvetlen lehet: space, zarojel, idezojel, vesszo teht 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 utasitsok - 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 letisztzva nagyjbl (kommentek, meg felesleg kitrlse) - j parancssori kapcsol: /LMS=nn - LABEL memria mretnek megadsa kB-ban default: 32kB nn=1..64 pl.: BAPC3 /LMS=64 NAGYPRG.BP3 - LABELS: kicsit mdositottam a hibakezelsen: - 17-es tipusnl (PROC_CALL) sose jelez 'label redef. to diff. type'-ot - warningol a makro atdefinalasra - Uj bels fggvny: .EVAL - lebegpontos kirtkel Pila kifejezs kirtkeljt hasznlja (SZAM.INC). lehetsgek: .EVAL xxx = lebegpontos szmot ad vissza (pl.: 3.14159265E0000) .EVALI xxx = egsz (kerektett) szmot ad vissza (pl.: 3) .EVALD xxx = lebegpontos szmot ad vissza HEXA-ban (pl 12832594h) .EVALQ xxx = lebegpontos szmot ad vissza HEXA-ban, de ez QWORD .EVALT xxx = lebegpontos szmot 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 aritmetiknl hasznos, pl: EAX+=.EVALI 65536/(240/200) Az utolso 3 akkor j, ha pl. MOV-al akarsz rtket adni egy float vltoznak/regiszternek. ui. a TASM nem engedi pl az EAX:=1.31 -et!!! *** - A hasznlhat fggvnyek, funkcik: + - * / ^ ! ( ) (x^y=hatvnyozs, !x = x faktorilisa) 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 tmogatjk, st mg az .EVAL se kell! pl: FADD 2/SAMPLEFREQ pl: FILD DPT 65536*3/7532 (a ?PT-bl meg az I-bl kitallja a tipust) - a CONST is tmogatja, .EVAL-al: CONST SZOG_D:DD=.EVAL 1/SAMPLEFREQ - Lehet idzjelet is hasznlni: 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 lezr 0-t az egsz szm utn (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 hasznljon HEADER-filt: .NOHEADER pl.: .NOHEADER .386 ... elnye: ASM fileokat,amelyekben mr benne van a header,gy knnyebb trakni. - hiba fordtskor: csak 16 biten trolja a sorszmokat,gy hosszabb :) fileok esetn rossz eredmnyt mutat,amikor kirja,hny sorbl llt a file. -> JAVITVA -> lehet irni 4millird soros programot jol ;-) - Mostmr 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 hasznljk (IF vagy IFS) amg az Ix (INTEGER) s Ux (UNSIGNED) tipusuakat nem befolysolja ez. Ha egy integert hasonlt akarmivel akkor signed lesz, ha unsignedet akrmivel (kivve integer-rel) akkor unsigned. klnben meg a default. Kell mg: - FLOAT sszehasonltsok. (FLOAT-IMM, FLOAT-MEM, FLOAT-FLOAT) pl: IF ST FCOM ST(2) pl: IFP ST FCOMP ST(2) IF FD_VALTOZO<5 -> FLD FD_VALTOZO/FCOMP BPC_IMM_5 IF ST FCOM FD_VALTOZO - SZAM.INC-be: hexa szmok kezelse is (!XGETNUM) pl: EAX:=.EVALI 0A0000h+GETMAXX/8*(240/200) -> kitrltem az FPUCONST-bl a rgi szm-detektlt, mert elmletileg a KIERTEKELI:: miatt teljesen feleslegess vlt. ha mgse akkor gyjrs. - j FPUCONST cimkegenerl 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 -=> - olvashatbb lesz az .ASM (kit rdekel? :)) - nem lesz tbb cimke definlva ugyanahhoz a konstanshoz!!! <- MUXIK lebegpontosnl a default tpus DD (DWORD), ami az j .FLOAT=tipus paranccsal megvltoztathat. a .FLOAT utn 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 hasznlhat az E flag, itt azt jelenti hogy a szmll=0 esetben mg visszaugrik (teht --ECX//JNZ helyett --ECX//JNS van a vgn) - megadhat a ciklusszmll regiszter a kvetkez mdn: FORL(ciklusregiszter,ciklusszm) 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. Mr az elz verzi is tudta, csak kimaradt a doksibl: [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). Kijavtottam, hogy ezt is kezelje, gy nem kell mostantl az .EVALI-t odarni. 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 csinlja. gy pl. szerinte a '3.3=3.14159265' felttel az TRUE. :( 3.b. Csak akkor mkdtt az .OUT ha a sor elejn volt. JAVITVA -> mostmr brhol lehet, de ha nem a sor elejn van, akkor csak a kvetkez //-ig rja ki. (a // utnit pedig lefordtja...) 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'-nl vletlenl 2x hajtdott 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] lellt INTERNAl ERROR-al, mert veletlen kitrldtt egy JMP belle :) 2. Problma: [Panther] XYZ=.TYPE valami IF XYZ=szm THEN... Az EVAL nem tudta kirtkelni a fggvnyhvst (a .TYPE az fggvny). JAVITVA: Az =-jeles rtkadsokra 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: Pr helyen (pl. *.BPE-ben a MACR keressnl) nem volt berakva DH-ba a package szma mikor meghvja a SEARCH_LABEL-t! Csoda hogy eddig ment... Mostmr megy a package-n bell definlt makr hvsa bellrl. 3. Szvs: VALAMI:: #^XYZ=NOP ^XYZ Mert: A makr keressnl Package0__VALAMI_XYZ keresdik... Az egsz megoldsa: !!!! A PACKAGE_CIMKEKERESO-t nem a kirtkels eltt, hanem _utna_ kell meghvni! A fordito ugyis a LABELS adatbzisban trolja hogy mi melyik package-be tartozik, nem nv alapjn mint a v2.x verzik. Megvalsts: - A PACKAGE_GETLABEL rutin hatstalantva (egy szl RET) -> ksbb kiszedni! - PACKAGE_CIMKEKERESO hivsok 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 problmk: - megjegyzsek is kaptak prefixet -> javitva a PACKAGE_CIMKEKERESO::-ben - a fordito forrasban volt egy LEGNAGYOBB nev konstans a package-n bell definlva amire az FPU.LIB hivatkozott, ez nyilvnval hiba a forrsban, nem a fordtban. javitva. - a FOR-nl voltak gondok, mivel a generlt BPC_IFxxx: cimkk visszakerlnek a NEXT miatt a 2. szint kirtkelhz, ami bejegyzi az adatbzisba s ezrt Package prefixet kap, de a 2 menet miatt elcsszhat a szmozs, s nem j kapja a prefixet... gnyols: a 'BPC_' kezdet cimkket nem jegyzi be a SET_LABEL ezzel gond lehet a .BPO-nl! (mivel akkor nem 'BPC_'-vel kezddik) -> megolds lehet: a NEXT fordtsnak idejre kimaszkolni a cimkket! Ez sem igazn mkdik, fleg akkor nem ha elbb van a DEF s utna a CALL! Teljesen j terv: 1. LABELS_RESET-et el kell felejteni -> gond lesz a LIB-ekkel -> a cimkkhez trolni kell a PASS szmot is (package legfels bitben) 2. spec. eset kezels kell: (PACKAGE.TXT) - ha PASS=2-ben local CALL kell, s csak local CALL-t tall, akkor azt trlni kell s ltrehozni globalt - PASS=2-ben nem hozhat ltre local CALL-t csak globalt (^NINCSILYEN) LIB-ek kezelse javtva: SETPROCDEF-ben LIB_MODE=1 esete: - ha nem tallta 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 fordtotta) ez v2.x szerint ok, de v3.x szerint bug, mert ott cimkre is lehet CALL-ozni (v2 szerint se jo, mert foglalja a memrit, de nem befolysolja a forditast) Problma a maszkolssal: .PACKAGE XYZ .PACKAGE MASK=2 !HELLO ; call pkg=1 HELLO:: ; def pkg=0 hiba: a HELLO:: hiba global, a package_cimkekereso:: tall egy HELLO nev cimkt (a call-t) az aktulis pkg-ben (1) s ezrt prefixezi :( Megolds: a p.cimkekereso csak akkor prefixez, ha: - az aktulis pkg-ben van a tallt cimke - ha nem PROC_CALL a tpusa (itt lehet hogy kne warning, legalbb /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 magtl :))) (illetve valszin attl 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 utna s ezrt nhny dolog, pl. FILE-mveletek nem mentek: FILEOPEN SZAM #(DX=NAME1)