170 likes | 815 Views
Lego RCX Assembler and a Case Study. Luis Paris Dept. of Computer Science University of Mississippi. Java C, C++, Pascal Forth MindScript, NQC, Lego ASM. TinyVM, leJOS brickOS pbForth Standard Lego RCX. Supported Languages/Firmwares. Language. Firmware. RCX Internals.
E N D
Lego RCX Assembler and a Case Study Luis Paris Dept. of Computer Science University of Mississippi
Java C, C++, Pascal Forth MindScript, NQC, Lego ASM TinyVM, leJOS brickOS pbForth Standard Lego RCX Supported Languages/Firmwares Language Firmware
RCX Internals • Hitachi H8 microcontroller • On-chip 16K ROM • External 32K RAM • I/O devices • Three motor ports • Three sensor ports • IR communications port
RCX Virtual Machine • Implemented by the Lego RCX firmware • Virtual Machine Characteristics • Byte Code Interpreter • Sources and values • Byte Code Command Set
Case Study: Lego RCX Assembler • Motivation • Project for CSCI-450 Programming Languages • Lego Assembler hides output object file • Result: Byte code nor object format can’t be studied • Does not support definition list • Result: Programs hard to read and maintain • Project: Create a Lego RCX Assembler • More robust • Runs standalone
Solution Strategy • Two stages: • Lexical/Syntax analysis (Parsing) • Finite State Machine • Library functions (scanf, string.tokenizer) • Code generation (one-to-one) • No one-to-many semantic analysis (as in compilers) • Mnemonic to Opcode conversion • Parameters to Byte Code conversion
Which language C/C++ or Java? • Java is a powerful OOP language but…not really suitable for system programming • No bit-fields support • No operator overloading • Both C/C++ support bit-fields • However, C++ has unnecessary, confusing features (multiple inheritance)
Bit-fields • After parsing ASM command “out 6, 23”: • Variables contain: instr = “out”; param1 = 6; param2 = 23 • Problem: encode “out param1, param2” into above data structure • C/C++ can declare P1 and P2 as bit-fields as follows: • Java can NOT declare bit-fields so it must merge P1 and P2: • Therefore, Java programmer must perform bit shifting and masking operations;whereas the C/C++ compiler does it for us. then do: then do:
PreLab Instructions Part 1: • Click StartRun • Type \\luis\lego\ • Move “workshop” folder to your “desktop” • Close \\luis\lego\ folder Part 2: • Open “workshop” folder in your desktop • Install “LEGOMindstormsSDK25.exe” • Install “bricxcc_setup_3377.exe” (if not installed) • Download Lego RCX Firmware (if not installed)
Open the ScriptEd application • Click StartLEGO SoftwareAll ProgramsMindStorms SDKToolsScriptEd • On the ScriptEd application,Click OpenPort • Select your Tower Port (COM1, or USB1) • On the toolbar select LASM (2nd combo box)
Download “pathfind.asm” file to RCX Part 1: • On the ScriptEd application,Click FileOpen • Browse to “workshop” folder • In File name, type *.asm (instead of *.rcx2) • Select “pathfind.asm” and open it Part 2: • Click on ScriptDownload • Test your RCX
Open the BricxCC application • Click StartAll ProgramsBricx Command CenterBricx Command Center • On the “Searching for the Brick” window,Select your Tower Port (COM1, or USB1)
Compile & Download “pathfind.nqc” Part 1: • On the BricxCC application,Click FileOpen • Browse to “workshop” folder • Select “pathfind.nqc” and open it Part 2: • Click on CompileDownload • Test your RCX
References • The Bricx Command Center (BricxCC)http://bricxcc.sourceforge.net/ • The Lego Mindstorms SDK 2.5 (ScriptEd)http://mindstorms.lego.com/eng/community/resources/