NAME LAB3A ;***************************************************************************** ; B E G I N N I N G O F P R O G R A M ;***************************************************************************** ;----------------------------------------------------------------------------- ; E Q U A T E S ;----------------------------------------------------------------------------- ; 8255 Setup CNTR_8255 EQU 0FFFEH ;Port control address OUTPUT_MODE EQU 0B5H ;Set up mode for port B output ; 8253 Setup COUNT_CNTR EQU 000EH ;counter control register address MODE2 EQU 74H ;__________________________________ MODE3 EQU 36H ;__________________________________ COUNT0 EQU 0008H ;counter0 address COUNT1 EQU 000AH ;counter1 address LOPT1MSEC EQU 0F5H ;__________________________________ HIPT1MSEC EQU 00H ;__________________________________ LOPT2MSEC EQU 02H ;__________________________________ HIPT2MSEC EQU 00H ;__________________________________ ; 8259A Setup CLR_A0 EQU 0000H ;ICW1,OCW2 written here SET_A0 EQU 0002H ;other ICW's and OCW's written here ICW1 EQU 17H ;__________________________________ ICW2 EQU 20H ;__________________________________ ICW4 EQU 03H ;__________________________________ OCW1 EQU 0FCH ;__________________________________ ;----------------------------------------------------------------------------- ; S T A R T O F V E C T O R S E G M E N T ;----------------------------------------------------------------------------- VECTOR_SEG SEGMENT ORG 00080H ;Interrupt vector: type 32 dec. IR0_IP_VECT DW ? ;Low contains IP of ISR0 IR0_CS_VECT DW ? ;High contains CS of ISR0 IR1_IP_VECT DW ? ;Low contains IP of ISR1 IR1_CS_VECT DW ? ;High contains CS of ISR1 VECTOR_SEG ENDS ;----------------------------------------------------------------------------- ; S T A R T O F C O D E S E G M E N T ;----------------------------------------------------------------------------- CODE_SEG SEGMENT ASSUME CS:CODE_SEG, DS:DATA_SEG ORG 00100H ;.............................................................................. ; PROCEDURE : INIT ; ; - This procedure is called from the main program to initialize the ; 8253, the 8259A and the 8255. ;.............................................................................. INIT PROC NEAR ASSUME DS:DATA_SEG ;offset relative to data_seg ;Initialize the 8255 to set port B as output to DAC. MOV DX,CNTR_8255 ; Port control address MOV AL,OUTPUT_MODE ; Set up mode for port B output OUT DX,AL ;Initialize 8253 counter0 and counter1 - counter2 is not used. ;Clock is the peripheral clock with frequency assumed to be 2.45MHz ;____________________________________________________________________________ ;____________________________________________________________________________ ;____________________________________________________________________________ MOV DX,COUNT_CNTR ;____________________________________ MOV AL,MODE3 OUT DX,AL MOV DX,COUNT0 MOV AL,LOPT1MSEC ;____________________________________ OUT DX,AL MOV AL,HIPT1MSEC OUT DX,AL MOV DX,COUNT_CNTR ;____________________________________ MOV AL,MODE2 OUT DX,AL MOV DX,COUNT1 MOV AL,LOPT2MSEC ;____________________________________ OUT DX,AL MOV AL,HIPT2MSEC OUT DX,AL ;Initialize 8259A to : _____________________________________________________ ;___________________________________________________________________________ ;___________________________________________________________________________ ;___________________________________________________________________________ ;___________________________________________________________________________ MOV DX,CLR_A0 ;___________________________________ MOV AL,ICW1 OUT DX,AL MOV DX,SET_A0 ;___________________________________ MOV AL,ICW2 OUT DX,AL MOV AL,ICW4 ;___________________________________ OUT DX,AL MOV AL,OCW1 ;___________________________________ OUT DX,AL ;Initialization complete, interrupts still disabled. RET INIT ENDP ;.............................................................................. ; INTERRUPT SERVICE ROUTINE : ISR0 ;.............................................................................. ISR0 PROC NEAR IRET ISR0 ENDP ;.............................................................................. ; INTERRUPT SERVICE ROUTINE : ISR1 ;.............................................................................. ISR1 PROC NEAR IRET ISR1 ENDP ;.............................................................................. ; S T A R T O F M A I N P R O G R A M ;.............................................................................. ASSUME DS:VECTOR_SEG ;offset relative to vector_seg ;Set up the interrupt vectors. BEG: CLI ;Ensure no interrupt occurs. MOV AX,VECTOR_SEG ;DS = vector_seg MOV DS,AX MOV IR0_IP_VECT,OFFSET ISR0 ;load all ISR's IP and CS MOV IR1_IP_VECT,OFFSET ISR1 MOV AX,CS MOV IR0_CS_VECT,AX MOV IR1_CS_VECT,AX ASSUME DS:DATA_SEG ;offset relative to data_seg MOV AX,DATA_SEG ;Define data segment MOV DS,AX CALL INIT ;Initialization STI ;Enable the interrupt now. LOOP1: JMP LOOP1 CODE_SEG ENDS ;---------------------------------------------------------------------------- ; S T A R T O F D A T A S E G M E N T ;---------------------------------------------------------------------------- DATA_SEG SEGMENT DAC_MEMORY DB 0 ;Store the current DAC value GARBAGE DB 0 ;Store the garbage character. DATA_SEG ENDS END BEG ;****************************************************************************** ; E N D O F P R O G R A M ;******************************************************************************