Hallo PicNick,
ich habe Deinen sehr interessanten Code mal in den Bascom Simulator eingepasst:
Code:
$regfile = "m8def.dat"
$framesize = 32 'Stack
$swstack = 32
$hwstack = 64
Dim Array(5) As Byte
Dim Dummy(4) As Byte
Dim Pointer As Word At Dummy(1) Overlay
Dim Bits_ As Byte At Dummy(4) Overlay
Dim I As Byte , J As Byte
Bits_ = 0
Pointer = Varptr(array(1))
For I = 1 To 40
Gosub Shifter 'hier mit Breakpoint PinB.0 auf 0/1 umschalten
For J = 5 To 1 Step -1
Print Bin(array(j));
Next
Print
Next
End
Shifter:
Loadadr Pointer , Z
LDD XL , Z + 0 'low pointer
LDD XH , Z + 1 'hig pointer
LD R24, X ' aktuelles array-byte
CLC ' clear carry
SBIC PINB, 0 ' inp-pin Input -pin = 0/1 ?
SEC ' set carry
ROL r24 ' bit reinschieben
ST X, R24 'aktuelles byte speichern
LDD R24, Z + 3 ' (Bitcounter)
INC R24 ' bitcounter+1
ANDI R24 , 7 ' es gilt nur 0-7
Brne _next_bit
'_next_byte:
ADIW XL, 1 'pointer+1
STD Z + 0, XL ' neuen low pointer speichern
STD Z + 1, XH 'neuen hig pointer speichern
_next_bit:
STD Z + 3, r24 'Bitcounter in Bits_ speichern
Return
Der Code shiftet nicht über die Bytegrenzen hinweg. Einfach mal im Simulator durch Umschaltung des grünen Kreies für PinB.0 mit 10111.. durchspielen.
Ich denke, beim Kopieren ist der Sprung zu _next_byte untergegangen.
Gruß
Tomas
Lesezeichen