Korte AVR assembler uitleg  (Dit project is 26-08-99 afgerond)

Voor de meeste opcodes wordt de ATMEL AVR assembler naam gebruikt.
Behalve voor de LDD en STD opcode, deze zijn opgenomen in de LD, 
en ST, opcode.

De Intel-Hex lees en schrijf routine zijn niet bruikbaar met de
AVR-ISP programmer bij de STK 200 starterkit. De ISP software
blijkt alle bytes om te keren vergeleken met mijn software !!!!
Ik denk in alle bescheidenheid dat de AVR-ISP sofware fout is.

De binary lees en schrijf routine werken echter uitstekend 
(Zie de bijgevoegde voorbeelden).

Ook mijn zelf geschreven SPI software werkt nu, probeer het maar 
voorzichtig uit. Alle opgenomen functies zijn getest en werken
op mijn 40 MHz en 100 MHz 486 uitstekend. Het programma werkt niet 
op een xt omdat ik een 386 versie van CHForth heb gebruikt !!!!
De software probeert na het opstarten de dongle op PRN1 te vinden.

Belangrijk: 
De editor wordt via DOS aangeroepen onder de naam NE en de shell 
onder de naam N , maak batchfiles om je eigen editor en 
DOS shellprogramma te gebruiken. b.v. NE.BAT en N.BAT

Ik houdt me aanbevolen voor aanvullingen, correcties en goede ideen.

W.O.


Impliciete opcodes.

NOP,        RET,        RETI,       LPM,        WDR,        SLEEP,
CLC,        CLI,        CLN,        CLH,        CLS,        CLT,
CLV,        CLZ,        SEC,        SEI,        SEH,        SES,
SET,        SEV,        SEZ,        ICALL,      IJMP,


Een argument opcodes. 
Allen via register <Rn> deze mogen R0 t/m R31 zijn. 
Bij BSET, en BCLR, staat Bit (in statusreg.) voor een getal van 0 t/m 7.

<Rn> ASR,    <Rn> LSL,    <Rn> LSR,    <Rn> ROL,    <Rn> ROR,    <Rn> CLR,
<Rn> SER,    <Rn> COM,    <Rn> NEG,    <Rn> DEC,    <Rn> INC,    <Rn> SWAP,
<Rn> TST,    <Rn> POP,    <Rn> PUSH,   

Bit BCLR,    Bit BSET,


Twee argument opcodes.
Hier is <Rn> ook R0 t/m R31. 
Ook hier is Bit 0 t/m 7 (bitnummer in register).
Het Prt (I/O poort) adres mag 0 t/m 31 zijn.

<Rn> <Rn> ADC,           <Rn> <Rn> ADD,           <Rn> <Rn> AND,
<Rn> <Rn> CP,            <Rn> <Rn> CPC,           <Rn> <Rn> ADC,
<Rn> <Rn> CPSE,          <Rn> <Rn> MOV,         ( <Rn> <Rn> MUL, )
<Rn> <Rn> OR,            <Rn> <Rn> EOR,           <Rn> <Rn> SBC,
<Rn> <Rn> SUB,

<Rn> Bit BST,            <Rn> Bit SBRC,           <Rn> Bit SBRC,
<Rn> Bit BLD,

Prt Bit SBI,             Prt Bit CBI,             Prt Bit SBIC,
Prt Bit SBIS,            <Rn> Prt IN,             Prt <Rn> OUT,

Alle immediate adresseer modes mogen bij <Rn> alleen R16 t/m R31 
gebruiken, +n is een getal van 0 tot 255. Alleen bij de SBIW, en
ADIW, opcode mag +n slechts van 0 tot 63 zijn, <Rn> mag hier 
slechts R24, R26, R28 of R30 zijn.

<Rn> +n  ANDI,           <Rn> +n  CBR,            <Rn> +n  CPI,
<Rn> +n  LDI,            <Rn> +n  ORI,            <Rn> +n  SBCI,
<Rn> +n  SBR,            <Rn> +n  SUBI,
<Rn> +n  ADIW,           <Rn> +n  SBIW,


