PASM Operators

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
Antworten
Benutzeravatar
TuxFan
Beiträge: 1022
Registriert: So 6. Sep 2009, 11:18

PASM Operators

Beitrag von TuxFan »

Hallo!
Ich mach jetzt mal einen Thread für Operatoren im Propeller-Assembler auf, vielleicht kommen da außer meiner Frage noch andere hinzu, von denen, die sich auch in PASM einarbeiten wollen.

In Spin gibt es den Operator |< "Bitwise decode" um eine Zahl zwischen 0 und 31 in eine PIN-Maske zu wandeln. In Spin ist das kein Problem aber laut Seite 326 im Propellerhandbuch soll das auch in PASM möglich sein. Aber wie, es gibt hier keinen Opcode der von BST akzeptiert wird.

Gruß
TuxFan
Wunder gibt es immer wieder.......
josto
Beiträge: 41
Registriert: So 11. Dez 2011, 11:48

Re: PASM Operators

Beitrag von josto »

Dies könnte ein "Feature" von BST sein.

Versuch mal "#1<<...". Geht natürlich nur mit Konstanten, nicht Registern
Zuletzt geändert von josto am Do 2. Feb 2012, 19:15, insgesamt 1-mal geändert.
Täglich verschwinden Rentner im Internet, weil sie "Alt" + "Entfernen" gleichzeitig drücken...
Benutzeravatar
kuroneko
Beiträge: 202
Registriert: Sa 22. Okt 2011, 13:05
Wohnort: FN, Germany

Re: PASM Operators

Beitrag von kuroneko »

TuxFan hat geschrieben:In Spin ist das kein Problem aber laut Seite 326 im Propellerhandbuch soll das auch in PASM möglich sein. Aber wie, es gibt hier keinen Opcode der von BST akzeptiert wird.
Funktioniert hier ohne Probleme. Was hast Du denn genau versucht?

Code: Alles auswählen

PUB null
DAT
                mov     temp, #|< 5          ' 2^(0..8)
                movd    temp, #|< (12 - 9)   ' 2^(9..17)
                movi    temp, #|< (24 - 23)  ' 2^(23..31)

                long    |< 12

temp            res     1
Der Nachteil mit mov[sdi] ist das es nur jeweils 9 bit des Zielregisters modifiziert. Notfalls musst Du dann auf

Code: Alles auswählen

mov temp, #1
shl temp, #n
zurueckgreifen. In dem Fall wuerd' ich dann aber die Maske als data definieren und direkt ins Register laden. Verbraucht den gleichen Platz ist aber schneller.
Benutzeravatar
TuxFan
Beiträge: 1022
Registriert: So 6. Sep 2009, 11:18

Re: PASM Operators

Beitrag von TuxFan »

Danke für die Reaktionen.

Als blutiger PASM-Anfänger versuche ich die Device-Selektion des C3-SPI-Bus abzuändern, da ich beim Gam_Bo_Prop, um Strom zu sparen, den Counter weggelassen habe :roll: und nun mit drei I/O-Leitungen des Propellers den Encoder füttere um die 8 (eigentlich 7) Devices (RAM, Flash, SD etc.) zu selektieren. Bei reinem Spin-Code ist das alles kein Problem. Wenn man aber wegen höherer Geschwindigkeit auf Assembler-Routinen wechselt, wird es für mich kompliziert. Um das Rad nicht neu zu erfinden, wollte ich als Software-Grundlage die spi-Treiber aus C3-Femtobasic assimilieren ;) und diese an die geänderte Hardware anpassen.
Deshalb dachte ich mir folgendes : Die 3 I/O-Leitungen zur Ansteuerung des Encoders liegen beim GBP an P0, P1 und P2. Es bräuchte nun nur der Select-Kanal (1 bis 7) als Parameter/Variable an die Assemblerroutine übergeben werden und dieser per |< in eine Maske überführt zu werden. (Geht natürlich sooooo nicht ganz :roll: )
Das Ganze versuche ich natürlich erst einmal auf dem Breadboard mit meinem SoMProp und ein paar Leuchtdioden sowie etwas Assembler ans Laufen zu bringen, bevor ich die Treiber-Routinen anfasse.
Fixe Masken im DATA sind natürlich auch denkbar würden mMn aber durch die wahrscheinlichen if-Anweisungen deutlich mehr Platz beanspruchen.
Aufgefallen war mir nun der obige Sachverhalt im Handbuch.
Ich hoffe mich verständlich ausgedrückt zu haben...... :?

