HBasic

Du hast ein Betriebssystem für den Hive geschrieben oder beschäftigst dich mit den grundlegenden Systemfunktionen, dann bist du hier richtig!
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag 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"?
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
unick59
Beiträge: 134
Registriert: Di 23. Jun 2009, 11:14
Wohnort: Heideblick

Re: HBasic

Beitrag von unick59 »

siehe Propeller-Manual Page 251f
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag 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.
Zuletzt geändert von PIC18F2550 am Mi 3. Okt 2012, 01:59, insgesamt 1-mal geändert.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
kuroneko
Beiträge: 202
Registriert: Sa 22. Okt 2011, 13:05
Wohnort: FN, Germany

Re: HBasic

Beitrag von kuroneko »

Hast Du mal ueber folgendes nachgedacht?

Code: Alles auswählen

        rdlong  code, line                    ' arg1:code = 23:9
        jmp     code
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag von PIC18F2550 »

:? was soll er bewirken :?:
code kann werte von 0..65535 annehmen.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag von PIC18F2550 »

Bildschirmfoto-Compiler Information-2.png
Bildschirmfoto-Compiled Listing.png
ES ist wieder Platz im COG0 :mrgreen:
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
kuroneko
Beiträge: 202
Registriert: Sa 22. Okt 2011, 13:05
Wohnort: FN, Germany

Re: HBasic

Beitrag 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.
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag 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
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag 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:
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag 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:
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Antworten