Een gesimuleerde immediate opcode is erbij gemaakt, dit is echter
een SUBBI, die intern een NEGATE doet op +n. ATMEL heeft zelf ook 
al opcodes toegevoegd, deze staan achter mijn extra opcode:

<Rn> +n ADDI,           Is eigenlijk: <Rn> +n $FF XOR 1+ SUBBI,
<Rn> LSL,               Is eigenlijk: <Rn> <Rn> ADD,
<Rn> ROL,               Is eigenlijk: <Rn> <Rn> ADC,
<Rn> TST,               Is eigenlijk: <Rn> <Rn> AND,
<Rn> CLR,               Is eigenlijk: <Rn> <Rn> EOR,
<Rn> bitmask SBR,       Is eigenlijk: <Rn> bitmask ORI,
<Rn> bitmask CBR,       Is eigenlijk: <Rn> bitmask INVERT ANDI,
<Rn> SER,               Is eigenlijk: <Rn> $FF LDI,


Adresseer modes en argumenten van de load & store opcodes. 
Bij LD, staan de argumenten natuurlijk in de omgekeerde volgorde.
v.b. <Rn> X LD,  of  <Rn> n [Z] LD,
De opcodes werken indirect via een van de dubbele registers
genaamd X, Y en Z, en <Rn> mag hier weer R0 t/m R31 zijn.
De LD, en ST, naar adres opcodes gebruiken een 16 bits RAM adres 
en <Rn> die hier loopt van R0 t/m R31

X <Rn> ST,           Schrijf <Rn> naar RAM adres in X reg.
X+ <Rn> ST,          Schrijf <Rn> naar RAM adres in X reg. en verhoog X
-X <Rn> ST,          Verlaag X en schrijf <Rn> naar RAM adres in X reg.
Y <Rn> ST,           Schrijf <Rn> naar RAM adres in Y reg.           
Y+ <Rn> ST,          Schrijf <Rn> naar RAM adres in Y reg. en verhoog Y
-Y <Rn> ST,          Verlaag Y en schrijf <Rn> naar RAM adres in Y reg.
n [Y] <Rn> ST,       Schrijf <Rn> naar RAM adres in Y reg. verhoogd met n (0-63)
Z <Rn> ST,           Schrijf <Rn> naar RAM adres in Z reg.
Z+ <Rn> ST,          Schrijf <Rn> naar RAM adres in Z reg. en verhoog Z
-Z <Rn> ST,          Verlaag Z en schrijf <Rn> naar RAM adres in Z reg.
n [Z] <Rn> ST,       Schrijf <Rn> naar RAM adres in Z reg. verhoogd met n (0-63)
<adr> <Rn> ST,       Schrijf inhoud <Rn> naar sRAM adres


De verschillende sprong instructies alle sprongen gebruiken word
(16 bit) adressen omdat de processor het codegeheugen zo beschouwd.

adres RCALL,        Relatieve call van + of - 2 k words
ICALL,              Indirecte call via Z register (16 k words)

adres RJMP,         Relatieve sprong van + of - 2 k words
IJMP,               Indirecte sprong via Z register (16 k words)


De test en sprong instructies, deze springen over +63 words of -64 words.

<dest> BRCC,        Spring als carry laag is
<dest> BRCS,        Spring als carry hoog is
<dest> BRNE,        Spring als de Z(ero) vlag laag is
<dest> BREQ,        Spring als de Z(ero) vlag hoog is
<dest> BRGE,        Spring als de S(igned) vlag laag is
<dest> BRLT,        Spring als de S(igned) vlag hoog is
<dest> BRSH,        Alias van BRCC (Groter gelijk unsigned)
<dest> BRLO,        Alias van BRCS (Lager dan unsigned)
<dest> BRID,        Spring als de global interrupt vlag laag is
<dest> BRIE,        Spring als de global interrupt vlag hoog is
<dest> BRPL,        Spring als de N(egative) vlag laag is
<dest> BRMI,        Spring als de N(egative) vlag hoog is
<dest> BRHC,        Spring als de H(alf carry) vlag laag is
<dest> BRHS,        Spring als de H(alf carry) vlag hoog is
<dest> BRTC,        Spring als de T vlag laag is
<dest> BRTS,        Spring als de T vlag hoog is
<dest> BRVC,        Spring als d (o)V(erflow) vlag laag is
<dest> BRVS,        Spring als d (o)V(erflow) vlag hoog is
<dest> <bit> BRBC,  Spring als <bit> in statusregister laag is
<dest> <bit> BRBS,  Spring als <bit> in statusregister hoog is


Testen voor gebruik bij controle structuren.

CS      CC      <>      <       U<      IS      IC
U>=     >=      0>=     0=      HS      HC      0<
TS      TC      OS      OC      SBS     SBC


De controle structuren.

<test> IF ... ELSE, ... THEN,
BEGIN, ... <test> UNTIL,
BEGIN, ... AGAIN,
BEGIN, ... <test> WHILE, ... REPEAT,
<reg> <const> LDI,  DO, ... <reg> LOOP,


De assembler commando's

<x> =: <naam>       Definieer een label met de waarde <x>
LABEL <naam>        Defineer een label met de waarde van de programmateller
CODE <naam>         Maak een code definitie
END-CODE            Beeindig een code definitie
<adres> ORG         Zet de programmateller
RAMTOP              Geef adres van het hoogste interne RAM adres !
90S2313             Selecteer de AT90S2313 als target processor. Andere
                    target chips zijn: 90S1200, 90S2323, 90S2343, 90S4414, 
                    90S4434, 90S8515, 90S8535, tiny12 en tiny22.
IN test.frt         Laad de AVR assembler file TEST.FRT
COLD  of  EMPTY     Start assembler opnieuw, verwijder gemaakte code
SEE <naam>          Disassembleer (decompileer) AVR-code behorend bij <naam>
VIEW <naam>         Alias van SEE <naam>
<addr> DIS          Disassemble AVR-code vanaf <addr>
ADUMP               Dump een stukje PC programma geheugen


Tracer commando's

TEST <naam>         Executeer de code behorend bij naam via de simulator
<addr> TST          Executeer vanaf <addr> via de simulator
RESET               Executeer code vanaf de reset vector

.TRACER             Toon de configuratie van de tracer
TRACER-ON           Zet de tracer aan
TRACER-OFF          Tracer uit
HEXDUMP-ON          Tijdens het tracen met echo de hexdump aan
HEXDUMP-OFF         Tijdens het tracen met echo de hexdump uit
SHORT               Toon trace informatie verkort
LONG                Toon trace informatie rechts uitgebreid op het scherm
PORTS-ON            Toon I/O poorten en registers in het trace display
PORTS-OFF           Toon geen I/O poorten en registers in het trace display
STEP-ON             Zet 'single step' toestand aan
STEP-OFF            Zet 'single step' toestand uit
ECHO-ON             Toon disassembler informatie links op het scherm
ECHO-OFF            Toon geen disassembler informatie links op het scherm

.BREAKPOINTS        Laat de 'break' en 'run' punten in het programma zien
BREAK-OFF           Verwijder alle 'break' punten
BREAKPOINT          Zet een 'break'punt
RUNPOINT            Zet een 'run'punt


ISP programmer commando's

EB                  Wis het PC programma geheugen
DB                  Dump het gebruikte stuk PC geheugen
E                   Wis AVR flash geheugen
P                   Programmeer AVR flash geheugen
V                   Vergelijk AVR flash met PC geheugen
R                   Lees AVR flash naar PC geheugen
T                   Zit er een AVR 8515 chip type in
LOCK1               Zet lockbit 1 op de AVR 
LOCK2               Zet lockbit 1 & 2 op de AVR
EEPROM              Lees, schrijf naar EEPROM met bovenstaande commando's
                    Het PC geheugen is te vullen met , C, en PACK,
