Seite 3 von 20
Re: HBasic
Verfasst: Di 2. Okt 2012, 15:35
von PIC18F2550
Opcode von JMP
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.

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
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?
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
ES ist wieder Platz im COG0

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)
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?
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
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

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
