CS401 Assignment No. 3 Spring 2012 solution

Question:

DC motor (fig 1) is operated through two terminals, whenever the potential difference is created (through batteries, cells etc) across these terminals the motor starts its motion.

Suppose we have connected a DC motor to our system’s parallel port through a secure circuitry (fig 3).

We wish to operate the DC motor through our parallel port (fig 2) using some input through our keyboard. Like “F” key for running motor in “Forward Direction”, “R” for “Reverse Direction”, “S” for “Stop” and “E” for “Exit from code”.

We have suggested that we will use parallel port’s Pin 2 and Pin 3 (the last 2 pins of parallel port’s data check fig 2 and table 1).

Pin 2 Pin 3 Outcome
0 0 Stop
0 1 Forward
1 0 Reverse
1 1 No Operation

Table 1

You have to write a code in assembly language that take an input character from keyboard (S, F, R and E) and on the basis of these characters transmit the code (with respect to the truth table) to the parallel port to operate that connected DC motor.

NOTE: your code only use ASCII code for Capital letters F, R, S and E as an input from the keyboard and will transmit the specific data to the parallel port. Through this program, we are interested in communicating with a DC motor through parallel port.

Solution:

; show scancode on external LEDs connected through parallel port
[org 0x0100]
jmp  start

oldisr:       dd   0                  ; space for saving old ISR

; keyboard interrupt service routine
kbisr:        push ax
push dx

in   al, 0x60           ; read char from keyboard port
mov  dx, 0x378
out  dx, al             ; write char to parallel port

pop  ax
pop  dx
jmp  far [cs:oldisr]    ; call original ISR

start:        xor  ax, ax
mov  es, ax             ; point es to IVT base
mov  ax, [es:9*4]
mov  [oldisr], ax       ; save offset of old routine
mov  ax, [es:9*4+2]
mov  [oldisr+2], ax     ; save segment of old routine
cli                     ; disable interrupts
mov  word [es:9*4], kbisr ; store offset at n*4
mov  [es:9*4+2], cs     ; store segment at n*4+2
sti                     ; enable interrupts

mov  dx, start          ; end of resident portion
add  dx, 15             ; round up to next para

and keyboard comprisan code for this problems are

e = 0x012

r= 0x13

f= 0x21

s=0x1f

 

DOWNLOAD SOLUTION HERE
loading...