HBasic
- PIC18F2550
- Beiträge: 2832
- Registriert: Fr 30. Sep 2011, 13:08
Re: HBasic
Eigendlich zerstöre ich schon die Ramdisk im Spinncode das macht aber nichts aus die Runtime läuft ohne probleme.
nur das auslesen von der Runtime zeigt keinen erfolg.
Da ich zwischen dem schreiben einer Freigabezelle ($7FFC) und dem Lesen nichts mache gibt es auch keinen grund warum reg-ios auf die Ramdisk zugreifen sollte.
Ich will nachher was probieren.
-Spin schreibt Code in hram.
-Runtime schreibt Code von hRam in extRam
-Runtime schreibt extRam in hRam
-Runtime führt Code aus
(Test ob "ram_wrlong" und "m_xfetch" kompartiebel sind)
nur das auslesen von der Runtime zeigt keinen erfolg.
Da ich zwischen dem schreiben einer Freigabezelle ($7FFC) und dem Lesen nichts mache gibt es auch keinen grund warum reg-ios auf die Ramdisk zugreifen sollte.
Ich will nachher was probieren.
-Spin schreibt Code in hram.
-Runtime schreibt Code von hRam in extRam
-Runtime schreibt extRam in hRam
-Runtime führt Code aus
(Test ob "ram_wrlong" und "m_xfetch" kompartiebel sind)
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
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
- drohne235
- Administrator
- Beiträge: 2284
- Registriert: So 24. Mai 2009, 10:35
- Wohnort: Lutherstadt Wittenberg
- Kontaktdaten:
Re: HBasic
Hmm, wird wohl nichts anderes bleiben als sich da langsam mit einigen "Debugstützrädern" ranzutasten. Bei m hab ich das auch letztlich über mehrere Stufen gemacht: Als erstes hatte ich den PASM-Debugger um den inneren Interpreter lauffähig zu machen. Im zweiten Schritt hab ich eine SPIN-Debugger programmiert, welcher die VM im m-Core im Einzelschritt laufen lassen konnte - das war dann schon ein virtueller Level höher. Als drittes kam dann schon der äußere Interpreter im Forth, wo man dann Worte direkt in m interaktiv testen kann. Die beiden anderen Debugger brauche ich nun nicht mehr und es ist auch kein Code mehr davon in m enthalten.
Was ich sagen will: Da waren immer wieder und auf allen Ebenen diverse Fehlerquellen, die ich nie "in einem Rutsch" funktionstüchtig programmieren konnte. Zumal ich sagen muss, dass so ein Einzelschrittmechanismus mit Register- und Effektanzeige mir sehr viel "Gefühl" für die blanke Maschine und später für die VM gebracht hat.
Da ist es dann auch schwierig zu helfen, zumal wir eh etwas inkompatibel in der Denkweise sind wie ich festgestellt habe - was nichts schlimmes ist, aber es ist dann halt schwierig sich in die Gedankengänge des Anderen hineinzuversetzen.
Was ich sagen will: Da waren immer wieder und auf allen Ebenen diverse Fehlerquellen, die ich nie "in einem Rutsch" funktionstüchtig programmieren konnte. Zumal ich sagen muss, dass so ein Einzelschrittmechanismus mit Register- und Effektanzeige mir sehr viel "Gefühl" für die blanke Maschine und später für die VM gebracht hat.
Da ist es dann auch schwierig zu helfen, zumal wir eh etwas inkompatibel in der Denkweise sind wie ich festgestellt habe - was nichts schlimmes ist, aber es ist dann halt schwierig sich in die Gedankengänge des Anderen hineinzuversetzen.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
- PIC18F2550
- Beiträge: 2832
- Registriert: Fr 30. Sep 2011, 13:08
Re: HBasic
Moin drohne235,
irgendwie ist die ausgabe der Adresse an den SRAM unterschiedlich.
drohne hast du mal versucht größere daten über den SRAM von Trios nach m zu transportieren.
Sollte das nicht eher heisen?
undcode] shl temp3, #$8 ' adresse zurechtschieben[/code]in
ändern?
Wenn ich alles richtig verstehe sollen die unteren 8 Bit in das Latch und der rest direckt an die IO's
irgendwie ist die ausgabe der Adresse an den SRAM unterschiedlich.
drohne hast du mal versucht größere daten über den SRAM von Trios nach m zu transportieren.
Code: Alles auswählen
PASM ************************************************************************************************
'---------------------------------------------------------------------
eRamRB ' byte lesen
call #setadr ' adresse setzen
mov temp1, ina ' port einlesen
and temp1, #$ff ' daten ausmaskieren
mov outa, _s1 ' bus wieder inaktiv
eRamRB_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
SPIN ************************************************************************************************
PUB ram_rdbyte(sys,adresse):wert 'eram: liest ein byte vom eram
{{ram_rdbyte(adresse):wert - eram: ein byte aus externem ram lesen}}
'rambank 1 000000 - 07FFFF
'rambank 2 080000 - 0FFFFF
'sys = 0 - systemmodus, keine virtualisierung
'sys = 1 - usermodus, virtualisierte adresse
'sysmodus: der gesamte speicher (2 x 512 KB) werden durchgängig adressiert
'usermodus: adresse 0 = rambas
' adresse max = ramend
if sys 'usermodus?
adresse += rbas 'adresse virtualisieren
if adresse > rend 'adressbereich überschritten?
return 0
outa[15..8] := adresse >> 11 'höherwertige adresse setzen
outa[23] := 1 'obere adresse in adresslatch übernehmen
outa[23] := 0
outa[18..8] := adresse 'niederwertige adresse setzen
if adresse < $080000 'rambank 1?
outa[reg_ram1] := 0 'ram1 selektieren (wert wird geschrieben)
wert := ina[7..0] 'speicherzelle einlesen
outa[reg_ram1] := 1 'ram1 deselektieren
else
outa[reg_ram2] := 0 'ram2 selektieren (wert wird geschrieben)
wert := ina[7..0] 'speicherzelle einlesen
outa[reg_ram2] := 1 'ram2 deselektieren
Code: Alles auswählen
outa[15..8] := adresse >> 11 'höherwertige adresse setzen
Code: Alles auswählen
outa[15..8] := adresse << 8 'low adresse setzen
und
Code: Alles auswählen
shr temp3, #$3 ' adresse für latch zurechtschieben
Code: Alles auswählen
shl temp3, #$8 ' low adresse für latch zurechtschieben
Code: Alles auswählen
' shl temp3, #$8 ' adresse zurechtschieben
Wenn ich alles richtig verstehe sollen die unteren 8 Bit in das Latch und der rest direckt an die IO's
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
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
- drohne235
- Administrator
- Beiträge: 2284
- Registriert: So 24. Mai 2009, 10:35
- Wohnort: Lutherstadt Wittenberg
- Kontaktdaten:
Re: HBasic
Hab da noch nichts weiter versucht, da mental ja TriOS ersetzt und m den eRAM nicht existentiell benötigt. Hab das später für Daten angedacht, weshalb aus Geschwindigkeitsgründen die Routinen schon im Core sind. Als Test hab ich nur mal ein paar Peeks und Pokes interaktiv gemacht und das sah ganz vielversprechend aus. Wenn ich Zeit habe, schreib ich heut abend mal eine Testroutine.irgendwie ist die ausgabe der Adresse an den SRAM unterschiedlich.
drohne hast du mal versucht größere daten über den SRAM von Trios nach m zu transportieren.
Ist also durchaus möglich, das noch ein Bug in der Routine ist. Wie unterscheiden sich die Daten denn, kann man schon ein Muster erkennen?
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
- PIC18F2550
- Beiträge: 2832
- Registriert: Fr 30. Sep 2011, 13:08
Re: HBasic
Die daten liegen in unterschiedlicher Reihenfolge.
Sind aber in ihren eigenen Sysem richtig.
das heist unter trios geschriebene und gelesene daten sind gleich das selbe gild auch unter m.
Trios und m müssen wohl beide überarbeitet werden, da in beiden, die Adressausgabe nicht ganz korrekt zu sein scheind. muß mal heut abend drüber nachdenken.
Sind aber in ihren eigenen Sysem richtig.
das heist unter trios geschriebene und gelesene daten sind gleich das selbe gild auch unter m.
Trios und m müssen wohl beide überarbeitet werden, da in beiden, die Adressausgabe nicht ganz korrekt zu sein scheind. muß mal heut abend drüber nachdenken.
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
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
- drohne235
- Administrator
- Beiträge: 2284
- Registriert: So 24. Mai 2009, 10:35
- Wohnort: Lutherstadt Wittenberg
- Kontaktdaten:
Re: HBasic
Zur Bitschieberei:
Schiebt den höherwertigen Teil bündig auf Bit7..0 zusammen, und gibt dann Bit7..0 an Port15..8 aus. Die Spinanweisung setzt automatisch den Bereich von 7..0 auf 15..8 um, was PASM so nicht macht.
Code: Alles auswählen
outa[15..8] := adresse >> 11 'höherwertige adresse setzen
Bit18..11 der Adresse (der höherwertige Teil) müssen an Port8..15 angelegt werden, um ihn in das Latch zu übernehmen. Dann muss Bit0..10 der Adresse (niederwertiger Teil) an Port8..18 angelegt werden, zusammen mit den Daten an Port7..0. Nicht zu vergessen, das Bit19 ausgewertet werden muss, um die Selectsignale für die Rambänke zu bilden, was ich aber in m aus Platz- und Geschwindigkeitsgründen nicht mache und einfach nur eine Bank verwende. TriOS nutzt aber beide Bänke.Wenn ich alles richtig verstehe sollen die unteren 8 Bit in das Latch und der rest direckt an die IO's
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
- drohne235
- Administrator
- Beiträge: 2284
- Registriert: So 24. Mai 2009, 10:35
- Wohnort: Lutherstadt Wittenberg
- Kontaktdaten:
Re: HBasic
Ab Adesse $800 ist irgendwie die Adressierung falsch:
$800 01 02 03 04 05 06 07 08 - geschrieben mit ios
$800 02 02 04 04 06 06 08 08 - gelesen mit pasm
$800 01 02 03 04 05 06 07 08 - geschrieben mit ios
$800 02 02 04 04 06 06 08 08 - gelesen mit pasm
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
- drohne235
- Administrator
- Beiträge: 2284
- Registriert: So 24. Mai 2009, 10:35
- Wohnort: Lutherstadt Wittenberg
- Kontaktdaten:
Re: HBasic
Ich habe die Bitschieberei im PASM-Code mal auseinander genommen:
So sieht die Struktur am Port aus:
So ist die Adresse strukturiert:
Das sind die einzelnen Schritte, wie in PASM der höherwertige Teil der Adresse in das Latch geschoben wird:
Mit dem Impuls bei ah3/4 wird die Teiladresse in den Latch übernommen.
Das sind die Schritte, wie in PASM der niederwertige Teil der Adresse am Port ausgegeben wird:
Mit an4 ist der niederwertige Teil der Adresse korrekt am Port gesetzt und die erste Bank ist selektiert. Nun muss nur noch an P0..7 das Datenbyte "dazugeodert" werden.
Seltsam ist, das ab $0 korrekt in m gelesen wird, was ich mit dem ios schreibe. Ab Adresse $800 wird aber quasi ein Bit der Adresse übersprungen.
So sieht die Struktur am Port aus:
Code: Alles auswählen
' +------------------------------- /hs
' |+------------------------------ /wr
' ||+----------------------------- busclk
' |||+---------------------------- hbeat
' |||| +-------------------------- al
' |||| |+------------------------- /bel
' |||| ||+------------------------ /adm
' |||| |||+----------------------- /ram2
' |||| ||||+---------------------- /ram1
' |||| ||||| +---------- a0..10
' |||| ||||| |
' |||| ||||| | +- d0..7
' |||| |||||+----------+ +------+
port long %00000000_00000aaa_aaaaaaaa_dddddddd ' a: adr, d: daten
Code: Alles auswählen
a1 %00000000_0000shhh_hhhhhnnn_nnnnnnnn ' ausgangsadresse 20 bit:
' s - selektiert rambank
' h - höherwertiger teil für latch
' n - niederwertiger teil
Code: Alles auswählen
' adr höherwertiger teil --> latch
ah0 %00000000_0000shhh_hhhhhnnn_nnnnnnnn 'ausgangsadresse
ah1 %00000000_0000000s_hhhhhhhh_nnnnnnnn 'shr reg_c,#3
ah2 %00000000_00000000_hhhhhhhh_00000000 'and reg_c,_latch
ah3 %00000000_10000000_hhhhhhhh_00000000 'xor outa,_al
ah4 %00000000_00000000_hhhhhhhh_00000000 'xor outa,_al
Das sind die Schritte, wie in PASM der niederwertige Teil der Adresse am Port ausgegeben wird:
Code: Alles auswählen
' adr niederwertiger teil --> port
an0 %00000000_0000shhh_hhhhhnnn_nnnnnnnn 'ausgangsadresse
an1 %0000shhh_hhhhhnnn_nnnnnnnn_00000000 'shl reg_c,#8
an2 %00000000_00000nnn_nnnnnnnn_00000000 'and reg_c,_adr
an3 %00000100_01111nnn_nnnnnnnn_00000000 'or outa,reg_c
an4 %00000100_01110nnn_nnnnnnnn_00000000 'xor outa,_ram1
Seltsam ist, das ab $0 korrekt in m gelesen wird, was ich mit dem ios schreibe. Ab Adresse $800 wird aber quasi ein Bit der Adresse übersprungen.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
- drohne235
- Administrator
- Beiträge: 2284
- Registriert: So 24. Mai 2009, 10:35
- Wohnort: Lutherstadt Wittenberg
- Kontaktdaten:
Re: HBasic
Fehler gefunden! Du musst die Routine "setadt" folgendermaßen anpassen:
Der entscheidende Punkt ist der Befehl
mov outa,_s1 ' bus wieder inaktiv
nach dem Latchen der höherwertigen Adresse, um den Bus wieder in einen definierten Zustand zu bringen. Wenn das nicht passiert, wird der folgende niederwertige Teil auf den höherwertigen Teil "verodert" was automatisch die Daten "verschlüsselt"... Naja, ein Long zusätzlich ist gerade noch so zu verschmerzen...
Edit: Änderung auf
da der Modus _s1 das Bit für Adresslatch-Strobe automatisch rücksetzt.
Code: Alles auswählen
setadr ' adresse verarbeiten
' hwt-adresse --> latch
mov REG_C,REG_B ' adresse holen
shr REG_C,#3 ' adresse für latch zurechtschieben
and REG_C,_latch ' latchbits ausmaskieren
or outa,REG_C ' adresse für latch an ports setzen
xor outa,_al ' wert in latch übernehmen
'xor outa,_al ' wert in latch übernehmen
mov outa,_s1 ' bus wieder inaktiv <---- KORREKTUR
' nwt-adresse setzen
mov REG_C,REG_B ' adresse holen
shl REG_C,#8 ' adresse zurechtschieben
and REG_C,_adr ' adresse ausmaskieren
or outa,REG_C ' adresse an ports setzen
xor outa,_ram1 ' rambank 1 selektieren
setadr_ret ret
mov outa,_s1 ' bus wieder inaktiv
nach dem Latchen der höherwertigen Adresse, um den Bus wieder in einen definierten Zustand zu bringen. Wenn das nicht passiert, wird der folgende niederwertige Teil auf den höherwertigen Teil "verodert" was automatisch die Daten "verschlüsselt"... Naja, ein Long zusätzlich ist gerade noch so zu verschmerzen...
Edit: Änderung auf
Code: Alles auswählen
' hwt-adresse --> latch
mov REG_C,REG_B ' adresse holen
shr REG_C,#3 ' adresse für latch zurechtschieben
and REG_C,_latch ' latchbits ausmaskieren
or outa,REG_C ' adresse für latch an ports setzen
xor outa,_al ' wert in latch übernehmen
mov outa,_s1 ' bus wieder inaktiv <---- KORREKTUR
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
- PIC18F2550
- Beiträge: 2832
- Registriert: Fr 30. Sep 2011, 13:08
Re: HBasic
Oh da hätte ich lange suchen können.
mit der Bitschieberei achtest du ja darauf das das Bit 0 auch auf A0 vom SRAM geht das habe ich nicht so genau genommen da bei mir keine EProm's oder ähnliches drann kommen.
Ich setze da immer andn ein.
mit der Bitschieberei achtest du ja darauf das das Bit 0 auch auf A0 vom SRAM geht das habe ich nicht so genau genommen da bei mir keine EProm's oder ähnliches drann kommen.
Der mov-Befehl in verbindung mit outa/dira ist gefährlich da auch Pinn's verändertwerden die von anderen Routinen(RS232) belegt sein könnten.drohne235 hat geschrieben: mov outa,_s1 ' bus wieder inaktiv <---- KORREKTUR
Ich setze da immer andn ein.
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
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