Thursday 27 September 2012

CALLING ASSEMBLY DELAY ROUTINE FROM C SOURCE CODE

THIS POST IS ALL ABOUT HOW TO CALL AN ASSEMBLY ROUTINE FROM C SOURCE CODE

I PRESENT A EXAMPLE BELOW

THERE IS THREE FILES
1) DELAYS.ASM
2)DELAY_MAIN.C
3)DELAY_HEADER.H

DELAYS.ASM
------------------------------------------------------------------------------------------------------------

;;
;THIS IS A ASSEMBLY LANGUAGE ROUTINES WHICH GENERATING
; 1MILI SEC,500MILI SEC
;AND 1SEC ROUTINES.
;THIS ROUTINES CAN BE CALLED FROM C LANGUAGE USING BELOW FORMATS
;FOR 1 MILI SEC:: void delay_1_ms(void);
;FOR 500 MILI SEC:: void delay_500_ms(void);
;FOR 1 SEC:: void delay_1_sec(void);
;FILE NAME:DELAYS.ASM
;AUTHOR::RAJESH KUMAR SAHOO
;SKYPE ID:rajesh6115
;face book:www.facebook.com/rajesh6115
;                                  ;                                  ;


?PR?del_seg SEGMENT CODE
    PUBLIC delay_1_ms
    PUBLIC delay_500_ms
    PUBLIC delay_1_sec
    RSEG ?PR?del_seg
delay_1_ms:
    MOV R7,#250
    DJNZ R7,$
    MOV R7,#247
    DJNZ R7,$
    RET
delay_500_ms:
    MOV R6,#250
L1_500:
    ACALL delay_1_ms
    DJNZ R6,L1_500
   
    MOV R6,#248
L2_500:
    ACALL delay_1_ms
    DJNZ R6,L2_500
    MOV R6,#250
    DJNZ R6,$
    MOV R6,#247
    DJNZ R6,$
    NOP
    NOP
    RET
delay_1_sec:
    MOV R5,#8
LO_SEC:
    MOV R6,#124
LI_SEC:
    ACALL delay_1_ms
    DJNZ R6,LI_SEC
    DJNZ R5,LO_SEC
    MOV R5,#5
L_SEC:   
    ACALL delay_1_ms
    DJNZ R5,L_SEC
    MOV R5,#250
    DJNZ R5,$
    MOV R5,#237
    DJNZ R5,$
    RET
    END
  

---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
DELAY_MAIN.C
---------------------------------------------------------------------------------------------------------------
/**
*THIS IS A C SOURCE CODE FROM WHERE ASSEMBLY ROUTINES ARE CALLED
*FILE NAME: DELAY_MAIN.C
*
*/
#include <reg51.h>
#include "delays_header.h"
void main()
{
    delay_1_sec();
    delay_500_ms();
    delay_1_ms();

    delay_1_sec();
}




---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
DELAY_HEADER.H
---------------------------------------------------------------------------------------------------------------

#ifndef _delay_h_
#define _delay_h_

void delay_1_ms(void);
void delay_500_ms(void);
void delay_1_sec(void);

#endif



---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
THE HOLE EXAMPLE PROJECT YOU CAN DOWNLOAD FROM HERE
DOWNLOAD HERE

USING OF DELAY IN A ASSEMBLY PROGRAM


;;
;THIS PROGRAM CALL DELAY ROUTINES AVAILABLE IN
; DELAY.ASM FILE(SEE PREVIOUS POST)
;
;FILE NAME: DELAY_DEMO.ASM
;DELAY.ASM FILE MUST PRESENT IN THE PROJECT FOLDER
;                      ;                            ;


$INCLUDE(delay1ms.asm)
CSEG AT 0H
MAIN:
ACALL DELAY1MS
SJMP $
END


DELAY GENERATION USING ASSEMBLY INSTRUCTIONS


;THIS IS AN ASSEMBLY LANGUAGE PROGRAM FOR GENERATION OF DELAY
;FILE NAME : DELAY.ASM
;COMPILED WITH KEIL IDE
;CRYSTAL:12MHZ USED
;THIS FILE USED WHEN EVER DELAY REQUIRED
;JUST YOU HAVE TO INCLUDE THIS FILE TO YOUR SOURCE PROGRAM
;                    ;                    ;
;ALL DELAYS ROUTINES HERE
DELAY_SEG SEGMENT CODE
RSEG DELAY_SEG
;DELAY OF 1MS SUBROUTINE
DELAY1MS:
MOV R7,#250
DJNZ R7,$
MOV R7,#247
DJNZ R7,$
RET
;DELAY OF 100MS SUBROUTINE
DELAY100MS:
MOV R6,#99;1MUS
L1:
ACALL DELAY1MS ;99MS
DJNZ R6,L1;198MUS
MOV R6,#250;1MUS
DJNZ R6,$;500US
MOV R6,#147;1US
DJNZ R6,$;294US
NOP
RET;1US
;DELAY 0F 1SEC SUB ROUTINE
DELAY1S:
MOV R5,#9
L2:
ACALL DELAY100MS
DJNZ R5,L2
MOV R5,#99
L3:
ACALL DELAY1MS
DJNZ R5,L3
MOV R5,#250
DJNZ R5,$
MOV R5,#138
DJNZ R5,$
RET

