;compiled by SIMPLE version 2.02 ;rem Simple code to make a PIC12F675 blink GP0 on and off ;rem but only if it correctly computes other stuff first (11/13/12) ;this text passed as-is to assembly file ;rem assembler-specific directives list p=12f675 radix dec include __CONFIG _WDT_OFF & _MCLRE_OFF & _PWRTE_ON & _CP_OFF & _CPD_OFF & _INTRC_OSC_NOCLKOUT errorlevel -302 ;suppress gpasm messages about not being in bank 0 #define hiregs STATUS,RP0 ;for banking #define pindirs 00000000B ;all outputs #define outpin GPIO,0 ;output pin #define ConstA 11 ;delay constants #define ConstB 86 #define ConstC 166 CounterA EQU 0x28 ;for timing delay CounterB EQU 0x29 CounterC EQU 0x2A GOTO start ;jump to actual start ORG 8 start ;start of program code ;GPIO = 0 CLRF GPIO ;INTCON = 0 CLRF INTCON ;ADCON0 = 0 CLRF ADCON0 ;T1CON = 0 CLRF T1CON ;CMCON = 7 MOVLW 7 MOVWF CMCON ;bitset hiregs BSF hiregs ;ANSEL = 0 CLRF ANSEL ;PIE1 = 0 CLRF PIE1 ;WPU = 0 CLRF WPU ;IOC = 0 CLRF IOC ;OPTION_REG = 11001101B MOVLW 11001101B MOVWF OPTION_REG ;TRISIO = #pindirs MOVLW pindirs MOVWF TRISIO ;bitclear hiregs BCF hiregs ;rem validate stuff ;rem goto hang if error VarA EQU 0x2B VarB EQU 0x2C VarC EQU 0x2D ;VarA = 10 MOVLW 10 MOVWF VarA ;VarB = 5 MOVLW 5 MOVWF VarB ;VarC = VarA + VarB MOVF VarA,0 MOVWF VarC MOVF VarB,0 ADDWF VarC,1 ;VarC = VarC + VarA MOVF VarA,0 ADDWF VarC,1 ;if VarC <> 25 goto hang MOVLW 25 SUBWF VarC,0 BTFSS 3,2 GOTO hang ;if VarC < 25 goto hang MOVLW 25 SUBWF VarC,0 BTFSS 3,0 GOTO hang ;if VarC > 25 goto hang MOVLW 25^0xFF ADDWF VarC,0 BTFSC 3,0 GOTO hang ;if VarC = VarA goto hang MOVF VarA,0 SUBWF VarC,0 BTFSC 3,2 GOTO hang ;if VarC <= VarA goto hang MOVF VarC,0 SUBWF VarA,0 BTFSC 3,0 GOTO hang ;if VarA >= VarC goto hang MOVF VarC,0 SUBWF VarA,0 BTFSC 3,0 GOTO hang ;if VarC = 25 then MOVLW 25 SUBWF VarC,0 BTFSS 3,2 GOTO ifnext__10 ; if VarC >= 25 then MOVLW 25 SUBWF VarC,0 BTFSS 3,0 GOTO ifnext__20 ; if VarC <= 25 then MOVLW 25^0xFF ADDWF VarC,0 BTFSC 3,0 GOTO ifnext__30 ; increment VarA INCF VarA,1 ; if VarA >= 10 then MOVLW 10 SUBWF VarA,0 BTFSS 3,0 GOTO ifnext__40 ; VarA = VarA - 2 MOVLW 2 SUBWF VarA,1 ; if VarA <= 8 then MOVLW 8^0xFF ADDWF VarA,0 BTFSC 3,0 GOTO ifnext__50 GOTO hang ; else GOTO ifend__50 ifnext__50 ; decrement VarA DECF VarA,1 ; VarA = VarA + 1 INCF VarA,1 ; VarA = VarA - 1 DECF VarA,1 ; if VarA = 8 goto domorecomp MOVLW 8 SUBWF VarA,0 BTFSC 3,2 GOTO domorecomp ; endif ifend__50 ; endif ifnext__40 ; endif ifnext__30 ; endif ifnext__20 ;endif ifnext__10 GOTO hang domorecomp ;VarA = 10 MOVLW 10 MOVWF VarA ;VarB = 11 MOVLW 11 MOVWF VarB ;if VarA >= 10 then MOVLW 10 SUBWF VarA,0 BTFSS 3,0 GOTO ifnext__11 ; if VarB <= 11 then MOVLW 11^0xFF ADDWF VarB,0 BTFSC 3,0 GOTO ifnext__21 ; if VarA > 9 then MOVLW 9^0xFF ADDWF VarA,0 BTFSS 3,0 GOTO ifnext__31 ; if VarB < 12 then MOVLW 12 SUBWF VarB,0 BTFSC 3,0 GOTO ifnext__41 ; if VarA < VarB then MOVF VarB,0 SUBWF VarA,0 BTFSC 3,0 GOTO ifnext__51 ; if VarB > VarA then MOVF VarB,0 SUBWF VarA,0 BTFSC 3,0 GOTO ifnext__60 GOTO compok ; endif ifnext__60 ; endif ifnext__51 ; endif ifnext__41 ; endif ifnext__31 ; endif ifnext__21 ;endif ifnext__11 GOTO hang compok ;array ArrayD(6) ArrayD EQU 0x2E ;ArrayD(0) = 0 ;note array elements start at 0 MOVLW ArrayD MOVWF 4 MOVLW 0 ADDWF 4,1 MOVLW 0 MOVWF 0 ;ArrayD(1) = 2 MOVLW ArrayD MOVWF 4 MOVLW 1 ADDWF 4,1 MOVLW 2 MOVWF 0 ;ArrayD(3) = 4 MOVLW ArrayD MOVWF 4 MOVLW 3 ADDWF 4,1 MOVLW 4 MOVWF 0 ;ArrayD(5) = 7 MOVLW ArrayD MOVWF 4 MOVLW 5 ADDWF 4,1 MOVLW 7 MOVWF 0 ;VarB = ArrayD(5) MOVLW ArrayD MOVWF 4 MOVLW 5 ADDWF 4,1 MOVF 0,0 MOVWF VarB ;if VarB <> 7 goto hang MOVLW 7 SUBWF VarB,0 BTFSS 3,2 GOTO hang ;VarB = ArrayD(1) MOVLW ArrayD MOVWF 4 MOVLW 1 ADDWF 4,1 MOVF 0,0 MOVWF VarB ;if VarB <> 2 goto hang MOVLW 2 SUBWF VarB,0 BTFSS 3,2 GOTO hang ;VarA = 3 MOVLW 3 MOVWF VarA ;VarB = ArrayD(VarA) MOVLW ArrayD MOVWF 4 MOVF VarA,0 ADDWF 4,1 MOVF 0,0 MOVWF VarB ;if VarB <> 4 goto hang MOVLW 4 SUBWF VarB,0 BTFSS 3,2 GOTO hang ;VarA = 0 CLRF VarA ;VarB = ArrayD(VarA) MOVLW ArrayD MOVWF 4 MOVF VarA,0 ADDWF 4,1 MOVF 0,0 MOVWF VarB ;if VarB <> 0 goto hang MOVLW 0 SUBWF VarB,0 BTFSS 3,2 GOTO hang ;rem test bit stuff Bits EQU 0x34 ;bitset Bits.0 BSF Bits,0 ;bitcopy Bits.1 = Bits.0 BTFSS Bits,0 BCF Bits,1 BTFSC Bits,0 BSF Bits,1 ;bitcopy Bits.2 = not Bits.1 BTFSC Bits,1 BCF Bits,2 BTFSS Bits,1 BSF Bits,2 ;if not Bits.0 goto hang BTFSS Bits,0 GOTO hang ;if not Bits.1 goto hang BTFSS Bits,1 GOTO hang ;if Bits.2 goto hang BTFSC Bits,2 GOTO hang ;if Bits.0 then BTFSS Bits,0 GOTO ifnext__12 ; if Bits.1 then BTFSS Bits,1 GOTO ifnext__22 ; if not Bits.2 then BTFSC Bits,2 GOTO ifnext__32 GOTO bitsok ; endif ifnext__32 ; endif ifnext__22 ;endif ifnext__12 GOTO hang bitsok ;rem test other stuff ;VarA = 10000001B MOVLW 10000001B MOVWF VarA ;shift VarA left BCF 3,0 RLF VarA,1 ;if VarA.1 then BTFSS VarA,1 GOTO ifnext__13 ; if not VarA.0 then BTFSC VarA,0 GOTO ifnext__23 ; if not VarA.7 then BTFSC VarA,7 GOTO ifnext__33 ; bitset VarA.7 BSF VarA,7 ; shift VarA right BCF 3,0 RRF VarA,1 ; if not VarA.7 then BTFSC VarA,7 GOTO ifnext__42 ; if VarA.6 then BTFSS VarA,6 GOTO ifnext__52 GOTO shiftok ; endif ifnext__52 ; endif ifnext__42 ; endif ifnext__33 ; endif ifnext__23 ;endif ifnext__13 GOTO hang shiftok ;VarA = 20 MOVLW 20 MOVWF VarA ;VarB = 3 MOVLW 3 MOVWF VarB ;VarA = VarA + 2 MOVLW 2 ADDWF VarA,1 ;VarA = VarA - VarB MOVF VarB,0 SUBWF VarA,1 ;if VarA <> 19 goto hang MOVLW 19 SUBWF VarA,0 BTFSS 3,2 GOTO hang ;VarA = #0xFF ;must use # for immediate MOVLW 0xFF MOVWF VarA ;VarA = not VarA COMF VarA,1 ;if VarA <> 0 goto hang MOVLW 0 SUBWF VarA,0 BTFSS 3,2 GOTO hang ;VarA = VarA or #00000101B MOVLW 00000101B IORWF VarA,1 ;if VarA <> #00000101B goto hang MOVLW 00000101B SUBWF VarA,0 BTFSS 3,2 GOTO hang ;VarA = VarA and #00000110B MOVLW 00000110B ANDWF VarA,1 ;if VarA <> #00000100B goto hang MOVLW 00000100B SUBWF VarA,0 BTFSS 3,2 GOTO hang ;VarA = VarA xor #11111111B MOVLW 11111111B XORWF VarA,1 ;if VarA <> #11111011B goto hang MOVLW 11111011B SUBWF VarA,0 BTFSS 3,2 GOTO hang blinkloop ;bitset outpin BSF outpin ;gosub delay CALL delay ;bitclear outpin BCF outpin ;gosub delay CALL delay GOTO blinkloop delay ;loop CounterC from #ConstC MOVLW ConstC MOVWF CounterC local__10 ; loop CounterB from #ConstB MOVLW ConstB MOVWF CounterB local__20 ; loop CounterA from #ConstA MOVLW ConstA MOVWF CounterA local__30 ; next CounterA DECFSZ CounterA,1 GOTO local__30 ; next CounterB DECFSZ CounterB,1 GOTO local__20 ;next CounterC DECFSZ CounterC,1 GOTO local__10 ;return RETLW 0 hang GOTO hang end