00001 ;------------------------------------------------------
00002 ; PICCOLO project
00003 ; Copyright (c) 2009-2010 Istvan Cserny (cserny@atomki.hu)
00004 ; A programhoz Karl Lunt FOR-NEXT makróit adaptáltuk
00005 ; Forrás: "A High-Power PIC Macro Library" by Karl Lunt,
00006 ; Nuts & Volts Magazine, July 1999
00007 ;------------------------------------------------------
00008 #include "..\include\p18_all.inc"
00009 ;------------------------------------------------------
00010 ; Helyfoglalás a változók számára
00011 ;------------------------------------------------------
00012 mydata UDATA_ACS
00013 i res 1 ;ciklusváltozó
00014 j res 1 ;ciklusváltozó
00015 a res 2 ;16 bites eredmény
00016
00017 variable _for_cnt=0
00018 variable _nxt_cnt=0
00019
00020 ;------------------------------------------------------
00021 ; FOR (a FOR-NEXT ciklus fejrésze)
00022 ;
00023 ; Szintaxis:
00024 ; FOR var,kezd,veg
00025 ;
00026 ; A FOR makró egy FOR-NEXT ciklust indít.
00027 ; A paraméterek:
00028 ; var: a ciklusváltó (8-bites RAM változó)
00029 ; kezd: számkonstans, a ciklusváltozó kezdeti értéke
00030 ; veg: számkonstans, a ciklusváltozó végső értéke
00031 ;------------------------------------------------------
00032 FOR macro var,kezd,veg
00033 movlw kezd
00034 movwf var
00035 _for#v(_for_cnt):
00036 movf var,W
00037 sublw veg
00038 bnc _next#v(_for_cnt)
00039 _for_cnt set _for_cnt+1
00040 _nxt_cnt set _for_cnt
00041 endm
00042 ;------------------------------------------------------
00043 ; NEXT (a FOR-NEXT ciklus vége)
00044 ;
00045 ; Szintaxis:
00046 ; NEXT var
00047 ;
00048 ; A NEXT macro lezárja a FOR-NEXT ciklust.
00049 ; A paraméterek:
00050 ; var: a ciklusváltó (8-bites RAM változó)
00051 ;
00052 ; A NEXT blokkban a var változó értéke inkrementálódik,
00053 ; azután a vezérlés visszakerül a FOR ciklus elejére,
00054 ; a változó teszteléséhez.
00055 ; Fontos, hogy a paraméterként megadott ciklusváltozó
00056 ; egyezzen meg a FOR makró ciklusváltozójának nevével!
00057 ;------------------------------------------------------
00058 NEXT macro var
00059 _nxt_cnt set _nxt_cnt-1
00060 incf var,f
00061 bra _for#v(_nxt_cnt)
00062 _next#v(_nxt_cnt):
00063 endm
00064
00065 PGM CODE
00066 ;--- A főprogram kötelezően a main címkénél kezdődik!-
00067 main:
00068 ;------------------------------------------------------
00069 ; Számok négyzetének kiszámítása (90-110 közötti számokra)
00070 ; egyszerű FOR-NEXT ciklus felhasználásával
00071 ;------------------------------------------------------
00072 FOR i,D'90',D'110' ;for ciklus szervezése
00073 movf i,W
00074 mulwf i ; i*i kiszámolása
00075 movff PRODL,a ; az eredmény eltárolása
00076 movff PRODH,a+1
00077 NEXT i ;ciklus vége
00078 ;------------------------------------------------------
00079 ; Szorzótábla kiszámítása (1x1 - től 10x10-ig)
00080 ; egymásba ágyazott FOR-NEXT ciklusok segítségével
00081 ;------------------------------------------------------
00082 FOR i,1,D'10'
00083 FOR j,1,D'10'
00084 movf i,W
00085 mulwf j ; i*j kiszámítása
00086 movff PRODL,a
00087 movff PRODH,a+1
00088 NEXT j
00089 NEXT i
00090 goto $
00091 end