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: 2735
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag von PIC18F2550 »

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)
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
drohne235
Administrator
Beiträge: 2278
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: HBasic

Beitrag von drohne235 »

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

Re: HBasic

Beitrag von PIC18F2550 »

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.

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
Sollte das

Code: Alles auswählen

  outa[15..8] := adresse >> 11            'höherwertige adresse setzen
nicht eher

Code: Alles auswählen

  outa[15..8] := adresse << 8            'low adresse setzen
heisen?

und

Code: Alles auswählen

              shr     temp3,  #$3          ' adresse für latch zurechtschieben
code] shl temp3, #$8 ' adresse zurechtschieben[/code]in

Code: Alles auswählen

              shl     temp3,  #$8          ' low adresse für latch zurechtschieben

Code: Alles auswählen

'              shl     temp3,  #$8          ' adresse zurechtschieben
ändern?

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
Benutzeravatar
drohne235
Administrator
Beiträge: 2278
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: HBasic

Beitrag von 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.
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.

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

Re: HBasic

Beitrag von PIC18F2550 »

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. :|
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
drohne235
Administrator
Beiträge: 2278
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: HBasic

Beitrag von drohne235 »

Zur Bitschieberei:

Code: Alles auswählen

outa[15..8] := adresse >> 11            'höherwertige adresse setzen
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.

Wenn ich alles richtig verstehe sollen die unteren 8 Bit in das Latch und der rest direckt an die IO's
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.
"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
Benutzeravatar
drohne235
Administrator
Beiträge: 2278
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: HBasic

Beitrag von drohne235 »

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
"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
Benutzeravatar
drohne235
Administrator
Beiträge: 2278
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: HBasic

Beitrag von drohne235 »

Ich habe die Bitschieberei im PASM-Code mal auseinander genommen:

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
So ist die Adresse strukturiert:

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
Das sind die einzelnen Schritte, wie in PASM der höherwertige Teil der Adresse in das Latch geschoben wird:

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

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:

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

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. :?:
"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
Benutzeravatar
drohne235
Administrator
Beiträge: 2278
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: HBasic

Beitrag von drohne235 »

Fehler gefunden! Du musst die Routine "setadt" folgendermaßen anpassen:

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
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"... :twisted: 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
da der Modus _s1 das Bit für Adresslatch-Strobe automatisch rücksetzt.
"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
Benutzeravatar
PIC18F2550
Beiträge: 2735
Registriert: Fr 30. Sep 2011, 13:08

Re: HBasic

Beitrag von PIC18F2550 »

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 :DAUMENHOCH das habe ich nicht so genau genommen da bei mir keine EProm's oder ähnliches drann kommen. :mrgreen:
drohne235 hat geschrieben: mov outa,_s1 ' bus wieder inaktiv <---- KORREKTUR
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.

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
Antworten