
;This code snippet generates a value "V" that runs from "V_INIT" to
;"V_END" in equal steps (V_INIT <= V_END). The number of steps is
;"STEPS" ("STEPS"=1...64). "V" appears at Port P1.
;The code isn't tested!


                $NOMOD51
                $INCLUDE (89s52.mcu)


                ERR_ADD         DATA    30H
                ERR_COMP        DATA    31H
                ERR_SUM         DATA    32H
                WIDTH           DATA    33H
                STEPS           DATA    34H
                V               DATA    35H
                V_INIT          DATA    36H
                V_END           DATA    37H


                ORG 0
            
                SJMP Start

                ORG 002BH

Start:          MOV A,STEPS
                MOV R7,A              ;Prepare Steps_loop
                MOV ERR_SUM,A         ;Initialize ERR_SUM
                RL A                  ;Calculate ERR_COMP
                MOV ERR_COMP,A

                MOV A,V_END           ;Calculate WIDTH:
                CLR C                 ;WIDTH = (V_END-V_INIT)/STEPS
                SUBB A,V_INIT
                MOV B,STEPS
                DIV AB
                MOV WIDTH,A
                MOV A,B               ;Calculate ERR_ADD by the help
                RL A                  ;of remainder
                MOV ERR_ADD,A

                MOV V,V_INIT          ;Initialize V
                MOV P1,V              ;Send V_INIT to P1

Steps_loop:     MOV A,V               ;Calculate new V:
                ADD A,WIDTH           ;V = V + WIDTH
                MOV V,A

                MOV A,ERR_SUM         ;Calculate new ERR_SUM
                ADD A,ERR_ADD
                CJNE A,ERR_COMP,Cont1 ;ERR_SUM >= ERR_COMP?
Cont1:          JC Cont2              ;No, so nothing to correct
                SUBB A,ERR_COMP       ;Yes, so increment V
                INC V                 ;and correct ERR_SUM
Cont2:          MOV ERR_SUM,A         ;Store the new ERR_SUM

                MOV P1,V              ;Send V to P1
                
                DJNZ R7,Steps_loop    ;Do all the steps 

                END                   ;End of code snippet
