NAME LAB3B ;***************************************************************************** ; 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 ; 8255 Control PORT_B_ADDR EQU 0FFFAH ;Port B address ; 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 LO10MSEC EQU 0B4H ;____________________________________ HI10MSEC EQU 05FH ;____________________________________ LO1SEC EQU 064H ;____________________________________ HI1SEC EQU 000H ;____________________________________ RESETCOUNT EQU 9 ; 8259A Setup ICW1_REG EQU 0000H ;ICW1 written here CW_REG EQU 0002H ;other ICW's written here ICW1 EQU 17H ;____________________________________ ICW2 EQU 20H ;____________________________________ ICW4 EQU 03H ;____________________________________ OCW1 EQU 0F8H ;____________________________________ ; 8279 Setup LED_ADDR EQU 090H ;____________________________________ LED_CNTR_REG EQU 0FFEAH ;Set the address value of the DATA_REG EQU 0FFE8H ; control and data register of ; the SDK-86 board. ;----------------------------------------------------------------------------- ; 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 IR2_IP_VECT DW ? ;NEW IR2_CS_VECT DW ? ;NEW 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 ;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,LO10MSEC ;____________________________________ OUT DX,AL MOV AL,HI10MSEC OUT DX,AL MOV DX,COUNT_CNTR ;____________________________________ MOV AL,MODE2 OUT DX,AL MOV DX,COUNT1 MOV AL,LO1SEC ;____________________________________ OUT DX,AL MOV AL,HI1SEC OUT DX,AL MOV DX,COUNT_CNTR ;NEW BLOCK TO INITIALIZE COUNTER2 MOV AL,MODE2A OUT DX,AL MOV DX,COUNT2 MOV AL,LOHALFSEC OUT DX,AL MOV AL,HIHALFSEC OUT DX,AL ;Intialize 8259A to :_______________________________________________________ ;____________________________________________________________________________ ;____________________________________________________________________________ MOV DX,ICW1_REG ;____________________________________ MOV AL,ICW1 OUT DX,AL MOV DX,CW_REG ;____________________________________ 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 ;............................................................................. ; PROCEDURE : DAC_UPDATE ; - This procedure will be called by the ISR0 routine to update the ; DAC_MEMORY to produce a saw-tooth waveform through the 8255 PIP. ;............................................................................. DAC_UPDATE PROC NEAR PUSH DX ;Save register to be used. PUSH AX MOV DX,PORT_B_ADDR ;Increased the step voltage to MOV AL,DAC_MEMORY ; DAC by 1 unit. OUT DX,AL INC DAC_MEMORY ;Store next value of voltage POP AX POP DX RET DAC_UPDATE ENDP ;.............................................................................. ; INTERRUPT SERVICE ROUTINE : ISR0 ; - This ISR will keep track of the time so is serviced every 10msec. ; When it is called, it calls the DAC_UPDATE procedure ; to output the sawtooth waveform (by incrementing the voltage). ;.............................................................................. ISR0 PROC NEAR CALL DAC_UPDATE ;Update the DAC output IRET ISR0 ENDP ;.............................................................................. ; INTERRUPT SERVICE ROUTINE : ISR1 ; - This ISR is serviced every 1 second, displaying a changing ; garbage symbol on the SDK display. ;.............................................................................. ISR1 PROC NEAR PUSH AX ;Save registers. PUSH DX MOV AL,LED_ADDR ;____________________________ MOV DX,LED_CNTR_REG ;Address of control register OUT DX,AL ;Load LED addr.-> control reg. MOV DX,DATA_REG ;Address for data register MOV AL,GARBAGE DISP: INC AL ;GARBAGE CHAR. OUT DX,AL ;Send to LED display MOV GARBAGE,AL POP DX ;Restore registers POP AX IRET ISR1 ENDP ;NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW ;********************************ISR2*************************************** ISR2 PROC NEAR IRET ISR2 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 IR2_IP_VECT,OFFSET ISR2 MOV AX,CS MOV IR0_CS_VECT,AX MOV IR1_CS_VECT,AX MOV IR2_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: NOP 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. ;---------------------------------------------------------------------------- ; Add the the LED DISPLAY TABLE HERE ;---------------------------------------------------------------------------- DATA_SEG ENDS END BEG ;****************************************************************************** ; E N D O F P R O G R A M ;******************************************************************************