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. |