Uitbreidingen voor AVR ByteForth:

 1) Processor nummering invoeren (en met dat nummer):
    - Geheugen map instellen (RAM, FLASH & EEPROM) ............. ok
    - Wrap around instelling ................................... ok
    - Processor label decodering ............................... ok
    - Extra opcode selectie .................................... ok
    - Default interrupt vector offset .......................... ok
 2) Code geheugen in cellen .................................... ok
 3) Simulator toevoegen ........................................ ok
 4) ByteForth geheugenmap voor AVR ontwerpen ................... ok
 5) ByteForth macros schrijven ................................. ok
 6) Disass. met naam opsporing voor variabelen en routines ..... ok
 7) Assembler vereenvoudigen ................................... ok
 8) Aparte EEPROM buffer toevoegen ............................. ok
 9) Special case optimizer toevoegen ........................... ok
10) (2)VARIABLES van RAMTOP naar variable's tabel laten groeien. ok
11) R2 t/m R4 pas alloceren bij gebruik ........................ ok
12) EEPROM variabelen op nemen ................................. Nee
13) Verdere optimalisaties ..................................... ok
14) Werk registers voor locals pas alloceren bij gebruik ervan.. ok
15) ISP programmer uitbreiden met ATtiny en ATmega functies .... Nee
16) Bibliotheken converteren en testen ......................... ok
17) Voorbeeld programma's maken voor special interne hardware .. ok
18) REGISTER en FLAG defining words verder uitwerken ........... ok
19) De macros EE@ en EE! toevoegen ............................. Nee
20) Ondersteuning ATmega toevoegen ............................. ok
21) Labels per AVR type laten vervangen ........................ Nee
22) Special case optimizer voor M+ etc. toevoegen .............. Ok
23) Variabelen default een dubbel adres laten geven ............ Ok
24) Variabele offset bij CREATE DOES> groter dan 64 toestaan ... ??
25) 2CONSTANTS toevoegen ....................................... ??
26) ALIGN en ALIGNED voor FLASH ROM gebruiken .................. ok
27) Extra 500 bytes reserveren voor XFLYER ..................... ok
28) Nog meer CPU's mega8515, mega32, tiny26 toevoegen .......... ok
29) Switch toevoegen om automatische return in SIM uit te zetten ??
30) Primitieve van MEMORY uitsplitsen MAP geheten .............. ok
31) Aparte AT90S1200 en ATtiny compiler genereren .............. ??

De punten 24, 25 en 29 zijn in beraad !!!


1) Processor nummering
    RAM, ROM & EEPROM zijn met behulp van tabellen opgelost.
    Labels en interrupt vectoren zijn opgelost via de include-
    file: TARGET.FRT 
    Wrap around is opgelost binnen R-ADR? maar er is nog geen
    speciale test voor de juiste CPU typen ingebouwd !!!
    Opcode controle ook ingebouwd.


2) Code geheugen in cellen
    Voor de gebruiker moeten adressen doubles worden net als in
    de 8051 ByteForth.
    Ook MEMORY zou ROM startadres met een dubbel moeten doen !!!


3) Simulator toevoegen
    Het grootste probleem is het efficient zetten van de
    verschillende vlaggen!!... lijkt nu prima te werken.


