PB versus QB (deel 3)

FUNCTION. PB-functies kunnen op gelijke wijze gebruikt worden als procedures en wel door middel
van het CALL-commando. In PB is het echter ook mogelijk om deze aan te roepen zonder gebruik van
het CALL-commando. Een functie zonder argumenten lijkt dan erg veel op een BASIC-statement, met dien 
verstande dat dit zelfgemaakte statement alleen in uw programma als zodanig gebruikt kan worden. Dus zonder 
bijbehorende functie krijgt u in andere programmas gegarandeerd een foutmelding. Als een functie met 
argumenten zonder CALL gebruikt wordt vervallen echter de haakjes die normaal voor en achter de argumenten 
staan.
* * * * *
ITERATE, ITERATE FOR, ITERATE DO en ITERATE LOOP. Als een van deze statements in een loop 
staat wordt er direct naar het einde van lopende structuur gesprongen en gecontrolleerd of  aan de voorwaarde 
van de loop is voldaan. Zo niet dan wordt de loop voortgezet. Doorgaans is er door middel van een IF-statement 
een voorwaarde aan verbonden. Hiermee kunt u dus een selectie maken van regels die overgeslagen moeten 
worden, of definitief de structuur verlaten.
* * * * *
LOCAL. Het LOCAL-statement is uitsluitend legaal in procedures en functies en het moet daarin voor alle 
andere uitvoerbare commandos geplaatst worden. De (string)variabelen mogen daarna eventueel dezelfde namen 
hebben als in het hoofdprogramma. Die blijven de hun toegekende waardehouden. Na het verlaten van procedure 
of functie worden de daarin gebruikte variabelen weer op nul respectievelijk op 0 gezet. Daarbij zijn de 
gelijke (string)variabelen in het hoofdprogramma onaangetast. In QB is LOCAL ook een gereserveerd woord om 
eventueel in toekomstige versies toegepast te kunnen worden. Zover is het helaas niet meer gekomen aangezien 
verdere ontwikkeling van QB is stopgezet.
* * * * *
MAP. Dit statement creert een dynamische data structuur binnen een PBs FLEX string variabelen. QB kent dit 
statement niet.
* * * * *
MEMSET. Met het MEMSET-statement wordt gebruikt om het bovenste geheugenadres te bepalen.
* * * * *
MTIMER. MTIMER leest of zet de microtimer.
* * * * *
POKEI en POKEL. Deze twee statements werken gelijk als POKE, behalve dat ze niet een, maar respectievelijk 
twee (POKEI) en  vier (POKEL) plaatsen tegelijk kunnen vullen.
* * * * *
POKE$. Hiermee kunnen tot 32757 geheugenplaatsen in een keer gevuld worden. POKE$ is handig om grote 
delen van het geheugen, met slechts n instructie te copieren.
* * * * *
POPUP. Het POPUP-statement wordt gebruikt om TSR programmas met slechts n toetsdruk, al dan niet 
werkend, op het scherm te zetten.
* * * * *
PRIVATE. PRIVATE wordt gebruikt wanneer een procedure of functie niet toegankelijk mag zijn voor een 
andere module.
* * * * *
PUBLIC. Als toevoeging aan een procedure of functie, wordt aangegeven dat die toegankelijk is voor andere 
modules. Standaard is een procedure of functie PRIVATE. Het kan het in uw hoofdprogramma ook gebruikt 
worden om te zorgen dat (string)variabelen ook in een UNIT files of een assembly language object (.OBJ) 
herkend worden.
* * * * *
PUT$. Het PUT$-statement schrijft een string naar een BINARY file.
* * * * *
REPLACE. Het REPLACE-statement doorzoekt een string en vervangt de gezochte substring door een andere. 
Zon substring kan zelfs slechts n karakter zijn.
* * * * *
ROTATE. Met ROTATE worden de bits in een integer variabele types (byte, word, integer, double word, long 
integer of quad integer) naar keuze, links of rechts verschoven. Het bit dat uit de byte(s) valt, schuift aan de 
andere kant weer aan.
* * * * *
SHIFT. Dit statement doet hetzelfde als ROTATE waarbij het bit dat uitvalt niet naar de andere kant verhuist, 
maar vervangen wordt door een nul-bit, ongeacht of het uitgeshoven bit nul of een is.
UNION. Het UNION-statement lijkt een beetje op het TYPE-statement, maar is minder strikt in toewijzingen 
van de te gebruiken onderdelen. In combinatie met het een UDT (User-Defined Type) is het een krachtige 
functie, zoals onderstaand voorbeeld duidelijk zal maken.

DEFINT A-Z

TYPE SystemTimeType
  HH AS STRING * 2
  Colon1 AS STRING * 1
  MM AS STRING * 2
  Colon2 AS STRING * 1
  SS AS STRING * 2
END TYPE

UNION TimeUnion
  TypeTime AS SystemTimeType
  StringTime AS STRING * 8
END UNION

DIM Tijd AS TimeUnion
  LSET Tijd.StringTime = TIME$
  PRINT " De Tijd is "; Tijd.TypeTime.HH; " uur "; Tijd.TypeTime.MM; _
                      " minuten en "; Tijd.TypeTime.SS; " seconden."
END
* * * * *
VIEW. Het VIEW-statement definierd een viewport van elke willekerige grootte binnen de begrenzingen van 
het beeldscherm. QB kent ook een VIEW-statement. De syntax is echter ietsanders. In de afsluiting van deze 
reeks zal het duidelijk zijn bij de conversievoorstellen.
* * * * * * * * * *

Functies.
ASCII. De ASCII-functie retourneert de ASCII-waarde van een karakter, of van het eerste karakter van een 
string, dus op dezelfde wijze als de ASC-functie. Het verschil zit in het feit dat ASCII bij een lege string 
(nulstring) de waarde 1 weergeeft. ASC retourneert in dat geval een ERROR 5, Illegal Function Call.
* * * * *
BIN$. BIN$ zet de binaire presentatie van een een decimaal getal op het scherm.
* * * * *
BIT. De BIT-functie retourneert de waarde  van een gespecificeerde bit in een integer variabele. (1,2,4.8,16,32. 
enz.)
* * * * *
BITS?, BITS??, BITS???, BITS% en BITS&. Deze functies converteren de waarde van een signed integer in 
een unsigned integer en de waarde van een unsigned integer in een signed integer.
* * * * *
CEIL. CEIL retourneert de kleinst mogelijke integer, gelijk aan of groter dan een gegeven numerieke waarde. 
Een afronding naar boven dus. (0 blijft 0 -- 0.5 wordt 1 -- 1.0 wordt 1 --  enz.)
* * * * *
CHR$. Met de CHR$-functie is het in PB mogelijk om een reeks nummerieke waardes als argument tussen de 
haakjes te plaatsen. Deze ASCII-karakter worden elk gescheiden door een komma. Voorbeeld: CHR$(33, 34, 
35, 36, 37, 38, 39, 40) retourneert als OUTPUT !#$%&( Het is bijvoorbeeld handig in het 
gebruik met grafische karakters.
* * * * *
CURDIR$. CURDIR$ retourneert de in gebruik zijnde drive en directory van het pad waar u momenteel in 
werkt.
* * * * *
CBCD, CBYT, CDWD, CEXT, CFIX, CQUD en CWRD. Deze functies converteren strings respectievelijk in 
hun nummerieke equivalenten: Binary Coded Decimal,  Unsigned Byte,  Unsigned Double Word,  Extended 
Precision Floating Point,  Binary Coded Decimal,  Fixed Point,  Quad Integer en Unsigned Word.
* * * * *
CODEPTR en CODESEG. Deze twee functies geven respectievelijk het offset- en segmentadres door aan het 
programmadeel (label), procedure, of functie, al naar gelang welke van deze drie actief is.
* * * * *
CVMS en CVMD. CVMS en CVMD zijn respectivelijk het equivalenten van CVSMBF en CVDMBF in QB.
* * * * *
DIR$. DIR$ wordt gebruikt om een directory van een diskettestation of pad, naar keuze, te lezen met 
gebruikmaking van eventuele wildcards (* of ?) of geselecteerde extensie.
* * * * *
ENDMEM. Deze functie retourneert het eindadres van het conventionele geheugen. Het herkent niet  het 
eventuele aanwezige extended- of expanded memory. 
* * * * *
ERADR. ERADR retourneert het adres van de meest recente progammeerfout.
* * * * *
ERRTEST. Deze funtie de zet de error code van de meest recente run-time error op het scherm. Meteen nadat 
de functie is aangeroepen wordt het ge-reset.
* * * * *
EXP2 en EXP10. 
EXP2 retourneert het resultaat van base2.
(EXP2(3) = 2 ^ 3 = 8).
EXP10 retourneert het resultaat van base10 
(EXP10(3) = 10 ^ 3 = 1000).
* * * * *
EXTRACT$. EXTRACT$ retourneert een of meer geselecteerde karakter van een gekozen string.
* * * * *
FILEATTR. FILEATTR retourneert informatie over de mode van een file naar keuze (OPEN of CLOSE). 
QB kent deze functie ook, er zijn echter kleine verschillen, Zo kunt u in PB met de juiste parameters in uw 
prgramma meer informatie opvragen over een geopende file dan in QB, bijvoorbeeld de lengte van een 
RANDOM ACCESS file.
* * * * *
FRAC.. FRAC retourneert de fractie van een decimaal getal. Dat is het gedeelte achter de komma.
* * * * *
GET$. GET$ leest een string van een bepaalde lengte in een geopende binaire file.
* * * * *
INSTAT. INSTAT retourneert een logical TRUE als er op zijn minst een karakter in de keybourd buffer staat 
te wachten. Is de keyboard buffer leeg dan wordt FALSE geretourneerd.
* * * * *
INSTR. Deze functie kent QB ook. Het verschil is dat in PB de functie uitgebreid is met het sleutelwoord ANY.  
* * * * *
LOG2 en LOG10. Deze twee fucties retourneren respectievelijk de resultaten van de logaritmes base2 en base10.
* * * * *
LTRIM$. In PB kan met LTRIM$ een gedeelte van een string op het beeldscherm gezet worden. Daarbij 
worden gelijktijdig eventuele spaties aan het begin daarvan verwijderd. Dat is standaard bij PB. Bij het gebruik 
van LTRIM$ in QB worden alleen maar de voorafgaande spaties van een string verwijderd. De mogelijkheid om 
een gedeelte van de string gelijktijdig op het scherm te zetten heeft QB niet. Daar is nog een tweede instructie 
voor nodig.
* * * * *
MAX, MAX% en MAX$. Elk van deze functies zal de grootst van een reeks argumenten retourneren. Een 
argument tussen de haakjes is dus onzin. Er moeten meerdere tussen de haakjes staan,waarbij het MAX% niet 
uitmaakt van welk type het is. a%, b& * 3,  27, d% (n) +5 en c&& / 3 zijn allemaal legaal. Deze 
nummerieke variabelen moeten tussen 32768 en +32768 liggen. Daarbuiten liggende waardes veroorzaken een 
OVERFLOW error. Voor MAX$ gelden dezelfde regels met dien verstande, dat daar als argumenten natuurlijk 
alleen maar normale strings, flex-strings, concatinaties, string-functies of hele woorden tussen aanhalingsteken 
gebruikt mogen worden.
* * * * *
MEMPACK. Deze functie is hoofdzakelijk van nut voordat u het sleutelwoord CHAIN moet toepassen. Het 
pakt alle aanwezige strings tesamen (compressen) in een aaneengesloten blok.
* * * * *
MIN, MIN% en MIN$. Voor elk van deze functies gelden dezelfde regels als omschreven in MAX, MAX% en 
MAX$. Het verschil daarmee is dat inplaats van de grootst, het kleinste argument wordt gekozen.
* * * * *
MKMS$ en MKMD$. MKMS$ en MKMD$ zijn respectivelijk het equivalenten van MKDMBF$ en 
MKDMBF$ in QB.
* * * * *
PEEKI, PEEKL. Deze twee statements werken gelijk als PEEK, behalve dat ze niet een, maar respectievelijk 
twee (PEEKI) en  vier (PEEKL) plaatsen tegelijk worden ingelezen.
* * * * *
PEEK$. Hiermee worden tot 32757 geheugenplaatsen in een keer ingelezen. PEEK$ is handig om grote delen 
van het geheugen, met slechts n instructie te copieren.
* * * * *
POPUP. Deze functie geeft informatie over een TSR programma.
* * * * *
REMOVE$. REMOVE$ retourneert een string na verwijdering van de geselecteerde karakters.
* * * * *
REPEAT$. Met REPEAT$ is het mogelijk om een string een aantal keren achter elkaar op het scherm te zetten. 
Dat kan bijoorbeeld een reeks asteriksen zijn, of een combinatie van verschillende karakters. Dit geeft dus meer 
mogelijkheden als de functie STRING$.
* * * * *
ROUND. De ROUND-functie rond een getal af tot het door u gekozen aantal cijfers achter de komma. Dit is 
vooral bruikbaar bij het printen op papier van getallen die berekend in een single, double of extended-precision 
floating point variabele.
* * * * *
RTRIM$. In PB kan met RTRIM$ een gedeelte van een string op het beeldscherm gezet worden. Daarbij 
worden gelijktijdig eventuele spaties aan het ende daarvan verwijderd. Dat is standaard bij PB. Bij het gebruik van 
RTRIM$ in QB worden alleen maar de afsluitende spaties van een string verwijderd. De mogelijkheid om een 
gedeelte van de string gelijktijdig op het scherm te zetten heeft QB niet. Daar is nog een tweede instructie voor 
nodig.
* * * * *
STR$. In PB heeft STR$ meer mogelijkheden als in QB. Het is mogelijk doormiddel van een tweede argument 
te bepalen uit hoeveel digits het resultaat mag bestaan Argumenten worden gescheiden door een komma, waarbij 
het tweede argument niet verplicht is. Bijvoorbeeld: PRINT STR$(5/3, 2) geeft als output 1.7 en PRINT 
STR$(5/3, 8) geeft als resultaat op het scherm 1.6666667.
* * * * *
STRPTR. STRPTR retourneert de offsetgedeelte van het adres van een gegeven stringvariabel.
* * * * *
STRSEG. STRSEG retournert het segmentgedeelte van het adres van een gegeven stringvariabele.
* * * * *
TALLY. TALLY is een teller die een gegeven substring in een string telt. Met gebruikmaking van het 
sleutelwoord ANY is het mogelijk om het totale aantal karakters in een string, of zelfs in een tekst-file te tellen.
* * * * *
TRIM$. TRIM$ retourneert een string na verwijdering van alle overbodige spaties aan het begin en aan het einde 
daarvan. Tegelijk is het mogelijk om een gedeelte van die string op het scherm te zetten. Deze functie is in QB 
niet aanwezig, evenmin bij versies ouder dan PB3.5, maar kan wel gesimuleerd worden doormiddel van een 
combinatie van de LEFT$- en RIGHT$-functies.
* * * * *
USING$. USING$ formatteert nummerieke- of stringdata bijna op gelijke wijze als PRINT USING.
* * * * *
VERIFY. Deze functie controlleert of bepaalde karakters in een string ook aanwezig zijn in een andere string.Het 
kan bijvoorbeeld gebruikt worden om te controlleren of  tussen tekst wel of geen cijfers voorkomen.
* * * * * * * * * *