Saturday 8 September 2012

QUEUE IMPLEMENTED USING ARRAY IN C


/**
 *THIS PROGRAM IS A REPRESENTATION OF QUEUE IMPLEMENTATION.
 *HERE AN ARRAY USED TO RE-PRESENT A QUEUE
 *AND BASIC QUEUE OPERATION ARE DESCRIBED USING SOME BASIC FUNCTION
 *MENU DRIVEN FOR BETTER UNDERSTANDING
 *
 *
 *FILE NAME :queue_using_array.c
 *DATE      :08/09/2012
 *PROGMMER  :RAJESH KUMAR SAHOO.
 *BOLOG     :http://dsforeverystudent.blogspot.in/
 */

/*
   header files for function prototypes of inbuild library functions
 */

/*Program for queue using array*/
/*headers for avoid compile error and warnings*/
#include <stdio.h>
#include <stdlib.h>
/*macros used for easy modification*/
#define QUE_SIZE 10
#define INVALID -1
#define BEG 0
/*function prototypes*/
void init(void);
int menu(void);
void enque(int ele);
int deque(void);
void print(void);

/*global datas*/
int QUEUE[QUE_SIZE];
int end;
/*INITIALIZE THE QUEUE FOR OPERATION(CLEARING THE CONTENTS)*/
void init()
{
        end=INVALID;
        int i;
        for(i=0;i<QUE_SIZE;i++)
                QUEUE[i]=INVALID;
}

/*THIS FUNCTION IS USED FOR ENQUE AN ELEMENT(INSERT TO QUEUE)*/
void enque(int ele)
{
        if(end>=QUE_SIZE-1)
        {
                printf("\nQUEUE IS ALREDY FILLED\n");
                return;
        }
        ++end;
        QUEUE[end]=ele;
        printf("\n%d ENQUE TO THE QUEUE\n",ele);
}

/*THIS FUNCTION USED FOR DE-QUE OPERATION(PROCESS/REMOVE AN ELEMENT FROM QUEUE)*/
int deque(void)
{
        int ele,i;
        ele=INVALID;
        if(end==INVALID)
        {
                printf("\nQUEUE IS EMPTY\n");
                return ele;
        }
        ele=QUEUE[BEG];
        for(i=1;i<=end;i++)
        {
                QUEUE[i-1]=QUEUE[i];
        }
        --end;
        //printf("\n%d IS DEQUQ FROM QUEUE\n",ele);
        return ele;
}

/*THIS FUNCTION USED TO PRINT THE QUEUE ELEMENTS FOR VERIFICATION*/
void print(void)
{
        int i;
        if(end==INVALID)
        {
                printf("\nQUEUE IS EMPTY\n");
                return;
        }
        else
                printf("\n:::::::::::QUEUE:::::::::\n|BEG|");

        for(i=BEG;i<=end;i++)
        {
                if(i==end)
                        printf("%d|END|",QUEUE[i]);
                else
                        printf("%d<-",QUEUE[i]);
        }
}

/*MAIN FUNCTION TO CONTROL THE FLOW OF PROGRAM*/
int main()
{
        int choice,ele;
        init();
        while(1)
        {
                choice=menu();
                switch(choice)
                {
                        case 1:printf("\nEnter a number for enqueue: ");
                               scanf("%d",&ele);enque(ele);break;
                        case 2:ele=deque();
                               if(ele!=INVALID)
                                       printf("\n%d IS DEQUQ FROM QUEUE\n",ele);break;
                        case 3:print();break;
                        case 4:exit(0);break;
                        default:
                               printf("\nINVALID CHOICE\nTRY AGAIN.....\n");break;
                }
        }
}

/*THIS FUNCTION USED TO DISPLAY MENU IN THE OUTPUT DEVICE AND GETTING USER CHOICE*/
int menu()
{
        int choice;
        printf("\n:::::::::::MENU::::::::::::\n");
        printf("\n1.ENQUE\n2.DEQUE\n3.PRINT\n4.EXIT\n");
        printf("\nENTER YOUR CHOICE: ");
        scanf("%d",&choice);
        return choice;
}