Write 80387 ALP to plot Sine Wave, Cosine Wave and Sinc function. Access video memory directly for plotting

Second Year Computer Engineering Microprocessor Programs:

Microprocessor Lab:

Practical 11:

             Write 80387 ALP to plot Sine Wave, Cosine Wave and Sinc function. Access video memory directly for plotting

This program is performed using TASM on windows operating system.

----------------------------------------------------------------------------------------------------------------------------------
;sin.asm


;Y=100-60 sin((pi/180)*x)
;Bit    7  6  5  4  3  2  1  0
;Data   R  R  R  G  G  G  B  B

.387
.model small

.stack 100

.data
msg db 10,13,'this is Sine wave$'
one_eighty dw 180
scale dw 30
hundred dw 100
rint dw 0
x dw 0

.code
main: 
mov ax,@data            ; Initialize DS (needed for .exe-program)
    mov ds, ax
    mov ax, 0A000h         ; Segment to video memory
    mov es, ax

    mov ax, 13h             ;Standard video graphics mode
    int 10h                 ; switch to 320x200 mode

    mov cx, 0

    l1:
    push cx                 ; store CX
    call get_sine
    
    mov bx, cx
    call vector_to_memory

    mov di, ax
    mov al, 03h            ; color
    mov [es:di], al         ; put pixel
    pop cx                  ; restore CX
    inc cx                  ; CX = CX + 1
    cmp cx, 320             ; right boarder reached?
    jne l1                 ; no, next degree

mov ah,09h                      ; display message
lea dx,msg
int 21h

    xor ah, ah
    int 16h                 ; keyboard (wait for key)
    mov ax, 3
    int 10h                 ; go to text mode
    mov ax, 4C00h
    int 21h                 ; return to DOS, exit code 0

get_sine:                   ; Args: CX = angle (degree!)
    mov word[x],cx
    fldpi                   ; ST(0)=Pi, ST(1)=CX
    fimul word[x]            ; ST(0)=Pi*CX
    
    fidiv word[one_eighty] ; ST(0)=(Pi*CX)/180(degree to rad)
    fsin                    ; ST(0)=sine (rad)
    fimul word[scale]      ; ST(0)=sine*scale
    fild hundred
    fsub st,st(1)    ;ST(0)=100-60*SIN((Pi*CX)/180)
    fist word [rint]       ; store integer with rounding 
    mov ax, word[rint]     ; AX = Y
    ret                     ; Return: AX = Y (signed!)

vector_to_memory:           ; Calculate offset=Y*320+X 
;Args: BX = X, AX = Y
    push dx                 ; mul changes dx too
    mov cx, 320             ; video mode width 
    mul cx                  ; DX:AX = AX * CX
    add ax, bx              ; left indentation
    pop dx
    ret                     ; Return: AX = offset in memory

end   main
----------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------
;cos.asm
;Y=100-60 cos((pi/180)*x)
;Bit    7  6  5  4  3  2  1  0
;Data   R  R  R  G  G  G  B  B

.387
.model small

.stack 100

.data
msg db 10,13,'this is COS wave$'
one_eighty dw 180
scale dw 30
hundred dw 100
rint dw 0
x dw 0

.code
main: 
mov ax,@data            ; Initialize DS (needed for .exe-program)
    mov ds, ax
    mov ax, 0A000h         ; Segment to video memory
    mov es, ax

    mov ax, 13h             ;Standard video graphics mode
    int 10h                 ; switch to 320x200 mode

    mov cx,0

    l1:
    push cx                 ; store CX
    call get_cos
    
    mov bx, cx
    call vector_to_memory
    mov di, ax
    mov al, 03h            ; color
    mov [es:di], al         ; put pixel
    pop cx                  ; restore CX
    inc cx                  ; CX = CX + 1
    cmp cx, 320             ; right boarder reached?
    jne l1                 ; no, next degree

mov ah,09h                      ; display message
lea dx,msg
int 21h

    xor ah, ah
    int 16h                 ; keyboard (wait for key)
    mov ax, 3
    int 10h                 ; go to text mode
    mov ax, 4C00h
    int 21h                 ; return to DOS, exit code 0

get_cos:                   ; Args: CX = angle (degree!)
    mov word[x],cx
    fldpi                   ; ST(0)=Pi, ST(1)=CX
    fimul word[x]            ; ST(0)=Pi*CX
    
    fidiv word[one_eighty] ; ST(0)=(Pi*CX)/180(degree to rad)
    fcos                    ; ST(0)=sine (rad)
    fimul word[scale]      ; ST(0)=sine*scale
    fild hundred
    fsub st,st(1)    ;ST(0)=100-60*SIN((Pi*CX)/180)
    fist word [rint]       ; store integer with rounding 
    mov ax, word[rint]     ; AX = Y
    ret                     ; Return: AX = Y (signed!)

vector_to_memory:           ; Calculate offset=Y*320+X 
;Args: BX = X, AX = Y
    push dx                 ; mul changes dx too
    mov cx, 320             ; video mode width 
    mul cx                  ; DX:AX = AX * CX
    add ax, bx              ; left indentation
    pop dx
    ret                     ; Return: AX = offset in memory

end   main
;---------------------------------------------------------------------------------------------------------------------------------

;Each file can be executed independently on tasm:

;commands:
;tasm sin.asm
;tlink sin.obj

;sin

Comments

Post a Comment

Popular posts from this blog

Write C++ program to maintain club member‘s information using singly linked list. Store student PRN and Name.

Implement C++ program for expression conversion as infix to postfix and its evaluation using stack.

Write C++ program for simulating job queue. Write functions to add job and delete job from queue.