Is ja noch schlimmer mit dir als angenommen.. gross wie ein Fenster, auf Rollen ..
Mit den Label im Programmspeicher muß man aufpassen: Der µC hat da zwei Begriffe: Worte und Bytes.
Instructions brauchen ja immer 16-Bit, also zwei Byte, während irgendwelche Daten (im Prog-speicher) nur auf Byte ausgerichtet sind.
Konkret:
wenn du schreibst
klappt das tadellosCode:$asm rcall labello ... labello: ret $end asm
Bascom gibt aber immer die Byteaddresse zurück
Wenn du aber dort hinjumpen willst, mußt du addr / 2 nehmen (->wortadresse)Code:DIM addr AS WORD DIM dat AS BYTE addr = loadlabel (labello) ' byteaddresse dat = CPEEK(addr) ' dat = &H41 ...... labello: DATA &H41
Verständlich oder kryptisch ?Code:DIM addr AS WORD addr = LOADLABEL (labello) ' byteaddresse $ASM '----- variable "addr" in register "Z" laden ----- LOADADR addr, X ' variable "addr" (SRAM) LD zl, X+ ' Reg z load LD zh, X+ '----- register "Z" / 2 ----- LSR zh ROR zl '----- Call register "Z" ----- ICALL ' call Z $END ASM ...... labello: .. return
BTW: ob der label innerhalb "$ASM" definiert wird oder ein "bascomlabel" ist, ist egal







Zitieren

Lesezeichen