00001 ;------------------------------------------------------ 00002 ; PICCOLO project 00003 ; Copyright (c) 2009-2010 Istvan Cserny (cserny@atomki.hu) 00004 ; 00005 ; Mintaprogram a 32 bites számok osztáshoz definiált makrók 00006 ; használatának bemutatására 00007 ; 00008 ; FIGYELEM: A programot az MPLAB szimulátorában futtassuk! 00009 ;------------------------------------------------------ 00010 #include "..\include\p18_all.inc" 00011 00012 ;****************************************************** 00013 ; Helyfoglalás a változók számára 00014 ; Az az alábbi makrókkal végzett osztásokhoz kötelezően 00015 ; az ACCESS területen kell elhelyeznünk az adatokat! 00016 ;****************************************************** 00017 mydata UDATA_ACS 00018 pOPA RES 4 00019 pOPB RES 4 00020 pRES RES 4 00021 pCYC RES 1 00022 00023 ;*************************************************** 00024 ; 32-bites előjel nélküli szám osztása 8-bites 00025 ; előjel nélküli számmal 00026 ; dividend: a 32 bites osztandó címe 00027 ; divisor: a 8 bites osztandó címe 00028 ; rem: a 8 bites maradék címe 00029 ; pCYC: a ciklusváltozónak használt egybájtos változó 00030 ; ennek fixen foglaljunk helyet valahol 00031 ; A makró feltételezi, hogy minden változó az ACCESS 00032 ; blokkban van! 00033 ;*************************************************** 00034 UDIV32_8 macro dividend,divisor,rem 00035 local UD8LOOP,UD8SUB,UD8NOSUB 00036 movlw D'32' 00037 movwf pCYC 00038 clrf rem 00039 bcf STATUS,C 00040 UD8LOOP: 00041 rlcf dividend 00042 rlcf dividend+1 00043 rlcf dividend+2 00044 rlcf dividend+3 00045 rlcf rem 00046 bc UD8SUB 00047 movf divisor,W 00048 subwf rem,W 00049 bnc UD8NOSUB 00050 UD8SUB: 00051 movf divisor,W 00052 subwf rem 00053 incf dividend 00054 UD8NOSUB: 00055 decfsz pCYC 00056 bra UD8LOOP 00057 endm 00058 00059 ;*************************************************** 00060 ; 32-bites előjel nélküli szám osztása 16-bites 00061 ; előjel nélküli számmal 00062 ; dividend: a 32 bites osztandó címe 00063 ; divisor: a 16 bites osztandó címe 00064 ; rem: a 16 bites maradék címe 00065 ; pCYC: a ciklusváltozónak használt egybájtos változó 00066 ; ennek fixen foglaljunk helyet valahol 00067 ; A makró feltételezi, hogy minden változó az ACCESS 00068 ; blokkban van! 00069 ;*************************************************** 00070 UDIV32_16 macro dividend,divisor,rem 00071 local UD16LOOP,UD16SUB,UD16NOSUB 00072 movlw D'32' 00073 movwf pCYC 00074 clrf rem 00075 clrf rem+1 00076 bcf STATUS,C 00077 UD16LOOP: 00078 rlcf dividend 00079 rlcf dividend+1 00080 rlcf dividend+2 00081 rlcf dividend+3 00082 rlcf rem 00083 rlcf rem+1 00084 bc UD16SUB 00085 movf divisor,W 00086 subwf rem,W 00087 movf divisor+1,W 00088 subwfb rem+1,W 00089 bnc UD16NOSUB 00090 UD16SUB: 00091 movf divisor,W 00092 subwf rem 00093 movf divisor+1,W 00094 subwfb rem+1 00095 incf dividend 00096 UD16NOSUB: 00097 decfsz pCYC 00098 bra UD16LOOP 00099 endm 00100 00101 ;*************************************************** 00102 ; 32-bites előjel nélküli számok osztása 00103 ; dividend: a 32 bites osztandó címe 00104 ; divisor: a 32 bites osztandó címe 00105 ; rem: a 32 bites maradék címe 00106 ; pCYC: a ciklusváltozónak használt egybájtos változó 00107 ; ennek fixen foglaljunk helyet valahol 00108 ; A makró feltételezi,hogy minden változó az ACCESS 00109 ; blokkban van! 00110 ;*************************************************** 00111 UDIV32_32 macro dividend,divisor,rem 00112 local UD32LOOP,UD32NOSUB 00113 movlw D'32' 00114 movwf pCYC 00115 clrf rem 00116 clrf rem+1 00117 clrf rem+2 00118 clrf rem+3 00119 bcf STATUS,C 00120 UD32LOOP: 00121 rlcf dividend 00122 rlcf dividend+1 00123 rlcf dividend+2 00124 rlcf dividend+3 00125 rlcf rem 00126 rlcf rem+1 00127 rlcf rem+2 00128 rlcf rem+3 00129 movf divisor,W 00130 subwf rem,W 00131 movf divisor+1,W 00132 subwfb rem+1,W 00133 movf divisor+2,W 00134 subwfb rem+2,W 00135 movf divisor+3,W 00136 subwfb rem+3,W 00137 bnc UD32NOSUB 00138 movf divisor,W 00139 subwf rem 00140 movf divisor+1,W 00141 subwfb rem+1 00142 movf divisor+2,W 00143 subwfb rem+2 00144 movf divisor+3,W 00145 subwfb rem+3 00146 incf dividend 00147 UD32NOSUB: 00148 decfsz pCYC 00149 bra UD32LOOP 00150 endm 00151 00152 ;*************************************************** 00153 ; LET32 - 32-bites előjel nélküli értékadás 00154 ; valtozo: az előjel nélküli változó címe 00155 ; adat: a változóba írandó adat (0 - 0xffffffff) 00156 ; 00157 ; Példa: 00158 ; LET32 my_dword,D'573612400' 00159 ;*************************************************** 00160 LET32 macro valtozo,adat 00161 banksel valtozo 00162 movlw adat & H'FF' 00163 movwf valtozo 00164 movlw adat >>D'8' & H'FF' 00165 movwf valtozo+1 00166 movlw adat >>D'16' & H'FF' 00167 movwf valtozo+2 00168 movlw adat >>D'24' & H'FF' 00169 movwf valtozo+3 00170 endm 00171 ;*************************************************** 00172 ; LET16 - 16-bites előjel nélküli értékadás 00173 ; valtozo: az előjel nélküli változó címe 00174 ; adat: a változóba írandó adat (0 - 0xffff) 00175 ; 00176 ; Példa: 00177 ; LET16 my_word,D'57360' 00178 ;*************************************************** 00179 LET16 macro valtozo,adat 00180 banksel valtozo 00181 movlw adat & H'FF' 00182 movwf valtozo 00183 movlw adat >>D'8' & H'FF' 00184 movwf valtozo+1 00185 endm 00186 00187 ;*************************************************** 00188 ; LET8 - 8-bites előjel nélküli értékadás 00189 ; valtozo: az előjel nélküli változó címe 00190 ; adat: a változóba írandó adat (0 - 0xff) 00191 ; 00192 ; Példa: 00193 ; LET8 my_byte,D'160' 00194 ;*************************************************** 00195 LET8 macro valtozo,adat 00196 banksel valtozo 00197 movlw adat 00198 movwf valtozo 00199 endm 00200 00201 PGM CODE 00202 ;--- A főprogram kötelezően a main címkénél kezdődik! 00203 main: LET32 pOPA,H'553175FF' 00204 LET8 pOPB,H'FD' 00205 UDIV32_8 pOPA,pOPB,pRES 00206 nop ;hányados = 0x563412, maradék = 0x35 00207 LET32 pOPA,H'C3785557' 00208 LET16 pOPB,H'ABCD' 00209 UDIV32_16 pOPA,pOPB,pRES 00210 nop ;hányados = 0x12345, maradék = 0x16 00211 LET32 pOPA,H'14B60416' 00212 LET32 pOPB,H'12345' 00213 UDIV32_32 pOPA,pOPB,pRES 00214 nop ;hányados = 0x1234, maradék = 0x12 00215 goto $ 00216 end