LIST p=16F84, r=dec INCLUDE "P16F84.inc" __IDLOCS 0804h ;Monat und Jahr __CONFIG _XT_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON ;*** "Fehlende" Standard-Makros *** MOV MACRO dest,src ;Reihenfolge wie 8051,80x86,ATMega movfw src movwf dest ENDM MOVE MACRO src,dest ;PIC-mäßig "verkehrtherum" movfw src movwf dest ENDM LD MACRO dest,imm ;Reihenfolge wie 8051,80x86,ATMega movlw imm movwf dest ENDM LOAD MACRO imm,dest ;PIC-mäßig "verkehrtherum" movlw imm movwf dest ENDM DJNZ MACRO reg,dest ;wie 8051; ähnlich Z80; 80x86 "LOOP" decfsz reg,f goto dest ENDM ;=============== HIER AUSSCHNEIDEN ================ ;MAKRO: Vorzeichenlose Multiplikation mit beliebigen (/8 teilbaren) Bitbreiten(!) ;5 Makro-Expansions-Parameter: ;fak1 = Adresse Speicher mit Faktor 1 (IN) ;prod = Adresse Speicher mit Faktor 2 (IN) und Produkt (OUT) ;cl = Adresse Speicher einer Zählvariablen (1 Byte) ;faksize= Anzahl Bytes des Faktors 1 (vorzugsweise <= faksize2) ;faksize2=Anzahl Bytes des Faktors 2 (Produkt-Bytes = Summe beider!) ;Alle Mehr-Byte-Parameter in Intel-Byte-Reihenfolge! ;Das Makro erzeugt eine reguläre Schleife (nicht "ausgerollt") ; mit der Durchlaufzahl von faksize2. ;Dieses Makro erzeugt kein RETURN! ;cl ist am Ende Null, w undefiniert, fak und das C-Flag unverändert. ;Im Falle von faksize==1 ist w=fak MUL MACRO fak1,prod,cl,faksize,faksize2 LOCAL mul_loop,noadd,bot variable prodsize=faksize+faksize2,i,j prodsize=faksize+faksize2 i=faksize2 WHILE i0 IF i==faksize2 bot: ;Ansprungmarke erzeugen ENDIF i-=1 rrf prod+i,f ;Gleichzeitig nächstes Bit ausschieben ENDW DJNZ cl,mul_loop ;Am Ende wird C wieder restauriert! ENDM ;=============== HIER AUSSCHNEIDEN ================ CBLOCK 10h fak:2 ;Faktor 1 (High=Adresse+1) pro:4 ;Faktor 2 liegt im LOW-Word des Produkts cl ENDC ;Testprogramm (getestet!) nop LOAD low(1234), fak+0 LOAD high(1234),fak+1 LOAD low(5678), pro+0 LOAD high(5678),pro+1 call Mul16x16 LOAD 90,fak nochmal: call Mul8x24 goto nochmal ;Unterprogramme (Demo) Mul16x16: MUL fak,pro,cl,2,2 return Mul8x8: MUL fak,pro,cl,1,1 return Mul8x24: MUL fak,pro,cl,1,3 return END