Chase Lighting (Elf Membership Card test program)

How to build/assemble the chase lighting program

This is a very simple chase lighting program for the Elf Membership Card. It is mainly used for testing my RaspiElf tools. I use the A18 cross assembler (see below how to get and build the assembler):

pi@cosmac:~/elf/RaspiElf/chase $ a18 chase.asm -Lb1 chase.lst -o chase.hex
1802/1805A Cross-Assembler (Portable) Ver 2.5
Copyright (c) 1985 William C. Colley, III
Copyright (c) 2017 Mark W. Sherman

No Errors

The cross assembler generates two output files: the object file (Intel hex file chase.hex) and the listing file (chase.lst). You can load the program into the Elf Membership Card the traditional way by setting the switches. Or upload it with the RaspiElf bin2elf tool. But for this we need a binary file first. A handy tool is Jacques Pelletier's Hex2bin (see below how to get and install Hex2bin).

pi@cosmac:~/elf/RaspiElf/chase $ hex2bin chase.hex
hex2bin v2.5, Copyright (C) 2017 Jacques Pelletier & contributors

Allocate_Memory_and_Rewind:
Lowest address:   00000000
Highest address:  0000002C
Starting address: 00000000
Max Length:       45

Binary file start = 00000000
Records start     = 00000000
Highest address   = 0000002C
Pad Byte          = FF

How to build the A18 assembler for the Raspberry Pi

Get the source from the GIT repository:

pi@cosmac:~/elf $ git clone https://github.com/carangil/A18.git
Cloning into 'A18'...
remote: Counting objects: 81, done.
remote: Total 81 (delta 0), reused 0 (delta 0), pack-reused 81
Unpacking objects: 100% (81/81), done.
Checking connectivity... done.
pi@cosmac:~/elf $ 
If you have not installed GIT yet, then install it with sudo apt-get install git

Install the cross assmbler into /usr/local/bin

pi@cosmac:~/elf/A18 $ make
pi@cosmac:~/elf/A18 $ sudo install -m 557 a18 /usr/local/bin
pi@cosmac:~/elf/A18 $ 

How to build Hex2bin for the Raspberry Pi

Hex2bin is a Intel Hex or Motorola Hex file converter. You can download the tarball from Sourceforge http://hex2bin.sourceforge.net/.

Unpack the tarball:

pi@cosmac:~/elf $ tar xvjf ~/Downloads/Hex2bin-2.5.tar.bz2
Hex2bin-2.5/
Hex2bin-2.5/mot2bin.c
Hex2bin-2.5/doc/
...
Hex2bin-2.5/mot2bin.layout

Build (compile):

pi@cosmac:~/elf $ cd Hex2bin-2.5/
pi@cosmac:~/elf/Hex2bin-2.5 $ make
gcc -c -std=c99 -O2 -Wall -pedantic hex2bin.c -o hex2bin.o
gcc -c -std=c99 -O2 -Wall -pedantic common.c -o common.o
gcc -c -std=c99 -O2 -Wall -pedantic libcrc.c -o libcrc.o
gcc -c -std=c99 -O2 -Wall -pedantic binary.c -o binary.o
gcc -O2 -Wall -o hex2bin hex2bin.o common.o libcrc.o binary.o
gcc -c -std=c99 -O2 -Wall -pedantic mot2bin.c -o mot2bin.o
gcc -O2 -Wall -o mot2bin mot2bin.o common.o libcrc.o binary.o

Install:

pi@cosmac:~/elf/Hex2bin-2.5 $ sudo make install
strip hex2bin
strip mot2bin
cp hex2bin mot2bin /usr/local/bin
cp hex2bin.1 /usr/local/man/man1
pi@cosmac:~/elf/Hex2bin-2.5 $

1802 Assembler Listing (chase.lst)

                        
                ORG     0H
                        
   0000   c0:11000000           LBR     MOVE
   0001   00:00000000
   0002   03:00000011
                        
      MOVE
   0003   e3:11100011           SEX     R3              ; index register R3 for bit pattern point to 30H
   0004   90:10010000           GHI     R0              ; PC high byte is 0
   0005   b3:10110011           PHI     R3
   0006   f8:11111000           LDI     30H
   0007   30:00110000
   0008   a3:10100011           PLO     R3
                        
   0009   f8:11111000           LDI     00000001B       ; bit pattern to move in (0030H)
   000a   01:00000001
   000b   53:01010011           STR     R3
      LOOP
   000c   64:01100100           OUT     P4              ; Rx = 0030H, INC Rx
   000d   6c:01101100           INP     P4              ; get switches Rx =0031H
   000e   23:00100011           DEC     R3              ; Rx = 0030H
   000f   fa:11111010           ANI     11111110B
   0010   fe:11111110
   0011   3a:00111010           BNZ     LEFT
   0012   1a:00011010
      RIGHT
   0013   f0:11110000           LDX                     ; get pattern
   0014   f6:11110110           SHR
   0015   c7:11000111           LSNF
   0016   f8:11111000           LDI     10000000B   
   0017   80:10000000
   0018   30:00110000           BR      STORE
   0019   1f:00011111
      LEFT
   001a   f0:11110000           LDX                     ; get pattern
   001b   fe:11111110           SHL
   001c   c7:11000111           LSNF
   001d   f8:11111000           LDI     00000001B
   001e   01:00000001
      STORE
   001f   53:01010011           STR     R3
                        
   0020   f8:11111000           LDI     20
   0021   14:00010100
   0022   b2:10110010           PHI     R2              ; R2 wait counter
      WAIT
   0023   22:00100010           DEC     R2              ; wait loop about 0.5 s
   0024   92:10010010           GHI     R2
   0025   3a:00111010           BNZ     WAIT
   0026   23:00100011
                        
   0027   c5:11000101           LSNQ                    ; toggle Q
   0028   7a:01111010           REQ
   0029   38:00111000           NBR     7bH             ; SEQ 
   002a   7b:01111011
                                        ;SEQ
   002b   30:00110000           BR      LOOP
   002c   0c:00001100
                        
                END

1802 Assembler Listing (knightrider.lst)

                        ;   TITL   "Chase Lighting (Knight Rider) for Elf Memebership Card"
                        ;      EJCT   60
                        
                              CPU   1802
                        
      NUMBER      EQU   0
                        
                        ;
                        ; Register Definitions:
                        ;
      R0      EQU   0
      R1      EQU   1
      R2      EQU   2
      R3      EQU   3
      R4      EQU   4
      R5      EQU   5
      R6      EQU   6
      R7      EQU   7
      R8      EQU   8
      R9      EQU   9
      R10      EQU   10
      R11      EQU   11
      R12      EQU   12
      R13      EQU   13
      R14      EQU   14
      R15      EQU   15
                        
                        ;
                        ; I/O Port Definitions:
                        ;
      P1      EQU   1
      P2      EQU   2
      P3      EQU   3
      P4      EQU   4
      P5      EQU   5
      P6      EQU   6
      P7      EQU   7   
                        
            ORG   0H
                              
   0000   c0:11000000       LBR    MOVE      ; the branch can be overwritten
   0001   00:00000000
   0002   03:00000011
                           
      MOVE
   0003   e3:11100011       SEX    R3      ; index register R3 for bit pattern point to 30H
   0004   90:10010000       GHI    R0      ; PC high byte is 0
   0005   b3:10110011       PHI    R3
   0006   f8:11111000       LDI    30H
   0007   30:00110000
   0008   a3:10100011       PLO    R3
                        
   0009   f8:11111000       LDI   00000001B   ; bit pattern to move in (0030H)
   000a   01:00000001
   000b   7b:01111011       SEQ         ; shift left
      LOOP
   000c   53:01010011       STR    R3      ; store pattern
   000d   64:01100100       OUT   P4      ; Rx = 0030H, INC Rx
   000e   f8:11111000       LDI    0FFH
   000f   ff:11111111
   0010   a2:10100010       PLO   R2
   0011   6c:01101100       INP   P4
   0012   b2:10110010       PHI    R2      ; R2 wait counter
   0013   23:00100011       DEC   R3
      WAIT
   0014   22:00100010       DEC    R2      ; wait loop about 0.5 s @ 20
   0015   92:10010010       GHI    R2
   0016   3a:00111010       BNZ    WAIT
   0017   14:00010100
                        
   0018   f0:11110000       LDX         ; get pattern
   0019   31:00110001       BQ    LEFT
   001a   23:00100011
      RIGHT
   001b   f6:11110110       SHR
   001c   3a:00111010       BNZ   LOOP
   001d   0c:00001100
   001e   f8:11111000       LDI    00000010B
   001f   02:00000010
   0020   7b:01111011       SEQ   
   0021   30:00110000       BR     LOOP
   0022   0c:00001100
      LEFT
   0023   fe:11111110       SHL
   0024   3a:00111010       BNZ   LOOP
   0025   0c:00001100
   0026   f8:11111000       LDI    01000000B
   0027   40:01000000
   0028   7a:01111010       REQ
   0029   30:00110000       BR   LOOP
   002a   0c:00001100
                        
            END
0023  LEFT          000c  LOOP          0003  MOVE          0000  NUMBER    
0001  P1            0002  P2            0003  P3            0004  P4        
0005  P5            0006  P6            0007  P7            0000  R0        
0001  R1            000a  R10           000b  R11           000c  R12       
000d  R13           000e  R14           000f  R15           0002  R2        
0003  R3            0004  R4            0005  R5            0006  R6        
0007  R7            0008  R8            0009  R9            001b  RIGHT     
0014  WAIT          

-- Peter Schmid - 2017-11-18

Comments

Topic attachments
I Attachment History Action Size Date Who Comment
Unknown file formatasm chase.asm r1 manage 1.0 K 2017-12-17 - 15:48 PeterSchmid  
Unknown file formatbin chase.bin r1 manage 0.1 K 2017-12-17 - 15:48 PeterSchmid  
Unknown file formathex chase.hex r1 manage 0.1 K 2017-12-17 - 15:48 PeterSchmid  
Unknown file formatlst chase.lst r1 manage 3.2 K 2017-12-17 - 15:48 PeterSchmid  
Unknown file formatasm knightrider.asm r1 manage 1.0 K 2018-12-07 - 15:29 PeterSchmid  
Unknown file formatbin knightrider.bin r1 manage 0.1 K 2018-12-07 - 15:28 PeterSchmid  
Unknown file formathex knightrider.hex r1 manage 0.1 K 2018-12-07 - 15:28 PeterSchmid  
Unknown file formatlst knightrider.lst r1 manage 3.1 K 2018-12-07 - 15:28 PeterSchmid  
Edit | Attach | Watch | Print version | History: r8 < r7 < r6 < r5 < r4 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r8 - 2018-12-07 - PeterSchmid
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback