Seite 3 von 20

Re: HBasic

Verfasst: Di 2. Okt 2012, 15:35
von PIC18F2550
Opcode von JMP

Code: Alles auswählen

010111 000i 1111 --------- sssssssss
eigendlich müsste ich nur wissen wo der jmp steht und und diesen wert mit dem vom CODE addieren und anschließend an dessen Stelle Speichern.

:shock: wofür steht das "i"?

Re: HBasic

Verfasst: Di 2. Okt 2012, 20:47
von unick59
siehe Propeller-Manual Page 251f

Re: HBasic

Verfasst: Di 2. Okt 2012, 23:38
von PIC18F2550
Habe eine Lösung gefunden :D

Code: Alles auswählen

DAT{{Runtime COG***********************************************************************************}}
runtime
              org       0
' ---------------------------------------------------------------------
              mov       sprvm,  SPRV                    'Bytecode Merken
INI0
              rdlong    temp1,   stat                   'status laden
              cmp       temp1,  h7F7FF7F7 wz
        if_z  jmp       #m0
              jmp       #INI0                           'Test auf inifreigabe ><h7F7FF7F7 = Stop =h7F7FF7F7 = Start
' ---------------------------------------------------------------------
m0      ' Load Programm vom externen Ram
' ---------------------------------------------------------------------
RESTART ' ini SYSTEM
              mov       line,   h00000000
' ---------------------------------------------------------------------
TLOOP
              wrlong    line,   areg                    'neuen Linezeiger schreiben
' ---------------------------------------------------------------------
RTLOOP
              rdlong    temp1,  stat                    'status laden
              cmp       temp1,  h00000000 wz
        if_nz jmp       #RTLOOP                         'Test auf startfreigabe >0 = Stop =0 = Start
              rdlong    line,   areg                    'Linezeiger laden
' ---------------------------------------------------------------------
              rdlong    code,   line                    'Code und Arg1 laden
...
...
              mov       SPRV,   sprvm
              add       SPRV,   code
              shr       code,   $06 wz                  'untere 6 bit löschen
'              sub       code,   $0  wz                  'Test ob richtiger 64 Token-block
        if_nz jmp       #RTLOOP                         'wenn nicht dann rücksprung
SPRV          jmp       #SPRV0
SPRV0         jmp       #J0000               'STOP
              jmp       #J0001               'END
              jmp       #J0002               'GOTO
' TOK-CODE Senden an Bellatrix ----------------------------------------------------------
              jmp       #J0003               'write_Bellatrix_word+long
              jmp       #J0004               'write_Bellatrix_byte+long
...
...
'Konstanten
h00000000 long    $00000000     '0
h00000001 long    $00000001     ' STOP-Statusmeldung
h00000004 long    $00000004     '1 ein long weiter
h000000ff long    $000000FF     '8 bit Lowmaske
h0000ffff long    $0000FFFF     '16 bit Lowmaske
dinp      long    %00000111_11111111_11111111_00000000  ' bus input
dout      long    %00000111_11111111_11111111_11111111  ' bus output
_s1       long    %00000100_01111000_00000000_00000000  ' bus inaktiv
_b1       long    %00000000_00111000_00000000_00000000  ' adm=1, bel=0, wr=0, busclk=0
_b2       long    %00000010_00111000_00000000_00000000  ' adm=1, bel=0, wr=0, busclk=1
_b3       long    %00000110_00111000_00000000_00000000  ' adm=1, bel=0, wr=1, busclk=1
_a1       long    %00000000_01011000_00000000_00000000  ' adm=0, bel=1, wr=0, busclk=0
_a2       long    %00000010_01011000_00000000_00000000  ' adm=0, bel=1, wr=0, busclk=1
_a3       long    %00000110_01011000_00000000_00000000  ' adm=0, bel=1, wr=1, busclk=1
_hs       long    %00001000_00000000_00000000_00000000  ' hs=1?
'---------------------------------------------------------------------
h7F7FF7F7 long    $7F7FF7F7     '32 bitmaske für LOAD SYSTEM von externen Ram (STATUS)
'---------------------------------------------------------------------
'Variabeln
sprvm     long $0               'Merker Bytecode SPRVM
stat      long $7FFC            'Zeiger auf Statusregister
areg      long $7FF8            'Zeiger auf token im hRAM
line      long 0                'Merker line Nummer
code      long 0                'Tockencode
arg1      long 0                'Tokenargument 1
arg23     long 0                'Longargument
arg2      long 0                'Tokenargument 2
arg3      long 0                'Tokenargument 3
temp1     long 0                'Merker
temp2     long 0                'Merker
temp3     long 0                'Merker
              fit   $1F0
z.Z. erfolgt aller 22 PASM Befehle ein neuer TOKEN zyklus.

Einfache befehle brauchen ca. 23 Befehle das heist aller 1,15µsec wird ein befehl abgearbeitet. Das entspricht ungefähr der geschwindigkeit einer Z80 4MHz.

Re: HBasic

Verfasst: Mi 3. Okt 2012, 00:22
von kuroneko
Hast Du mal ueber folgendes nachgedacht?

Code: Alles auswählen

        rdlong  code, line                    ' arg1:code = 23:9
        jmp     code

Re: HBasic

Verfasst: Mi 3. Okt 2012, 01:24
von PIC18F2550
:? was soll er bewirken :?:
code kann werte von 0..65535 annehmen.

Re: HBasic

Verfasst: Mi 3. Okt 2012, 02:02
von PIC18F2550
Bildschirmfoto-Compiler Information-2.png
Bildschirmfoto-Compiled Listing.png
ES ist wieder Platz im COG0 :mrgreen:

Re: HBasic

Verfasst: Mi 3. Okt 2012, 02:21
von kuroneko
PIC18F2550 hat geschrieben::? was soll er bewirken :?:
code kann werte von 0..65535 annehmen.
Es gibt aber trotzdem nur 512 Sprungziele im cog. Also kannst Du zumindest die unteren 9bit als direkte Einsprungadresse verwenden.

Re: HBasic

Verfasst: Mi 3. Okt 2012, 10:18
von PIC18F2550
Das ist Richtig aber es werkeln 8 COG's paralel und jeder liest den Befehl und 7 COG's ignorieren ihn nur der 8. weis was damit anzufangen.
gemeinsames interface der COG's(PASM)

Code: Alles auswählen

addr.long[7FF8]
        Adresse des Programmspeichers dient zur syncronisation der COG's
        1.) Adresse lesen
        2.) Abarbeiten
            ja   Neue adresse schreiben
            nein warten auf neue Adresse

status.long[7FFC]
        Sreuerregiste zum steuern der Runtimmodule
       >0 = Stop
        0 = Go

Code: Alles auswählen

COG0       ist der spinnteil von der Runtine und wird nach dem Starten von COG1 beendet.
COG1       ist sowas wie die Mutter im System sie verbindet den Regnatix mit dem rest vom HIVE
           und läd Runtimmodule in COG2-7 und 0
COG2-7 & 0 sind ladbare Module die verschiedene Funktionen ähnlich wie COG1 zur verfügung stellen
Ich habe mich für 64 sprünge pro COG entschieden das macht 512 Sprünge im aktiven system.
Da ich keinerlei wichtige Daten vom Basicprogramm im COG habe kann ich die runtimmodule vom COG2-7 & 0 während der Laufzeit beliebig austauschen.
damit währen theoretisch (512*wieviele Runtimmodule passen auf die SD-Karte drauf) :lol:
Die module würden speziel für funktionen geschrieben werden und nur bei bedarf in eine COG geladen

Re: HBasic

Verfasst: Mi 3. Okt 2012, 12:22
von PIC18F2550
kuroneko hat geschrieben:
kuroneko hat geschrieben:Hast Du mal ueber folgendes nachgedacht?

Code: Alles auswählen

        rdlong  code, line                    ' arg1:code = 23:9
        jmp     code
PIC18F2550 hat geschrieben::? was soll er bewirken :?:
code kann werte von 0..65535 annehmen.
OK es hatt etws gedauert aber jetzt binn ich wieder wach

Code: Alles auswählen

 ' arg1:code = 23:9
war verrwirrend. :?

im prizip wird der original sprung durch aufaddierung der unteren 6bit vom code als zeiger auf den Sprungverteiler verwendet.
ebend ein bisschen LMM aber nur ein bisschen :mrgreen:

Re: HBasic

Verfasst: Do 4. Okt 2012, 23:24
von PIC18F2550
eRam-Modul

Code: Alles auswählen

'---------------------------------------------------------------------
' eRam
'
' temp1     Daten
' temp2     Adresse
' temp3     temp
'---------------------------------------------------------------------
eRamWR ' byte schreiben
              mov     dira,dout         ' bus auf ausgabe schalten
              call    #setadr           ' adresse setzen
              and     temp1,#$ff
              or      outa,temp1        ' wert an ports setzen
              xor     outa,_bwr         ' schreibsignal aktiv
              mov     dira,dinp         ' bus auf eingabe schalten
              mov     outa,_s1          ' bus wieder inaktiv
eRamWR_ret    ret
'---------------------------------------------------------------------
eRamWD ' byte lesen
              call    #setadr           ' adresse setzen
              mov     temp1,ina         ' port einlesen
              and     temp1,#$ff        ' daten ausmaskieren
              mov     outa,_s1          ' bus wieder inaktiv
eRamWD_ret    ret
'---------------------------------------------------------------------
setadr ' adresse verarbeiten   hwt-adresse --> latch
              mov     temp3,temp2       ' adresse holen
              shr     temp3,#3          ' adresse für latch zurechtschieben
              and     temp3,_latch      ' latchbits ausmaskieren
              or      outa,temp3        ' adresse für latch an ports setzen
              xor     outa,_al          ' wert in latch übernehmen
              xor     outa,_al          ' wert in latch übernehmen
              mov     temp3,temp2       ' adresse holen
              shl     temp3,#8          ' adresse zurechtschieben
              and     temp3,_adr        ' adresse ausmaskieren
              or      outa,temp3        ' adresse an ports setzen
              xor     outa,_ram1        ' rambank 1 selektieren
setadr_ret    ret
nur noch mal Testen :twisted: