Arduino Projekten

Fri 29-Mar-24
16:25:06


Binair Naar Hexadecimal

Datum: Sat 03 May 2014
Samenvatting: Een eenvoudig Pascal programma om een binair (font-)bestand om te zetten naar een hexadecimaal bestand.


Om teksten op een Led-paneel te tonen, kan natuurlijk elke keer alle woorden worden "omgerekend" naar letter-puntjes. Behalve dat dit veel werk is, is het ook een saaie klus. Leuker is het om de tekens vast in het Arduino-programma op te nemen en daarna als eenvoudige "tekst met echte letters" via een procedure-functie op het Led-paneel weer te geven.

Een font tekenen

Allereerst moet er een font worden geregeld. De basis ligt in het zelf tekenen. Hiervoor kan een apart teken-programma gebruikt worden, vroeger ging dat op ouderwets hokjes papier, (in dit geval) een viltstift en een pen. Er werden vierkanten getekend, ter grootte van een letter, bijvoorbeeld van 8x8 hokjes. Daarna werden de letters (cijfers, lettertekens en andere symbolen) in de vierkanten getekend. Elke regel werd als binair getal gezien en omgerekend tot een (hexa-)decimaal getal. Deze methode ging niet altijd meteen goed, getuige de "@" op de foto van de schets - pijltjes in de schets tonen enkele correcties aan.

Natuurlijk kan er ook een font-bestand van internet worden geplukt, zoals het veelgebruikte 5x7-dot matrix font (bekend van de ouderwetse dot-matrix printers), bijvoorbeeld van de Adafruit-site. 5 bij 7 punten is de minimale bezetting om alle letters en cijfers in kwijt te kunnen. Alle vertikale lijnen van de tekens zijn 1 punt breed.

Het Commodore font

Maar ... als oud commodore gebruiker vind ik het font van de Vic-20 en de Cbm64 net iets mooier. Een keurig 6x7-dot matrix font (brede letters zijn 7x7), geplaatst in een 8x8-matrix (8 bytes met elk 8 bitjes). Alle vertikale lijnen van de letters zijn 2 punten breed.

Uiteraard kan ook hier eerst alle letters worden getekend en daarna worden uitgerekend. De truuk is bekend en het is een eenmalige aktie. Sneller (en vooral ook leuker) is het om de inhoud van een character-rom uit een Vic20, of Cbm64 uit te lezen en in een binair bestand te schrijven. Dit bestand is dan eenvoudig naar een PC toe te sturen (Rs-232, floppy-disk, ... mogelijkheden genoeg).

Omzetten van Binair naar Hexadecimaal

De volgende stap is om hier een zodanige notatie van te maken, dat de Arduino C-compiler er mee om kan gaan. Decimale cijfers zijn op zich makkelijk en dat werd toen ook erg veel gedaan. Commodore-Basic is helemaal gericht op decimale getallen. Maar voor de Arduino vergt dit extra werk (een geschikte uitlijning maken, bijvoorbeeld). Tevens is het terugrekenen van decimaal naar binair (mocht er een letter toch niet helemaal mooi uitzien) niet erg makkelijk. Er is daarom gekozen voor een hexadecimale vorm.

Om het binair om te zetten in hexadecimaal, is een eenvoudig (recht-toe recht-aan) Pascal programma gemaakt. Binair bestand wordt ingelezen en per byte 1-op-1 omgezet in een hexadecimale notatie. Alles achter elkaar.

Dat is alles wat dit projekt-deel doet. Wat rest is een editor-bewerking (zie het projekt-deel "cbm-font").

Een Cbm64 Basic Programma erbij?

Voor de volledigheid is een Cbm64 Basic programma erbij gezet van hoe de Rom's zijn uit te lezen en "uit te printen", echter dit resulteerde niet in de gewenste actie. In plaats van de Character-Rom kwamen er cijfers uit de Vic, Sid, kleuren-Ram en de Uarts. Bank Switching is hier de oorzaak van geweest (adressen worden gedeeld door meerdere componenten - dit is om te schakelen via adres $0000 en $0001, een extra I/O-port op de CPU 6510 zelf). Één van de eigenschappen waarmee men overigens fantastische dingen op de Cbm64 kon doen.


