Thomas makes, writes

2005-10-01

Howto: Intel 8051 assembler .exe onder UNIX

Note

This is a how to about using the development tools for a certain microcontroller board with POSIX compatible operating systems. This is done by running the DOS assembler in an environment provided by Dosbox.

It's only useful to my fellow students at the De Nayer institute, so I wrote this in dutch.

Inleiding

Voor de drie besturingssystemen die ik waardeer (GNU, BSD en MacOS X) bestaat geen kant en klare IDE / ontwikkelomgeving voor het microcontrollerbordje dat gebruikt word voor de cursus microcontrollers in 2pbei. Onder het moto 'vogelvrije vrije-software-hippie moet het weer eens zelf doen' (pun toegevoegd ter uwer vertier) ben ik op zoek gegaan naar een manier om hier een mouw aan te passen.

Ik heb op internet een assembler gevonden voor 8051 cores. Dit programma bleek echter niet geschikt omdat de preprocessor directieven en andere details verschillen met de Cygnal-assembler die in de cursus gebruikt wordt. Omdat ik geen zin heb dat programma te gaan onderhouden ben ik op zoek gegaan naar een andere methode.

Na Cygnal eens van dichtbij te hebben bekeken trok ik de conclusie dat deze veredelde texteditor bestaat uit een zooitje windows binaries, helpfiles, en een binary met de naam Asm51.exe. Tot mijn vreugde bleek deze laatste een rasechte "MS-DOS executable (EXE)" te zijn. Tof, want die handel draait perfect in alle vrije DOS emulator software, zoals Dosbox en dosemu. Het is dus niet nodig windows te emuleren (wat mogelijk is met wine, maar omslachtig op niet-x86 cpu's). Ik heb ervoor gekozen om DosBox te gebruiken, omdat die de processor en dos zelf emuleert, en dus ook op PowerPC werkt. DosBox gebruikt SDL, en dit heeft als nadeel dat het een werkende X11 nodig heeft. Dosemu daarentegen draait de programmacode rechtstreeks op de host, in een gepatchte versie van FreeDOS, wat betere prestaties geeft, maar enkel op x86 cpu's werkt (met een commandline switch kan je dosemu in een textterminal gebruiken). Het laatste pro-dosbox argument is de betere integratie met unix. Dosbox emuleert zelf DOS, hierdoor is het mogelijk met een onliner vanuit de bash shell (of Makefile) de compiler aan te roepen.

Op het internet vond ik een programma, "aducprog", dat een hexfile naar de microcontroller kan downloaden. Omdat ik de mogelijkheden van het programma nogal beperkt vond -het kan enkel de hex naar de controller downloaden[1]_- heb ik zelf uitgepluist hoe en wat mogelijk is. Ik had mijn bordje nog niet en was al aan een python versie bezig. Toen mijn bordje ariveerde en ik aan het testen sloeg, bleek aducprog prima te werken, maar mijn python code langs geen kanten (op mijn iBook met Gentoo). Na wat spelen met minicom op mijn x86, iBook, en nullmodemkabel, bleek het probleem bij de (prolific) usb to serial converter te liggen, die gereviseerde hardware bevatte die de driver niet helemaal meester was. Tegenwoordig gebruik ik aducprog op Linux, aan de pythonversie werk ik momenteel niet verder.

Roggemans-compiler gebruiken met DOSBOX

Installeer dosbox. Zoek de sourcecode of pakketten voor je distro op de dosbox website. Op de frontpage is ook een link te vinden naar de Mac OSX port. Gentoo en debian gebruikers kunnen simpelweg het vertrouwde 'emerge' of 'apt-get' commando gebruiken om dosbox te laten installeren.

Als je dosbox geïnstalleerd hebt, probeer het dan te starten door 'dosbox' in shell te typen. Macgebruikers zoeken de echte dosbox binary in de Mac appfolder (de appfolder zelf is waardeloos, want je zal steeds de dosbox binary rechtstreeks aanroepen uit gemakzucht)

Hexdownloader ADuCprog installeren

Download ADuCprog van mijn downloadpagina (ik vind de website van de auteur niet meer op google). Pak de tarball uit. Als je van plan bent om ADuCprog te gebruiken op een andere poort dan /dev/ttyS0, kun je serialdefs.h aanpassen en SERDEV laten verwijzen naar bvb /dev/ttyUSB0. Doe vervolgens een 'make' in de map (vergeet niet dat je hiervoor gnu make en gcc op je systeem geïnstalleerd moet hebben). Je zou een binary 'aducprog' moeten vinden in de map. Dat is de executable van aducprog, kopieer die eventueel naar /usr/bin of /usr/local/bin, maar liefst nog naar de map bin die ik straks vermeld (waarin ook aducprog en eventueel dosbox -op osx- komen).

Ontwikkeltools: de Makefile

Oké, je zou nu alles moeten hebben om aan de slag te kunnen. Eerst even wat informatie over mijn ontwikkelomgeving. Ik heb de gewoonte al mijn broncode te bewaren in ~/src, in deze map zit voor iedere programmeertaal een eigen map (php,python,c,...). De map met mijn 8051 broncode noem ik asm51. Hierin zit voor ieder project een aparte map, om alles overzichtelijk te houden. Ook is er de map bin (C: onder dosbox), deze bevat Asm51.exe en de include files van Roggemans zijn cd. Je kan ook aducprog naar deze map kopiëren. Ook de volgende Makefile bevind zich in deze map:

MAINFILE = main.asm

assemble: *.asm

      dosbox -c 'cls' -c 'mount c ../bin ' -c 'mount d .' -c 'c: ' \
      -c 'asm51 d:\${MAINFILE}' -c 'exit'

burn: *.HEX
      aducprog -e -p MAIN.HEX

Even de werking verklaren: Als ik een nieuw project begin, doe ik

cd ~/src/asm51
mkdir projectnaam
ln -s bin/Makefile projectnaam/Makefile
cd projectnaam
vim main.asm

Vervolgens begint het programmeerwerk, afgewisseld door :make. 'make' Tikken in de projectmap zorgt er voor dat dosbox het volgende doet: scherm wissen ('welkom bij dosbox' en 'dit is mijn versie' interesseert me niet), C: toewijzen aan de map met asm51.exe en de include files, D: aan de projectmap, drive C: actief maken, asm51 aanroepen, en tenslotte dosbox sluiten. "make burn" zorgt ervoor dat aducprog wordt gestart. aducprog dient aangeroepen te worden met -e, dit wist het flashgeheugen (anders wil de controller zijn flash niet herprogrammeren).

Ten slotte

  • Mail me opmerkingen, (met of zonder) typfouten, en andere wijsheden die je wil delen.
  • Small Devices C Compiler (sdcc) bevat ook een mcs51 compiler, dit paket ga ik van dichtbij bekijken. Als er iemand nog andere native (en vrije) assemblers kent voor posix operating systems, mag hij dat altijd laten weten. Ik gebruik voorlopig dezelfde als roggemans, uit gemakzucht en omdat ik dan zeker op support kan rekenen...