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