Broncode: [1: Binairy To Hexadecimal]

1: De broncode van Binairy To Hexadecimal

(Sat 03 May 2014) Een eenvoudig Pascal programma om een binair bestand om te zetten in een hexadecimaal bestand - Gevolgd door een Cbm64 Basic programma om Rom-data uit te lezen.

Deze broncode heeft 85 regels met programma-code.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Turbo/ Borland/ Delphi-Pascal
==============================

program bin2hex;

const hex:array[0..15] of char = ('0','1','2','3','4','5','6','7',
                                  '8','9','A','B','C','D','E','F'
                                 )
;

var naamin,naamout:string;
    ffbin:file of byte;
    ffhex:text;
    cc,cl,ch:byte;

begin
if (paramcount>1)
then begin
     naamin:=paramstr(1);
     naamout:=paramstr(2);
     assign(ffbin,naamin);
     assign(ffhex,naamout);
     reset(ffbin);
     rewrite(ffhex);

     while (not eof(ffbin)) do
       begin
       read(ffbin,cc);
       ch:=cc div 16;
       cl:=cc and 15;
       write(ffhex,hex[ch]);
       write(ffhex,hex[cl]);
       write(ffhex,' ');
       end;

     close(ffbin);
     close(ffhex);
     end
else begin
     writeln('Gebruik:>  bin2hex  invoernaam  uitvoernaam <Enter>');
     end;
end.

-------------------------------------------------------------------------------

Rom Memory Dumper - Cbm64
==========================

10 S=40960:E=65535:C=16
20 HX$="0123456789ABCDEF"
90 OPEN 4,5
100 FOR Q=S TO E STEP C
110 IF Q=10*4096 THEN PRINT#4," $A000  BASIC-ROM"
130 IF Q=12*4096 THEN PRINT#4," $C000  RAM"
140 IF Q=13*4096 THEN PRINT#4," $D000  VID"
142 IF Q=13*4096 THEN PRINT#4," $D000  CHAR-ROM (ALSO)"
144 IF Q=13.25*4096 THEN PRINT#4," $D400  SID"
146 IF Q=13.50*4096 THEN PRINT#4," $D800  COLOR-RAM"
148 IF Q=13.75*4096 THEN PRINT#4," $DC00  I/O"
150 IF Q=14*4096 THEN PRINT#4," $E000  KERNEL-ROM"
200 REM--------------------------------
210 PRINT Q;
220 PRINT#4,Q;
290 REM--------------------------------
300 FOR W=0 TO C-1
310 S1$=MID$(HX$,(PEEK(Q+W) AND 240)/16+1,1)
320 S2$=MID$(HX$,(PEEK(Q+W) AND 15)+1,1)
330 IF(W AND 7)=0 THEN PRINT#4,"   ";
340 PRINT#4," "+S1$+S2$;
350 NEXT W
360 PRINT#4," - ";
400 FOR W=0 TO C-1
410 PP=PEEK(Q+W)
420 SS$=" "+CHR$(PP)
430 REM--------------------------------
440 IF PP<32 THEN SS$=CHR$(94)+CHR$(PP+64)
450 REM IF PP<32 THEN SS$=CHR$(18)+CHR$(PP+64)+CHR$(18+128)
460 REM IF PP=34 THEN SS$=CHR$(34)+"[T]"+CHR$(34):REM AANHALINGSTEKEN-ZOOI
470 REM IF (PP>=128) AND (PP<160) THEN SS$=CHR$(18)+CHR$(PP+64)+CHR$(18+128)
500 REM--------------------------------
510 IF(W AND 7)=0 THEN PRINT#4,"  ";
520 PRINT#4,SS$;
530 NEXT W
600 PRINT#4
610 NEXT Q
620 CLOSE 4


Broncode: [1: Binairy To Hexadecimal]

Afbeeldingen

bin2hex_1.jpg
1/4: bin2hex_1.jpg.
bin2hex_2.jpg
2/4: bin2hex_2.jpg.
bin2hex_3.jpg
3/4: bin2hex_3.jpg.
bin2hex_4.jpg
4/4: bin2hex_4.jpg.