Write a program which collects in data samples from a port at 1 ms interval. The upper 4 bits collected data same as mastered and stored in an array in successive locations.
; REGISTERS: Uses CS, SS, DS, AX, BX, CX, DX, SI, SP
; PROCEDURES: Uses WAIT
DATA_SEG SEGMENT
PRESSURE DW 100 DUP (0); Set up array of 100 words
NBR_OF_SAMPLES EQU 100
PRESSURE_PORT EQU 0FFF8h ; hypothetical input port
DATA_SEG ENDS
STACK_SEG SEGMENT STACK
DW 40 DUP (0) ; set stack of 40 words
STACK_TOP LABEL WORD
STACK_SEG ENDS
CODE_SEG SEGMENT
ASSUME CS: CODE_SEG, DS: DATA_SEG, SS: STACK_SEG
START: MOV AX, DATA_SEG; Initialise data segment register
MOV DS, AX
MOV AX, STACK_SEG ; Initialise stack segment register
MOV SS, AX
MOV SP, OFFSET STACK - TOP ; initialise stack pointer top of
; stack
LEA SI, PRESSURE; SI points to start of array
; PRESSURE
MOV BX, NBR_OF_SAMPLES ; Load BX with number
; Of samples
MOV DX, PRESSURE_PORT ; Point DX at input port
; It can be any A/D converter or
; Data port.
READ_NEXT: IN AX, DX ; Read data from port
; Please note use of IN instruction
AND AX, 0FFFH; Mask upper 4 bits of AX
MOV [SI], AX ; Store data word in array
CALL WAIT ; call procedures wait for delay
INC SI; Increment SI by two as dealing with
INC SI; 16 bit words and not bytes
DEC BX; Decrement sample counter
JNZ READ_NEXT ; Repeat till 100
; Samples are collected
STOP: NOP
WAIT PROC NEAR
MOV CX, 2000H ; Load delay value
; Into CX
HERE: LOOP HERE ; Loop until CX = 0
RET
WAIT ENDP
CODE_SEG ENDS
END
Discussion:
Please consider that CALL to the procedure as above doesn't specify whether the call is to a FAR procedure or a NEAR procedure. This distinction is made at the time of defining the procedure.
The procedure above can be converted in a FAR procedure by changing the definition of procedure as below:
WAIT PROC FAR
.
.
WAIT ENDS
The procedure can now be statedin another segment if the need to be, in same assembly language file.