Re: PASM Bootloader
Verfasst: Di 17. Sep 2013, 12:30
deleted new Code:kleine correkturen und ein paar longs eingespart.
Retro Style Eigenbau Computer mit Parallax Propeller
https://www.hive-project.de/board/
Wunschdenken :)PIC18F2550 hat geschrieben:alle auser sich selbst.kuroneko hat geschrieben:Wieviele cogs schaltet Dein Code dann ab?
par ist immer long, man hat ja nur 14bit zur Verfuegung, die unteren beiden bits werden als 0 betrachtet (4n).PIC18F2550 hat geschrieben:par Zeiger wert muß der in long oder byte sein
Ist doch wirklich nicht so schwer. 2x14bit gehen fuer die Adressen drauf. Bleiben 4bit. Bit 3 = 1 heisst cognew (next free ID), die unteren 3bit sind dann egal (%1---). Laesst Du bit 3 auf 0 dann werden die unteren 3bit als cogid interpretiert (%0ccc, coginit, explicit ID).PIC18F2550 hat geschrieben:COGID von 0 - 7? weil 8 bit freigehalten werden :shock: ist doch irgendwie 1 Bit zuviel oder habe ich was übersehen.
Vergiss @ in PASM (allgemein in DAT). Das gibt Dir nur das relative Offset im aktuellen Object. In SPIN kriegst Du was Du erwartest (absolute hub address). Muss man wissen, dafuer hat bst dann @@@. Und die ersten beiden Varianten funktionieren genau andersherum.PIC18F2550 hat geschrieben:mit dem syntax binn ich immer noch am kämpfen :(
mov reg_a, $4 'direktwert in reg_a schreiben
mov reg_a, #$4 'inhalt des in long $4 enthaltenden wertes laden
mov reg_a, @wert 'adresse wo wert gespeichert ist laden (0-1FF)direktwert
Code: Alles auswählen
DAT org 0
entry cogid $ nr ' $000 $0C7C0001
mov a, #0 ' $001 a := 0
mov a, 0 ' $002 a := $0C7C0001
mov a, entry ' $003 a := $0C7C0001
a res 1
Code: Alles auswählen
MEL_01Z long @@@MEL_01 /4-@@@MEL_01Z/4+1
ERRLIST long @@@ERRT_01/4-@@@MEL_01Z/4+1
long @@@ERRT_02/4-@@@MEL_01Z/4+1
long @@@ERRT_03/4-@@@MEL_01Z/4+1
...
Schau Dir mal den Einsprung Code des Interpreters an. Es werden 5 words beginnend ab Adresse 6 geladen (long[0] == clkfreq, byte[4] == clkmode, byte[5] == checksum).PIC18F2550 hat geschrieben:Muß PAR $0001 beim start des Interpreters was übergeben werden? ich denke ja was steckt im 2. long vom hRAM eigendlich drinn.
Code: Alles auswählen
' initial parameters
'
' par word
' -----------------
' +2 pbase
' +4 vbase
' +6 dbase
' +8 pcurr
' +A dcurr
'
' Entry
'
DAT org
mov x,#$1F0-pbase 'entry, load initial parameters
mov y,par
:loop add y,#2
:par rdword pbase,y
add :par,#$100 'inc d lsb
add :par,#$100
djnz x,#:loop
Nicht ganz. Wenn Du eine djnz Schleife bastelst und N Dein Index ist dann "sieht" die Schleife nur N..1. Wie willst dann jemals cog 0 loswerden?PIC18F2550 hat geschrieben:@kuroneko ist der Teil mit dem cogstop richtig?
Code: Alles auswählen
mov ccnt, #7 ' seven contenders
cogid this ' and us
or spin, this ' remember for restart
add them, #1 ' everyone but us
cogstop them ' sayonara ...
djnz ccnt, #$-2 ' to all of them
coginit spin ' launch SPIN interpreter
' initialised data and/or presets
spin long $0004 << 16 | $F004 << 2 | %0000
' uninitialised data and/or temporaries
ccnt res 1 ' cog shutdown loop index
this ' our cog ID
them res 1 ' and our contenders
Code: Alles auswählen
coginit spin
spin long $0004 << 16 | $F004 << 2 | %1000
Noe, EEPROM oder BINARY Files haben diese 5 Werte schon vorbereitet (einfach zu sehen im PropTool mit F8, in bst etwas weniger offensichtlich). Fuer letzteres musst Du aber die Marker setzen und VAR loeschen. Und beim EEPROM File vielleicht Adresse $7FFC ausklammern (vom Loader genutzt).PIC18F2550 hat geschrieben:Frage:
wenn ich ein eeprom-file ab adresse 0 in den lRam lade sind doch da die Werte pbase, vbase, dbase, pcurr und dcurr gesetzt?
Dann muss ich doch nur noch einen beliebigen freien COG ... starten.
Oder lieg ich hier vollkommen Falsch.