FLASH               Lees, schrijf naar FLASH met bovenstaand commando's
                    dit is de default toestand van de programmer.
$,                  Compileer de string 'addr u' in target geheugen met
                    daarachter een nul.
PRN1                Dongle zit op PRN1
PRN2, PRN3, PRN4    Idem PRN!, maar dongle zit nu op PRN2, PRN3 of PRN4
SET-PAUSE           Wijzig de SPI kloktijd (inhoud: 0)
.FREE               Toon vrije EEPROM of FLASH geheugen
STOP                Zet de AVR cpu stil
RUN                 Laat de AVR cpu vrij lopen
READ <naam>         Zet binary file <naam> in het codegeheugen
WRITE <naam>        Schrijf codegeheugen naar binary file <naam>
READ-HEX <naam>     Zet Intel-Hex file <naam> in het codegeheugen
WRITE-HEX <naam>    Schrijf codegeheugen naar Intel-Hex file <naam>
MAIN                Zet de laatst gemaakte definitie in de reset vector
                    Gebruik: CODE <naam> ... END-CODE  MAIN
                    Andere woorden die een (interrupt) vector zetten:
EXTERN0         EXTERN1         T1-CAPTURE      T1-COMPAREA
T1-COMPAREB     T1-OVERFLOW     T0-OVERFLOW     SPI-READY 
UART-TX         UART-EMPTY      UART-TX         COMPARATOR
                    Bovenstaande woorden zijn voor de AT90S8515 elke
                    AVR kan een andere set hebben (groter of kleiner).


Ik ondersteun nu 10 verschillende AVR processortypen, deze kunnen
allemaal een andere interne structuur hebben. Daarom is de file
TARGET.FRT gemaakt. De ondersteunde AVR's zijn nu:

AT90S1200, AT90S2313, AT90S2323, AT90S2343, AT90S8414, AT90S8434,
AT90S8515, AT90S8535 en nog de ATtiny12 en ATtiny22

De assembler labels voor de 8515 bekijk het databoek voor
een uitleg van de functie van onderstaande locaties. Deze 
labels worden nu per AVR aangemaakt in de file: TARGET.FRT

$08 CONSTANT ACSR       $09 CONSTANT UBRR       $0A CONSTANT UCR        
$0B CONSTANT USR        $0C CONSTANT UDR        $0D CONSTANT SPCR
$0E CONSTANT SPSR       $0F CONSTANT SPDR       $10 CONSTANT PIND       
$11 CONSTANT DDRD       $12 CONSTANT PORTD      $13 CONSTANT PINC
$14 CONSTANT DDRC       $15 CONSTANT PORTC      $16 CONSTANT PINB       
$17 CONSTANT DDRB       $18 CONSTANT PORTB      $19 CONSTANT PINA
$1A CONSTANT DDRA       $1B CONSTANT PORTA      $1C CONSTANT EECR       
$1D CONSTANT EEDR       $1E CONSTANT EEAR
$21 CONSTANT WDTCR      $24 CONSTANT ICR1L      $25 CONSTANT ICR1H      
$28 CONSTANT OCR1BL     $29 CONSTANT OCR1BH     $2A CONSTANT OCR1AL
$2B CONSTANT OCR1AH     $2C CONSTANT TCNT1L     $2D CONSTANT TCNT1H     
$2E CONSTANT TCCR1B     $2F CONSTANT TCCR1A
$31 CONSTANT OCR0       $32 CONSTANT TCNT0      $33 CONSTANT TCCR0      
$35 CONSTANT MCUCR      $38 CONSTANT TIFR       $39 CONSTANT TIMSK
$3B CONSTANT GIMSK      $3D CONSTANT SPL        $3E CONSTANT SPH        
$3F CONSTANT SREG
