
|
Talstelsels Genic Clubguide, 00-00-00
PROGRAMMEREN: BIN-DEC, DEC-BIN, HEX-DEC, DEC-HEX
Nee, dit wordt geen vrolijke tekst. Dit is niet bedoeld om
te lezen als u de Clubguide doorneemt, maar voor alle
programmeerartikelen kunt u eigenlijk het beste even gaan
zitten, als u even tijd hebt.
De bovengenoemde getallenconversies zijn eigenlijk niet
bedoeld voor pure basic-programmeurs, want daar zijn de
volgende conversies mogelijk:
PRINT &B1000111
PRINT BIN$(132)
PRINT &B4F
PRINT HEX$(124)
Maar voor andere basics (niet interresant voor MSX-ers) of
een compiler (MCBC!) zijn de echte technieken onmisbaar!
Deze kunnen namelijk niet altijd met de bovenstaande
commando's worden verwerkt. Natuurlijk zijn deze niet alleen
daarvoor bruikbaar, als u de techniek snapt waarmee gewerkt
wordt is dit ook voor machinetaal en hoge programmeertalen
erg interessant (bijvoorbeeld voor het maken van een (disk-)
monitor.
BINAIR naar DECIMAAL
We gaan er even vanuit dat het binaire getal in A$ staat,
met de toevallige waarde. Deze string moet omgezet worden
naar een integervariabele, genaamd A. We geven hier de
listing, bekeken vanuit basic.
100 DEFINT A-Z
110 A$="10100101"
120 B=0:A=0:T=256
130 T=T\2:B=B+1
140 IF MID$(A$,B,1) = "1" THEN A=A+T
150 IFB=8THEN70 ELSE 40
160 PRINT A
De techniek werkt als volgt: B is de teller. T is eerst 256,
wordt IN de lus, VOOR de eerste bewerking door 2 gedeeld,
dus nu 128, daarna 64, 32 etc. geeft dus steeds de decimale
waarde van bit B aan. Ook B wordt voor de lus verhoogd met 1
tot 1, dan 2 etc. en geeft de MID$-plaats voor het lezen van
A$ aan, dat is dan bitnummer 7 tot 0. Als de bit op "1"
staat moet bij A de decimale bitwaarde T worden opgeteld.
Zodra de teller na de 8e lusdoorloping op 8 staat wordt de
lus niet meer herhaald.
DECIMAAL naar BINAIR
100 DEFINT A-Z
110 A=112:T=256:B=0
120 T=T\2:B=B+1
130 IFA=>T THEN A=A-T: A$=A$+"1" ELSE A$=A$+"0"
140 IFB=8 THENGOTO60ELSE30
150 PRINT A$
De techniek is eigenlijk gelijk -of juist omgekeerd- aan die
van het BIN-DEC programma. B is weer de bitteller, T de
decimale waarde van die bit, A is de waarde die over moet
worden gezet naar A$. In regel 130 kijk ik of T (nog)
voorkomt in het getal A, zoja dan wordt T van A afgetrokken
en een "1" toegevoegd aan A$, zoniet wordt alleen een "0"
toegevoegd. Ook hier weer wordt aan het eind van de lus de
teller gecontrolleerd.
DECIMAAL naar HEXADECIMAAL
Weer een hele andere techniek komt aan bod bij het omzetten
van decimaal naar hexadecimaal, interessant voor het maken
van een monitor!
100 DEFINTA-Z
110 A=123 : A$="" :B=0:C=0
120 B=A\16:C=AMOD16
130 B=B+48:IFB>58 THENB=B+7
140 A$=A$+CHR$(B)
150 C=C+48:IFC>58 THENC=C+7
160 A$=A$+CHR$(C)
170 PRINTA$
We maken hier geen gebruik van lussen. De bedoeling is om A
(decimaal) om te zetten naar een hexadecimale string (A$).
Dit doen we door in regel 120 eerst B gelijk te maken aan A
gedeeld door 16, dus het linkse karakter van de hexadecimale
string. C wordt dan het restant van de deling door middel
van het commando mod. Vanaf regel 130 maken we van B en C
ascii-waarden, die we kunnen gebruiken voor CHR$. De
moeilijkheid bij hexadecimaal is dat bij de ascii-codes van
de MSX-letterset na de getallen eerst 7 andere tekens komen
voor de hoofdletters A,B,C enzovoort, en bij hexadecimaal
dus niet. Eerst tellen we 48 bij C op om van de waarde 0
asciiwaarde "0" te krijgen. in dezelfde regel nog
wordt gecontroleerd indien B, NA de verhoging, een waarde
heeft hoger dan de asciiwaarde van "9". Zo ja, dan verhogen
we B met 7! dus CHR$(B) is de hexadecimale waarde van C,
dus we voegen CHR$(B) aan A$ toe.
echter we wilden de waarde van A. We gaan dus door met
hetzelfde, maar dan in plaats van B dus C. Daarna weer
CHR$(C) toevoegen aan A$ en voil…! We hebben van decimale A
de hexadecimale A$ gemaakt.
HEXADECIMAAL naar DECIMAAL
Pfoe, we zijn er bijna door. Hier vinden we onze opgewekte
programmeerstemming niet in terug, maar goed. De
basic-versie:
100 DEFINTA-Z
110 A$="D2"
120 A=0:M$="":M=0
130 M$=MID$(A$,1,1)
140 M=ASC(M$)
150 M=M-48
160 IFM>9 THENM=M-7
170 A=M*16
180 M$=MID$(A$,2,1)
190 M=ASC(M$)
200 M=M-48
210 IFM>9THENM=M-7
220 A=A+M
230 PRINTA
Met zijn 13 regels is dit het langste programma uit de reeks
van (voorlopig) 4. Zoals vermeld gaat het om de hexadecimale
A$ om te zetten naar een decimaal getal. A$ wordt dus
toevallig "D2", mag u dus zelf veranderen. In regel 130
wordt eerst het eerste teken (zie vorige programma) van A$
in M$ gezet, daarna wordt M de ascii-waarde van M$. Daar
wordt 48 van afgetrokken om de zelfde waarde te krijgen dan
de asciiwaarde, en dan wordt er weer gekeken of de waarde
hoger dan 9 ligt, zo ja, dan wordt er 7 afgetrokken.
Ditzelfde gebeurt dus voor de rechterkant van de string in
regels 180-210.
In regel 170 wordt de eindwaarde A gelijk aan 16 maal M, en
in regel 220 als de rechterkant van A$ in M staat wordt die
M bij A opgeteld. En joepie! We zijn er door!
Ik hoop werkelijk dat er nog meer mensen dan 1 (ik) deze
technieken interessant vinden. Inderdaad, het is saai, maar
anders kunt u MCBC, een hoge programmeertaal of machinetaal
nooit optimaal gebruiken.
Ik wens u veel succes en hoop dat ik ook eens een reactie op
mijn artikelen mag ontvangen.....
Ronald Zijlstra.
|