Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: rotate von Variablen Kategorie: Programmierung (von André H. - 4.01.2005 20:08)
Als Antwort auf Re: rotate von Variablen von Günni - 4.01.2005 16:17
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0
Hallo Günni

> vielen Dank für Deine Bemühungen.
> Die Lösung mit dem RAM-Assemberl Code Aufruf kannte ich noch gar nicht!

Das ist das Gute an dieser Controller-Architektur.
Mit einem Atmel-Controller ist es unmöglich, Routinen aus dem RAM oder dem EEProm
auszuführen. Das geht dort nur aus dem Programm-Flash. ;-)
(Das nur einmal, um die Atmel-Lobby etwas zu schwächen. *g*)

> Kannst Du auch eine Variante für Byte-Variablen generieren? Ich beherrschte den ASM für den C164
> leider nicht.

Andere Datentypen, auÃ?er Integer, sind schwieriger.
Denn für ROR und ROL gibt es eigene OP-Codes, was das ganze sehr einfach macht:

vm_ror  proc far
        CALLS   OSsegment,POP_R4        ;shift
        MOV     R8, R4
        CALLS   OSsegment,POP_R4        ;value
        ROR     R4, R8
        MOV     R12, R4
        CALLS   OSsegment,PUSH_R12
        POP R1
        POP R1
        RETS
vm_ror  endp


ROR und ROL sind nur für Integer Operationen gedacht.

Aber, Du hast Glück. Die Routine für ROL und ROR für Bytes kann man gerade mit nur
30 Byte ASM-Code schreiben. Somit passt es gerade noch in einen String. ;-)

Die Strings sehen dann so aus:
ASM_RORB="xDAx00x5Ax76xF0x84xDAx00x5Ax76x66xF4xFFx00x2C"
         "x48x71x89xC0x8CxDAx00xD6x75xFCxF1xFCxF1xDBx00";

ASM_ROLB="xDAx00x5Ax76xF0x84xDAx00x5Ax76x66xF4xFFx00x0C"
         "x48x71x89xC0x8CxDAx00xD6x75xFCxF1xFCxF1xDBx00";


Die Funktionen dazu folgendermaÃ?en:
function rorb(int value, int shift) returns int
{
 return call_asm(value, shift, 8, ASM_RORB);
}

function rolb(int value, int shift) returns int
{
 return call_asm(value, shift, 8, ASM_ROLB);
}


Und bitte davon beirren lassen, daÃ? die Parameter hier auch als Integer definiert sind.

Ach ja, der ASM-Code dazu sieht wiederum so aus:

vm_rorB proc far
        CALLS   OSsegment,POP_R4        ;shift
        MOV     R8, R4
        CALLS   OSsegment,POP_R4        ;value
        AND     R4, #0FFh
        ROR     R4, R8
        ORB     RL4, RH4        
        MOVBZ   R12, RL4
        CALLS   OSsegment,PUSH_R12
        POP R1
        POP R1
        RETS
vm_rorB endp

vm_rolB proc far
        CALLS   OSsegment,POP_R4        ;shift
        MOV     R8, R4
        CALLS   OSsegment,POP_R4        ;value
        AND     R4, #0FFh
        ROL     R4, R8
        ORB     RL4, RH4        
        MOVBZ   R12, RL4
        CALLS   OSsegment,PUSH_R12
        POP R1
        POP R1
        RETS
vm_rolB endp


Getestet habe ich aber die Byte-Rotate-Routinen noch nicht. Sie sollten aber funzen.

MfG André H.
 
PS: Bitte sende mir keine EMails auf Foren-Postings. Ich beantworte keine EMails mehr,
      die direkten Bezug auf einen Forenbeitrag haben. (siehe auch meine Signatur)
      Dies muÃ? ich so machen, da ich an manchen Tagen allein dem Antworten
      von EMails kaum hinterherkomme.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: rotate von Variablen (von Günni - 7.01.2005 21:04)