Gruß
TuxFan
Wunder gibt es immer wieder.......
Benutzeravatar
TuxFan
Beiträge: 1022
Registriert: So 6. Sep 2009, 11:18

Re: PASM Operators

Beitrag von TuxFan »

So jetzt zitiere ich mich mal selber : :oops:
TuxFan hat geschrieben:........Deshalb dachte ich mir folgendes : Die 3 I/O-Leitungen zur Ansteuerung des Encoders liegen beim GBP an P0, P1 und P2. Es bräuchte nun nur der Select-Kanal (1 bis 7) als Parameter/Variable an die Assemblerroutine übergeben werden und dieser per |< in eine Maske überführt zu werden. (Geht natürlich sooooo nicht ganz :roll: ).......

Ha, ging sogar leichter als ich dachte. Da die I/O-Leitungen in der richtigen Reihenfolge liegen, P0 als LSB und P2 als MSB am Decoder, kann die Kanal-Nummer (0 bis 7) als long-Variable übergeben werden. Da im Inneren der Variablen binär operiert wird, liegen die richtigen Signale an den Decodereingängen an. Nur die Erstellung der Pin-Maske für die dira-operation muß im Spin-Teil des Programmes durchgeführt werden. Eine |< Operation ist im Moment im PASM-Teil nicht nötig.

Code: Alles auswählen

con
   _clkmode  = xtal1 + pll8x
   _xinfreq  = 10_000_000
   spiSel0   = 0                      ' SPI select0
   spiSel1   = 1                      ' SPI select1
   spiSel2   = 2                      ' SPI select2
var
    long Kanal, Sel
    long Sel0, Sel1, Sel2
PUB main
  Sel     := 0
  Sel0    := |< spiSel0
  Sel1    := |< spiSel1
  Sel2    := |< spiSel2
  Sel     :=  Sel2 or Sel1 or Sel0  'gesamte Pinmaske
  Kanal   := 7
  cognew(@init, @Kanal)
DAT
          org   0
init      mov       temp,par
          rdlong    channel,temp
          add       temp,#4
          rdlong    select,temp
          mov       dira,select
          or        outa,channel
temp      long  0
select    long  0
channel   long  0
          fit   496
Gruß
TuxFan
Wunder gibt es immer wieder.......
Benutzeravatar
kuroneko
Beiträge: 202
Registriert: Sa 22. Okt 2011, 13:05
Wohnort: FN, Germany

Re: PASM Operators

Beitrag von kuroneko »

Wenn Du schon Konstanten benutzt dann kannst Du Dir 'ne Menge code sparen.

Code: Alles auswählen

con
   _clkmode  = xtal1 + pll8x
   _xinfreq  = 10_000_000

   #0, spiSel0, spiSel1, spiSel2      ' SPI select

var
    long Kanal

PUB main
  Kanal   := %111{7} << spiSel0       ' falls spiSel0 mal nicht 0 ist
  cognew(@init, @Kanal)

DAT
          org   0

init      mov       dira,select
          rdlong    channel,par           
          or        outa,channel

          waitpeq   $, #0               ' stop
          
select    long  |< spiSel0 | |< spiSel1 | |< spiSel2
channel   res   1

          fit
Benutzeravatar
TuxFan
Beiträge: 1022
Registriert: So 6. Sep 2009, 11:18

Re: PASM Operators

Beitrag von TuxFan »

@kuroneko
Schönen Dank für die Tips.

Gruß
TuxFan
Wunder gibt es immer wieder.......
Antworten