Operators.
ISFALSE en ISTRUE. Deze functies retourneren de logische FALSE of TRUE als een expressie 
respectievelijk niet of wel waar is.
* * * * * * * * *

Systeem variabelen.
FIXDIGITS. FIXDIGITS bepaalt het aantal decimalen bij het gebruik van BCD fixed point variabelen.
* * * * *
FLEXCHR$. FLEXCHR$ vult een flexstring of een random access file buffer op met een gekozen karakter. 
Als er geen bepaald karakter is gespecificeerd worden deze standaard met spaties opgevuld.
* * * * * * * * * *

Nog enkele verschillen. 
CIRCLE. QB bebruikt de schermbreedte als referentie voor het berekenen van een ovaal, PB refereert aan de 
hoogte.

SCREEN 13 is alleen bekend in QB. Meestal is het mogeljk om in PB dit te vervangen voor SCREEN 12.

PCOPY. QB gebruikt PCOPY om de inhoud van een video-pagina naar een andere te copieren. PB kent dit 
commanda niet, maar heeft wel gezorgd voor een alternatief. Er is in de SCRUNIT, die sandaard meegeleverd 
wordt, een procedure te vinden die het gelijke effect heeft. Het heeft bijna dezelfde naam: PGCOPY(). PCOPY 
0, 1 wordt in PB PGCOPY 0, 1, of als u wilt, CALL PGCOPY ( 0, 1)

LOF. Er is ook een verschil bij seriele communicatie. QB gebruikt hiervoor de transmit buffer en PB de receive 
buffer. Transmit = LOF(PortHandle%) in QB moet in PB geconverteerd worden  naar Receive = 
LOF(PortHandle%)"

Enkele andere conversievoorstellen.
	QB						PB

COMMON SHARED a, b, c$ 			COMMON a, b, c$ : SHARED a, b, c$

DIM SHARED x(1 TO 20) AS INTEGER	DIM x(1 TO 20) AS SHARED INTEGER"

DIM SHARED x(1 TO 20) 			DIM x(1 TO 20) AS SHARED

REDIM x(1 TO 30)			REDIM SHARED x(1 TO 30)"

CONST FALSE= 0, TRUE= NOT FALSE		%FALSE = 0: %TRUE = NOT FALSE

WHILE x&				WHILE ISTRUE x&

WHILE a$				WHILE LEN(a$)

CLS 0					CLS SCREEN"

CLS 1					CLS GRAPHICS"

CLS 2					CLS TEXT"

VIEW PRINT 9 TO 20			VIEW TEXT (1,9)-(pbvScrnCols,20)

WIDTH LPRINT 40				WIDTH "LPT1:"

x! = CVSMBF(Float$)			x! = CVMS(Float$)

x# = CVMBF(Float$)				x# = CVMS(Float$)
		
x$ = MKSMBF$(Float!)			x$ = MKMS$(Float!)

x$ = MKDMBF$(Float#)			x$ = MKMD$(Float#)

CLEAR ,,1024					$STACK 1024

RUN 200					CLEAR : GOTO 200

$INCLUDE 'filename.ext'			$INCLUDE "filename.ext"