4) ByteForth geheugen map
    Notitie: De LPM instructie, gebruikt de inhoud van het Z register 
    om, een byte uit het codegeheugen op te halen en zet het resultaat 
    in register R0 en R1 (alleen voor ATmega) !!!!!
    - Register
        - Laad constante(n) en extra accu   R0 met LPM, instructie
                                            ATmega gebruikt R0 en R1 voor LPM,
                                            dus alle anderen schuiven een op.
        - ByteForth systeem                 R1 highlevel LOOP teller.
                                            Mogelijk voor CATCH een reg,
                                            en twee reg. voor locals
        - Bitvariabelen                     Met var's in R2 t/m R15
        - Register variabelen               Met bitvariabelen in R2 t/m R15
        - Accus voor code definities        10 bytes R16 t/m R25
        - Stackpointers X, Y, Z             Hoogste 6 bytes R26 t/m R31
                                            X = Data Stack Pointer
                                            Y = Variable Base Pointer
                                            Z = Vrij voor locals, SLITERAL,
                                                DOES>, INLINE$ & EXECUTE
    - I/O-registers                         Als gedefinieerd door de
                                            fabrikant van SFR-0 t/m SFR-63
                                            (Nu ook support voor extended SFR
                                            van $60 tot $FF)
    - RAM
        - De reg. en de I/O-reg.            Ook op de RAM adressen 0 t/m 95 (255)
        - Datastack                         Adres 96 t/m 127 (groeit omlaag)
                                            ATmega gebruikt R0 en R1 voor LPM,
                                            dus alle anderen schuiven een op.
        - Localstack                        Adres 128 omhoog onder RSP
                                            ATmega gebruikt R0 en R1 voor LPM,
                                            dus alle anderen schuiven een op.
        - Returnstack                       Van max. adres 255 naar beneden
                                            ATmega gebruikt R0 en R1 voor LPM,
                                            dus alle anderen schuiven een op.
        - Variabelen                        Boven returnstack tot RAMTOP of
                                            een maximum van 64 stuks.
        - Variables (arrays)                Arrays beginnen op RAMTOP met
                                            alloceren, deze groeien omlaag
                                            naar de variabelen toe.
        - Getal conversie                   Via array in het ByteForth systeem
    - ROM
        - Interrupt vectoren                0 t/m xxx
        - Initialisatie tabel               xxx t/m yyy
        - Programma                         yyy t/m ROMTOP


5) ByteForth macros schrijven en optimizer:
    Ook een voorbeeld maken van macros met de TOS in de accu R16.

    Macro's                         Voorbeeld met optimizer is:

    $D1 MACRO DUP                   : 2*    DUP + ;
        R16 X LD,                   Wordt:              Beter zou zijn:
        -X R16 ST,
        RET,                        R16 X LD,           R16 X+ LD,
    END-CODE                        R17 X+ LD,          R16 R16 ADD,
                                    R16 R17 ADD,        -X R16 ST,
                                    -X R16 ST,          RET,
    $21 MACRO +                     RET,
        R16 X+ LD,
        R17 X+ LD,
        R16 R17 ADD,
        -X R16 ST,
        RET,
    END-CODE

    $11 MACRO 2*
        R16 X+ LD,
        R16 R16 ADD,
        -X R16 ST,
        RET,
    END-CODE


6) Disassembler verfraaien
    Deze moet voor zover achterhaalbaar de namen van variabelen,
    constanten en andere definities afdrukken i.p.v. het adres.
    Mogelijk Forth namen voor X en Y register toevoegen !!!!


7) Assembler vereenvoudigen
    Dubbele functies via pseudoniem onderbrengen.


8) Aparte EEPROM buffer toevoegen
    - Alleen voor simulator, maar hij kan natuurlijk gebruikt
      worden om via de ISP programmer in een AVR te zetten. 


9) Special optimizers
    De file AOPTI.FRT bevat deze allen.


10) (2)VARIABLES omlaag laten groeien
    - Arrays en variable's groeien nu naar elkaar toe waardoor
      het aanwezige RAM optimaal gebruikt kan worden!!


11) Register gebruik (locals pas alloceren bij gebruik)
    - R2 voor DO LOOP en FOR NEXT
    - R3 voor CATCH/THROW
    - Twee andere registers voor locale variabelen
      deze worden bij gebruik van locals aangevraagd.


12) EEPROM variables opnemen (zie ook 19)
    - In compiler: 
        EVARIABLE <naam>
    - Als bibliotheek file:
        : EVARIABLE
            CREATE  IDATA 1 ALLOT  HERE ,
            DOES> @  EE@
            ;


13) Optimizer verder uit breiden 
    - Register optimizer uitgebreid.
    - BIT-SFR en FLAG optimizer verbeterd en uitgebreid.
    - De special case optimizer voor 0= is uitgebreid en
      voor = en <> zijn ze toegevoegd.


14) Local werkregisters bij gebruik alloceren
    Nu opgenomen via een extra value LREG en twee symbolische
    registers LFRAME en LSP, zie ook punt 11 !!


15) ISP programmer uitbreiden met ATtiny functies
    B.v. het (de)activeren van de interne 1 Mhz oscilator.
    Met behulp van >AVR en AVR> kan dat gedaan worden.


16) Bibliotheken converteren en testen
    Er zijn nu een twintigtal bibliotheken omgezet, ze zijn 
    echter nog niet allemaal getest.


17) Voorbeeld programma's maken voor special interne hardware
    Nu gemaakt voor: watchdog, powerdown, pulsbreedte modulator,
    ADC en EEPROM gebruik. 
    !!!!!! Extra !!!!!!
    Voor Atmega nog: SPI, comparator, PBM via timer-0 of 1, 
    timer-2 als RTC, en diverse interrupts.


18) REGISTER en FLAG defining word verder uitwerken
    Deze defining words mogelijk opspitsen in een primitievere
    versie die zijn data van de stack mee krijgt. Hiermee kunnen
    ongebruikte hoge registers en vlaggen in deels gebruikte
    registers ook toegepast worden. Is gebeurt.

    De ADR prefix mag alleen nog maar interpret-time
    toegestaan worden zodat ze goed bruikbaar zijn binnen de 
    assembler en enkele conversie operators kunnen verdwijnen.
    Is gebeurt.


19) Macros EE@ en EE! toevoegen (zie ook 12).
    Werken ze met een dubbel of enkel adres ?


20) Ondersteuning ATmega toevoegen.
    Extra cpu's: AT90S8555, ATmega161, ATmega163, ATmega103.
    - Uitbreiden MEMORY.FRT & SPECIAL.FRT
    - Extra assembler instructies
        MULx, FMULx, (E)LPM, (E)SPM, MOVW, JMP, CALL, EICALL, EIJMP,
    - Extra disassembler instr.
    - Extra simulator instr. & 6 I/O poorten voor sommige mega's
    - Aanpassen ISP-programmer
    - Aanpassen ACROSS
    - Uitbreiden TARGET.FRT


21) Labels per AVR type laten vervangen
    De file TARGET.FRT kan mogelijk de vertaal labels per AVR
    type wijzigen zodat deze altijd correct zijn.


22) Special case optimizer voor M+ etc. toevoegen
    M+ is een zeer inefficiente routine, een optimizer kan hier
    veel aan verbeteren als er een kleine constante wordt gebruikt.
    Gebruikt nu bij literals de immediate optel macro uit assembler.


23) Variabelen default een dubbel adres laten geven
    Niet alleen VARIABLES maar ook (2)VARIABLE een dubbel adres
    op de stack laten zetten. De addressering via het Y-register
    is dan exclusief voorbehouden aan het interne mechanisme.

    De diverse ALLOTs werken ook met dubbele getallen. Alles met 
    addressen werkt voor de gebruiker met dubbels.


24) Variabele offset bij CREATE DOES> groter dan 64 toestaan
    Zodat CREATE DOES> het hele RAM kan gebruiken. Is gebeurt,
    werkt nu met hele RAM-adressen i.p.v. offsets.


25) 2CONSTANTS toevoegen
    Voor een tabel van dubbele constanten. Nee, niet nodig.


26) ALIGN en ALIGNED voor FLASH ROM gebruiken
    ALIGN is nu een no-operation macro, als hij voor ROM toegepast
    wordt moet er op 16-bit woorden geALIGNED worden. Is gebeurt!


27) Extra 500 bytes buffer reserveren voor XFLYER !!
    SHERE kan dan mogelijk als vlag in BALLOT gebruikt worden om
    hiervoor extra geheugen toe te staan. Is gebeurt!


28) Extra cpu's toevoegen
    De lijst AVR chips wordt alsmaar langer, interessante nieuwe
    chips zijn; ATtiny26, ATmega8515, ATmega162 en ATmega32
    Is gebeurt.


29) SIMULATOR uitbreiden
    Met switch om subroutine return uit te kunnen schakelen om
    b.v. co-routines of multi-tasking te kunnen testen.


30) Primitieve voor MEMORY toevoegen
    MAP ( dcode bits vars d-stack r-stack -- )
    Hiermee kan het geheugen nog beter in de hand gehouden worden.
    Ook de stack-diepten kunnen nu ingesteld worden. Is gebeurt.


31) Aparte AT90S1200 en ATtiny compiler genereren
    TAVRF.EXE genereren en de ATtiny uit de oorspronkelijke compiler
    halen. Er wordt een speciale set macros voor geschreven. Dit moet
    omdat deze chips soms alleen maar een Z-reg hebben i.p.v X, Y en Z.


